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?

Thanks,
- Kever


Heiko




_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to