From patchwork Sat May 1 15:05:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 1472637 X-Patchwork-Delegate: lokeshvutla@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=libero.it header.i=@libero.it header.a=rsa-sha256 header.s=s2021 header.b=F/4RsSf8; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FXXdR40P0z9sWD for ; Sun, 2 May 2021 01:06:51 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 15F4A82AB1; Sat, 1 May 2021 17:06:05 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=libero.it Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=libero.it header.i=@libero.it header.b="F/4RsSf8"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 91F2082A85; Sat, 1 May 2021 17:05:54 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,FREEMAIL_FROM, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from libero.it (smtp-35-i2.italiaonline.it [213.209.12.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 43F1F80C68 for ; Sat, 1 May 2021 17:05:39 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none) header.from=libero.it Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=dariobin@libero.it Received: from passgat-Modern-14-A10M.homenet.telecomitalia.it ([95.244.94.151]) by smtp-35.iol.local with ESMTPA id crBQljCg9pK9wcrBalDmIU; Sat, 01 May 2021 17:05:38 +0200 x-libjamoibt: 1601 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=libero.it; s=s2021; t=1619881538; bh=GPxoumXKfia5ZZSoIQ1feEhvXEfZAtzEun046gF/pDE=; h=From; b=F/4RsSf8qsseGhrUtPoV0MVVeeECHELK5AKJGxH39EaURB8O1oNKTeD/JH49EZSkj Ps9fPcsXX1SjQSd1GqHFYE2x4MF3fAiMvQ06NTe0+aPOrMIZR5FPNGY9H8/v92mr1F 6UCYP+ZQ8KH840Zx8HVpv+mqnKNOBSo7W1NFO0CptvKP+QuIYANSYi5SvAy80llTsA jPB72HS7eJ9r0oX8Oq9jxMNpzBgS1SPo9Cw4YhyCB4BxYWZxz6XE9A6SHKrqBUmjT5 gJFS8j1iyyacZI3S+dqhma//Z5Xw1o9eAoJje4MuyFD4vSqQLmKSdVTSqilm95FgMu K/2CrtnGj7juw== X-CNFS-Analysis: v=2.4 cv=A9ipg4aG c=1 sm=1 tr=0 ts=608d6e42 cx=a_exe a=ugxisoNCKEotYwafST++Mw==:117 a=ugxisoNCKEotYwafST++Mw==:17 a=voM4FWlXAAAA:8 a=pGLkceISAAAA:8 a=VwQbUJbxAAAA:8 a=theEN1TeAfiqC9uWoWgA:9 a=5woP1VnxTCQrZG9E:21 a=0lbJSrGbwc3WATB0:21 a=IC2XNlieTeVoXbcui8wp:22 a=AjGcO6oz07-iQ99wixmX:22 a=pHzHmUro8NiASowvMSCR:22 a=n87TN5wuljxrRezIQYnT:22 From: Dario Binacchi To: Bin Meng , Simon Glass , Tom Rini , Tero Kristo Cc: Dario Binacchi , Claudiu Manoil , Etienne Carriere , Heinrich Schuchardt , Jean-Jacques Hiblot , Ovidiu Panait , Philippe Reynes , Sean Anderson , Wolfgang Wallner , u-boot@lists.denx.de Subject: [PATCH v2 5/5] Revert "fdt: translate address if #size-cells = <0>" Date: Sat, 1 May 2021 17:05:26 +0200 Message-Id: <20210501150527.10273-6-dariobin@libero.it> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210501150527.10273-1-dariobin@libero.it> References: <20210501150527.10273-1-dariobin@libero.it> X-CMAE-Envelope: MS4xfP41m9BlrNK2o6zal3ULbqzF4AoTcHubGJMOLgg8qMLTXXhnhQycWprvItCcDd44nRRwd75P2aaADv8lksJC0AOQxvHRXVpqvwbnt+BJ2wIKV5w7rRIp oQu8VLo4J9gkKdClc6djoLHr9hmdcVfOA+FlMbq6zYb1blSWdlpC5LVg1qXAdc198Yqkl6eE/uwITDsylg5Mv7GdXSHwMJH6450/1N2cQgKTwIr2HdSptE76 b5RgYev7Gp+CjKL6LsEjKvLubCWS3Ix0KZ0AQ+SRy944wmBQ4BLhIKYB4RiOb111YuPQ0QAKPoJnmH0Sv6j3YewHn3MVitWbflbFgNFsWJEEmJydQmPlgEyV 1cyeqqEzNpEYuKL4gIS8k+QSBlqvJfS+p2hp7mA4eDr4ohG0a12dStw459Dhj8Ke9evoSm8mQEXEcfHgC4ZWT0GJPaF3fLD2pBUzoTSD9Y66JrUa6h+GLqpx NX1ieP7n7J88npMNfTY2OGLjFdOJH23miU8ti3RGXoDu8nkRY4vxhVO6niRHZ8kOfG4XAjxfyO102yDgQPPfmvPG8zouqtacEPsiXCiMWbjFRaUVbIWtKVsq ldEXK3cfmr12o0+UkPUuzQYB+ck6tExOspSwR8suqLwVnUemMI96AaFNiucuT7a+53wDnRWM68hvqhPfT/2GF9RG X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean This reverts commit d64b9cdcd475eb7f07b49741ded87e24dae4a5fc. As pointed by [1] and [2], the reverted patch made every DT 'reg' property translatable. What the patch was trying to fix was fixed in a different way from previously submitted patches which instead of correcting the generic address translation function fixed the issue with appropriate platform code. [1] https://patchwork.ozlabs.org/project/uboot/patch/1614324949-61314-1-git-send-email-bmeng.cn@gmail.com/ [2] https://lore.kernel.org/linux-clk/20210402192054.7934-1-dariobin@libero.it/T/ Signed-off-by: Dario Binacchi Reviewed-by: Bin Meng --- Changes in v2: - Added Bin Meng Reviewed-by tag. arch/sandbox/dts/test.dts | 21 ---------- common/fdt_support.c | 6 +-- drivers/core/Kconfig | 12 ------ drivers/core/fdtaddr.c | 2 +- drivers/core/of_addr.c | 13 ++++-- drivers/core/ofnode.c | 7 +--- drivers/core/root.c | 3 -- include/asm-generic/global_data.h | 24 ----------- test/dm/test-fdt.c | 68 ------------------------------- 9 files changed, 15 insertions(+), 141 deletions(-) diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 48240aa26f..e23941bab0 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -45,7 +45,6 @@ fdt-dummy1 = "/translation-test@8000/dev@1,100"; fdt-dummy2 = "/translation-test@8000/dev@2,200"; fdt-dummy3 = "/translation-test@8000/noxlatebus@3,300/dev@42"; - fdt-dummy4 = "/translation-test@8000/xlatebus@4,400/devs/dev@19"; usb0 = &usb_0; usb1 = &usb_1; usb2 = &usb_2; @@ -1263,7 +1262,6 @@ 1 0x100 0x9000 0x1000 2 0x200 0xA000 0x1000 3 0x300 0xB000 0x1000 - 4 0x400 0xC000 0x1000 >; dma-ranges = <0 0x000 0x10000000 0x1000 @@ -1300,25 +1298,6 @@ reg = <0x42>; }; }; - - xlatebus@4,400 { - compatible = "sandbox,zero-size-cells-bus"; - reg = <4 0x400 0x1000>; - #address-cells = <1>; - #size-cells = <1>; - ranges = <0 4 0x400 0x1000>; - - devs { - #address-cells = <1>; - #size-cells = <0>; - - dev@19 { - compatible = "denx,u-boot-fdt-dummy"; - reg = <0x19>; - }; - }; - }; - }; osd { diff --git a/common/fdt_support.c b/common/fdt_support.c index e624bbdf40..79b7f2423c 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -20,8 +20,6 @@ #include #include -DECLARE_GLOBAL_DATA_PTR; - /** * fdt_getprop_u32_default_node - Return a node's property or a default * @@ -991,8 +989,8 @@ void fdt_del_node_and_alias(void *blob, const char *alias) /* Max address size we deal with */ #define OF_MAX_ADDR_CELLS 4 #define OF_BAD_ADDR FDT_ADDR_T_NONE -#define OF_CHECK_COUNTS(na, ns) (((na) > 0 && (na) <= OF_MAX_ADDR_CELLS) && \ - ((ns) > 0 || gd_size_cells_0())) +#define OF_CHECK_COUNTS(na, ns) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \ + (ns) > 0) /* Debug utility */ #ifdef DEBUG diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig index a7c3120860..d618e1637b 100644 --- a/drivers/core/Kconfig +++ b/drivers/core/Kconfig @@ -271,18 +271,6 @@ config OF_TRANSLATE used for the address translation. This function is faster and smaller in size than fdt_translate_address(). -config OF_TRANSLATE_ZERO_SIZE_CELLS - bool "Enable translation for zero size cells" - depends on OF_TRANSLATE - default n - help - The routine used to translate an FDT address into a physical CPU - address was developed by IBM. It considers that crossing any level - with #size-cells = <0> makes translation impossible, even if it is - not the way it was specified. - Enabling this option makes translation possible even in the case - of crossing levels with #size-cells = <0>. - config SPL_OF_TRANSLATE bool "Translate addresses using fdt_translate_address in SPL" depends on SPL_DM && SPL_OF_CONTROL diff --git a/drivers/core/fdtaddr.c b/drivers/core/fdtaddr.c index 83a50b6a3a..b9874c743d 100644 --- a/drivers/core/fdtaddr.c +++ b/drivers/core/fdtaddr.c @@ -50,7 +50,7 @@ fdt_addr_t devfdt_get_addr_index(const struct udevice *dev, int index) reg += index * (na + ns); - if (ns || gd_size_cells_0()) { + if (ns) { /* * Use the full-fledged translate function for complex * bus setups. diff --git a/drivers/core/of_addr.c b/drivers/core/of_addr.c index b3e384d2ee..9b77308182 100644 --- a/drivers/core/of_addr.c +++ b/drivers/core/of_addr.c @@ -18,8 +18,7 @@ /* Max address size we deal with */ #define OF_MAX_ADDR_CELLS 4 #define OF_CHECK_ADDR_COUNT(na) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS) -#define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && \ - ((ns) > 0 || gd_size_cells_0())) +#define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && (ns) > 0) static struct of_bus *of_match_bus(struct device_node *np); @@ -163,6 +162,11 @@ const __be32 *of_get_address(const struct device_node *dev, int index, } EXPORT_SYMBOL(of_get_address); +static int of_empty_ranges_quirk(const struct device_node *np) +{ + return false; +} + static int of_translate_one(const struct device_node *parent, struct of_bus *bus, struct of_bus *pbus, __be32 *addr, int na, int ns, int pna, @@ -189,8 +193,11 @@ static int of_translate_one(const struct device_node *parent, * As far as we know, this damage only exists on Apple machines, so * This code is only enabled on powerpc. --gcl */ - ranges = of_get_property(parent, rprop, &rlen); + if (ranges == NULL && !of_empty_ranges_quirk(parent)) { + debug("no ranges; cannot translate\n"); + return 1; + } if (ranges == NULL || rlen == 0) { offset = of_read_number(addr, na); memset(addr, 0, pna * 4); diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index fa0bd2a9c4..e4d457ecb4 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -317,8 +317,7 @@ fdt_addr_t ofnode_get_addr_size_index(ofnode node, int index, fdt_size_t *size) ns = of_n_size_cells(ofnode_to_np(node)); - if (IS_ENABLED(CONFIG_OF_TRANSLATE) && - (ns > 0 || gd_size_cells_0())) { + if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) { return of_translate_address(ofnode_to_np(node), prop_val); } else { na = of_n_addr_cells(ofnode_to_np(node)); @@ -692,10 +691,8 @@ fdt_addr_t ofnode_get_addr_size(ofnode node, const char *property, ns = of_n_size_cells(np); *sizep = of_read_number(prop + na, ns); - if (CONFIG_IS_ENABLED(OF_TRANSLATE) && - (ns > 0 || gd_size_cells_0())) { + if (CONFIG_IS_ENABLED(OF_TRANSLATE) && ns > 0) return of_translate_address(np, prop); - } else return of_read_number(prop, na); } else { diff --git a/drivers/core/root.c b/drivers/core/root.c index d9a19c5e6b..02eb352313 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -164,9 +164,6 @@ int dm_init(bool of_live) { int ret; - if (IS_ENABLED(CONFIG_OF_TRANSLATE_ZERO_SIZE_CELLS)) - gd->dm_flags |= GD_DM_FLG_SIZE_CELLS_0; - if (gd->dm_root) { dm_warn("Virtual root driver already exists!\n"); return -EINVAL; diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index e1a5f4b1d1..47921d27b1 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -183,12 +183,6 @@ struct global_data { struct global_data *new_gd; #ifdef CONFIG_DM - /** - * @dm_flags: additional flags for Driver Model - * - * See &enum gd_dm_flags - */ - unsigned long dm_flags; /** * @dm_root: root instance for Driver Model */ @@ -519,12 +513,6 @@ struct global_data { #define gd_acpi_ctx() NULL #endif -#if CONFIG_IS_ENABLED(DM) -#define gd_size_cells_0() (gd->dm_flags & GD_DM_FLG_SIZE_CELLS_0) -#else -#define gd_size_cells_0() (0) -#endif - /** * enum gd_flags - global data flags * @@ -609,18 +597,6 @@ enum gd_flags { GD_FLG_SMP_READY = 0x40000, }; -/** - * enum gd_dm_flags - global data flags for Driver Model - * - * See field dm_flags of &struct global_data. - */ -enum gd_dm_flags { - /** - * @GD_DM_FLG_SIZE_CELLS_0: Enable #size-cells=<0> translation - */ - GD_DM_FLG_SIZE_CELLS_0 = 0x00001, -}; - #endif /* __ASSEMBLY__ */ #endif /* __ASM_GENERIC_GBL_DATA_H */ diff --git a/test/dm/test-fdt.c b/test/dm/test-fdt.c index 6552d09ba3..9b771fdf19 100644 --- a/test/dm/test-fdt.c +++ b/test/dm/test-fdt.c @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -551,64 +550,6 @@ U_BOOT_DRIVER(fdt_dummy_drv) = { .id = UCLASS_TEST_DUMMY, }; -static int zero_size_cells_bus_bind(struct udevice *dev) -{ - ofnode child; - int err; - - ofnode_for_each_subnode(child, dev_ofnode(dev)) { - if (ofnode_get_property(child, "compatible", NULL)) - continue; - - err = device_bind_driver_to_node(dev, - "zero_size_cells_bus_child_drv", - "zero_size_cells_bus_child", - child, NULL); - if (err) { - dev_err(dev, "%s: failed to bind %s\n", __func__, - ofnode_get_name(child)); - return err; - } - } - - return 0; -} - -static const struct udevice_id zero_size_cells_bus_ids[] = { - { .compatible = "sandbox,zero-size-cells-bus" }, - { } -}; - -U_BOOT_DRIVER(zero_size_cells_bus) = { - .name = "zero_size_cells_bus_drv", - .id = UCLASS_TEST_DUMMY, - .of_match = zero_size_cells_bus_ids, - .bind = zero_size_cells_bus_bind, -}; - -static int zero_size_cells_bus_child_bind(struct udevice *dev) -{ - ofnode child; - int err; - - ofnode_for_each_subnode(child, dev_ofnode(dev)) { - err = lists_bind_fdt(dev, child, NULL, false); - if (err) { - dev_err(dev, "%s: lists_bind_fdt, err=%d\n", - __func__, err); - return err; - } - } - - return 0; -} - -U_BOOT_DRIVER(zero_size_cells_bus_child_drv) = { - .name = "zero_size_cells_bus_child_drv", - .id = UCLASS_TEST_DUMMY, - .bind = zero_size_cells_bus_child_bind, -}; - static int dm_test_fdt_translation(struct unit_test_state *uts) { struct udevice *dev; @@ -630,17 +571,8 @@ static int dm_test_fdt_translation(struct unit_test_state *uts) /* No translation for busses with #size-cells == 0 */ ut_assertok(uclass_find_device_by_seq(UCLASS_TEST_DUMMY, 3, &dev)); ut_asserteq_str("dev@42", dev->name); - /* No translation for busses with #size-cells == 0 */ ut_asserteq(0x42, dev_read_addr(dev)); - /* Translation for busses with #size-cells == 0 */ - gd->dm_flags |= GD_DM_FLG_SIZE_CELLS_0; - ut_asserteq(0x8042, dev_read_addr(dev)); - ut_assertok(uclass_find_device_by_seq(UCLASS_TEST_DUMMY, 4, &dev)); - ut_asserteq_str("dev@19", dev->name); - ut_asserteq(0xc019, dev_read_addr(dev)); - gd->dm_flags &= ~GD_DM_FLG_SIZE_CELLS_0; - /* dma address translation */ ut_assertok(uclass_find_device_by_seq(UCLASS_TEST_DUMMY, 0, &dev)); dma_addr[0] = cpu_to_be32(0);