diff mbox

[U-Boot,5/5] nios2: relocate dtb for separated device tree

Message ID 1441336526-23505-6-git-send-email-thomas@wytron.com.tw
State Accepted, archived
Delegated to: Thomas Chou
Headers show

Commit Message

Thomas Chou Sept. 4, 2015, 3:15 a.m. UTC
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(-)

Comments

Simon Glass Sept. 4, 2015, 4:09 a.m. UTC | #1
+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
Thomas Chou Sept. 4, 2015, 4:47 a.m. UTC | #2
Hi Simon,

On 09/04/2015 12:09 PM, Simon Glass wrote:
> 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?

Thank you for the comment. I think the problem is in the current nios2 
startup code start.S. The BSS is cleared before board_init_f(). I will 
rework the startup code to make use of the board_init code.

Best regards,
Thomas Chou
diff mbox

Patch

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.
 	 */