
+Marek
Hi Thomas,
On 3 September 2015 at 21:15, Thomas Chou thomas@wytron.com.tw wrote:
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 thomas@wytron.com.tw
arch/nios2/cpu/fdt.c | 20 +++++++++++++++++++- arch/nios2/cpu/start.S | 10 ++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-)
Can you help me understand the relocation a bit? There is already code in board_init_f() to relocate the device tree, and until board_init_r(), BSS should not be used. What is different about NIOS?
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
Regards, Simon