|
@@ -274,6 +274,8 @@ void board_init_f(ulong bootflag)
|
|
#ifdef CONFIG_PRAM
|
|
#ifdef CONFIG_PRAM
|
|
ulong reg;
|
|
ulong reg;
|
|
#endif
|
|
#endif
|
|
|
|
+ void *new_fdt = NULL;
|
|
|
|
+ size_t fdt_size = 0;
|
|
|
|
|
|
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f");
|
|
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",
|
|
debug("Reserving %zu Bytes for Global Data at: %08lx\n",
|
|
sizeof (gd_t), addr_sp);
|
|
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 */
|
|
/* setup stackpointer for exeptions */
|
|
gd->irq_sp = addr_sp;
|
|
gd->irq_sp = addr_sp;
|
|
#ifdef CONFIG_USE_IRQ
|
|
#ifdef CONFIG_USE_IRQ
|
|
@@ -442,6 +460,10 @@ void board_init_f(ulong bootflag)
|
|
gd->start_addr_sp = addr_sp;
|
|
gd->start_addr_sp = addr_sp;
|
|
gd->reloc_off = addr - _TEXT_BASE;
|
|
gd->reloc_off = addr - _TEXT_BASE;
|
|
debug("relocation Offset is: %08lx\n", gd->reloc_off);
|
|
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));
|
|
memcpy(id, (void *)gd, sizeof(gd_t));
|
|
|
|
|
|
relocate_code(addr_sp, id, addr);
|
|
relocate_code(addr_sp, id, addr);
|