[U-Boot] [PATCH] arm: fdt: Relocate fdt along with other data

Rather than leave the fdt down next to the code/data, we really should relocate it along with everything else. For CONFIG_OF_EMBED this happens automatically, but for CONFIG_OF_SEPARATE it does not.
Add code to copy the fdt and point to the new copy after relocation.
Signed-off-by: Simon Glass sjg@chromium.org --- arch/arm/lib/board.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c index 109a1ac..6dca891 100644 --- a/arch/arm/lib/board.c +++ b/arch/arm/lib/board.c @@ -274,6 +274,8 @@ void board_init_f(ulong bootflag) #ifdef CONFIG_PRAM ulong reg; #endif + void *new_fdt = NULL; + size_t fdt_size = 0;
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f");
@@ -409,6 +411,22 @@ void board_init_f(ulong bootflag) debug("Reserving %zu Bytes for Global Data at: %08lx\n", sizeof (gd_t), addr_sp);
+#if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL) + /* + * If the device tree is sitting immediate above our image then we + * must relocate it. If it is embedded in the data section, then it + * will be relocated with other data. + */ + if (gd->fdt_blob) { + fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32); + + addr_sp -= fdt_size; + new_fdt = (void *)addr_sp; + debug("Reserving %zu Bytes for FDT at: %08lx\n", + fdt_size, addr_sp); + } +#endif + /* setup stackpointer for exeptions */ gd->irq_sp = addr_sp; #ifdef CONFIG_USE_IRQ @@ -442,6 +460,10 @@ void board_init_f(ulong bootflag) gd->start_addr_sp = addr_sp; gd->reloc_off = addr - _TEXT_BASE; debug("relocation Offset is: %08lx\n", gd->reloc_off); + if (new_fdt) { + memcpy(new_fdt, gd->fdt_blob, fdt_size); + gd->fdt_blob = new_fdt; + } memcpy(id, (void *)gd, sizeof(gd_t));
relocate_code(addr_sp, id, addr);

On 09/27/2012 07:41 PM, Simon Glass wrote:
Rather than leave the fdt down next to the code/data, we really should relocate it along with everything else. For CONFIG_OF_EMBED this happens automatically, but for CONFIG_OF_SEPARATE it does not.
Add code to copy the fdt and point to the new copy after relocation.
Tested-by: Stephen Warren swarren@nvidia.com
(on Tegra Harmony board, on top of a merge of current u-boot/master, u-boot-usb/master, u-boot-tegra/next plus my CONFIG_SYS_BOOTMAPSZ and standard environment variable patches for Tegra)

Hi Stephen,
On Fri, 28 Sep 2012 09:22:48 -0600, Stephen Warren swarren@wwwdotorg.org wrote:
On 09/27/2012 07:41 PM, Simon Glass wrote:
Rather than leave the fdt down next to the code/data, we really should relocate it along with everything else. For CONFIG_OF_EMBED this happens automatically, but for CONFIG_OF_SEPARATE it does not.
Add code to copy the fdt and point to the new copy after relocation.
Tested-by: Stephen Warren swarren@nvidia.com
(on Tegra Harmony board, on top of a merge of current u-boot/master, u-boot-usb/master, u-boot-tegra/next plus my CONFIG_SYS_BOOTMAPSZ and standard environment variable patches for Tegra)
Applied to u-boot-arm/master, thanks!
Amicalement,
participants (3)
-
Albert ARIBAUD
-
Simon Glass
-
Stephen Warren