]> git.sur5r.net Git - u-boot/blobdiff - arch/arm/lib/board.c
arm: fdt: Relocate fdt along with other data
[u-boot] / arch / arm / lib / board.c
index 0b47ab341edf41eb8b82a96b416f31efbb7c098e..99cb54b8d8c88e1ef4a7e81e8a8b72e747169a29 100644 (file)
@@ -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);