Hi Kever, On 7 May 2017 at 19:45, Kever Yang <kever.y...@rock-chips.com> wrote: > Hi Heiko, > > > Thanks for your comments. > > > On 05/05/2017 09:10 PM, Heiko Stuebner wrote: >> >> Hi Kever, >> >> Am Freitag, 5. Mai 2017, 10:39:35 CEST schrieb Kever Yang: >>> >>> ARM64 is using 64bit address which address cell is 2 instead of 1, >>> update to support it when of-platdata enabled. >>> >>> Signed-off-by: Kever Yang <kever.y...@rock-chips.com> >> >> This helps make OF_PLATDATA work on my firefly-rk3399 so yay :-), >> but I don't think it's that easy to solve, see below: >> >>> --- >>> >>> Changes in v3: >>> - move of_plat_get_number() into lib/of_plat.c >>> >>> Changes in v2: >>> - rename the fdtdec_get_number() to of_plat_get_number() >>> >>> drivers/core/regmap.c | 9 +++++++++ >>> include/of_plat.h | 22 ++++++++++++++++++++++ >>> lib/Makefile | 3 +++ >>> lib/of_plat.c | 17 +++++++++++++++++ >>> 4 files changed, 51 insertions(+) >>> create mode 100644 include/of_plat.h >>> create mode 100644 lib/of_plat.c >>> >>> diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c >>> index 3bec3df..c03279e 100644 >>> --- a/drivers/core/regmap.c >>> +++ b/drivers/core/regmap.c >>> @@ -12,6 +12,7 @@ >>> #include <malloc.h> >>> #include <mapmem.h> >>> #include <regmap.h> >>> +#include <of_plat.h> >>> #include <asm/io.h> >>> @@ -49,11 +50,19 @@ int regmap_init_mem_platdata(struct udevice *dev, >>> u32 *reg, int count, >>> if (!map) >>> return -ENOMEM; >>> +#ifdef CONFIG_PHYS_64BIT >>> + map->base = of_plat_get_number(reg, 2); >>> + for (range = map->range; count > 0; reg += 4, range++, count--) { >>> + range->start = of_plat_get_number(reg, 2); >>> + range->size = of_plat_get_number(reg + 2, 2); >>> + } >> >> I may just be missing something, but how can you be sure that the >> cell-size >> is always 2? >> >> For example, there were discussions about 64bit platforms not really >> needing to add all the 0x0 elements, when the whole io-registers are well >> below the 4GB mark and for example at least one sunxi also uses this, see >> for example: >> allwinner/sun50i-a64.dtsi, altera/socfpga_stratix10.dtsi, >> broadcom/bcm283x.dtsi and problably more using #address-cells = <1>, >> #size-cells = <1> for their memory mapped io. >> >> And from what I've seen dtoc simply converts the reg property and just >> ignores #address-cells and #size-cells (or I'm overlooking something). >> >> Possible solutions that come to mind would be make dtoc also convert >> #address-cells and #size-cells, making regmap and everybody check it >> or alternatively make dtoc convert regs to cell-size 2 in all cases when >> CONFIG_PHYS_64BIT is set. > > > @Simon, could you take a look about this issue, I really not good at dtoc > and libfdt, I think maybe we can re-use fdtdec_get_number() if dtoc do not > do the fdt32_to_cpu() int dtoc?
I think the best solution is the second one above. However dtoc is a bit of a pain to change at the moment. I've sent a series to clean it up. I'll hopefully take a look at the above in the next few weeks. Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot