The relocation of nios2 is different. We will need to move
dtb at the end of u-boot-dtb.bin image away from BSS sections.
Otherwise it will be zeroed during startup.

Signed-off-by: Thomas Chou <tho...@wytron.com.tw>
---
 arch/nios2/cpu/fdt.c   | 20 +++++++++++++++++++-
 arch/nios2/cpu/start.S | 10 ++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/arch/nios2/cpu/fdt.c b/arch/nios2/cpu/fdt.c
index 79f72aa..83d95ba 100644
--- a/arch/nios2/cpu/fdt.c
+++ b/arch/nios2/cpu/fdt.c
@@ -11,9 +11,11 @@
  */
 
 #include <common.h>
+#include <libfdt.h>
+#include <asm/sections.h>
+#include <linux/ctype.h>
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-#include <libfdt.h>
 #include <fdt_support.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -36,3 +38,19 @@ void ft_cpu_setup(void *blob, bd_t *bd)
        fdt_fixup_ethernet(blob);
 }
 #endif /* CONFIG_OF_LIBFDT && CONFIG_OF_BOARD_SETUP */
+
+#ifdef CONFIG_OF_SEPARATE
+void relocate_dtb(ulong cur_start)
+{
+       /* This will be called from start.S .
+        * As dtb is located at the end of u-boot-dtb.bin image,
+        * we will need to relocate it before zeroing the bss.
+        * The dtb is moved from _edata to _end, which is markuped
+        * to __bss_end. Here _end will be used by fdtdec_setup().
+        */
+       void *blob = (void *)(cur_start + (ulong)_edata - (ulong)_start);
+
+       if (fdt_magic(blob) == FDT_MAGIC)
+               memmove(_end, blob, fdt_totalsize(blob));
+}
+#endif /* CONFIG_OF_SEPARATE */
diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S
index dde80f7..58e6826 100644
--- a/arch/nios2/cpu/start.S
+++ b/arch/nios2/cpu/start.S
@@ -96,6 +96,16 @@ _reloc:
        stw     r0, 4(sp)
        mov     fp, sp
 
+#ifdef CONFIG_OF_SEPARATE
+       /* RELOCATE DTB -- relocate dtb in u-boot-dtb.bin image
+        * to be used by fdtdec_setup().
+        */
+       mov     r4, r8                  /* r8 <- cur _start */
+       movhi   r2, %hi(relocate_dtb@h)
+       ori     r2, r2, %lo(relocate_dtb@h)
+       callr   r2
+#endif
+
        /* ZERO BSS/SBSS -- bss and sbss are assumed to be adjacent
         * and between __bss_start and __bss_end.
         */
-- 
2.1.4

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

Reply via email to