From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bin Meng Date: Tue, 2 Mar 2021 23:34:47 +0800 Subject: [PATCH 16/20] dm: core: Correctly read of simple-bus In-Reply-To: <20210302153451.19440-1-bmeng.cn@gmail.com> References: <20210302153451.19440-1-bmeng.cn@gmail.com> Message-ID: <20210302153451.19440-17-bmeng.cn@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de At present we decode simple bus using the following assumption: - parent #address-cells 1 - child #address-cells 1 - child #size-cells 1 However this might not always be the case. Update to use fdt_addr_t and fdt_size_t in 'struct simple_bus_plat', and use fdt_read_ranges() to correctly decode it according to the actual parent and child #address-cells / #size-cells. Signed-off-by: Bin Meng --- drivers/core/simple-bus.c | 15 ++++++++++----- include/dm/simple_bus.h | 6 +++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/core/simple-bus.c b/drivers/core/simple-bus.c index b0c2c20958..b5863f2b2c 100644 --- a/drivers/core/simple-bus.c +++ b/drivers/core/simple-bus.c @@ -6,6 +6,9 @@ #include #include #include +#include + +DECLARE_GLOBAL_DATA_PTR; fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr) { @@ -22,16 +25,18 @@ static int simple_bus_post_bind(struct udevice *dev) #if CONFIG_IS_ENABLED(OF_PLATDATA) return 0; #else - u32 cell[3]; + uint64_t caddr, paddr, len; int ret; - ret = dev_read_u32_array(dev, "ranges", cell, ARRAY_SIZE(cell)); + /* only read range index 0 */ + ret = fdt_read_range((void *)gd->fdt_blob, dev_of_offset(dev), 0, + &caddr, &paddr, &len); if (!ret) { struct simple_bus_plat *plat = dev_get_uclass_plat(dev); - plat->base = cell[0]; - plat->target = cell[1]; - plat->size = cell[2]; + plat->base = caddr; + plat->target = paddr; + plat->size = len; } return dm_scan_fdt_dev(dev); diff --git a/include/dm/simple_bus.h b/include/dm/simple_bus.h index 4ad4cc4051..b7104013c0 100644 --- a/include/dm/simple_bus.h +++ b/include/dm/simple_bus.h @@ -7,9 +7,9 @@ #define __DM_SIMPLE_BUS_H struct simple_bus_plat { - u32 base; - u32 size; - u32 target; + fdt_addr_t base; + fdt_size_t size; + fdt_addr_t target; }; #endif -- 2.25.1