Patchwork [U-Boot,3/5] microblaze: Add support for device tree driven board configuration

login
register
mail settings
Submitter Michal Simek
Date June 29, 2012, 7:37 a.m.
Message ID <1340955478-22251-3-git-send-email-monstr@monstr.eu>
Download mbox | patch
Permalink /patch/168010/
State Accepted
Delegated to: Michal Simek
Headers show

Comments

Michal Simek - June 29, 2012, 7:37 a.m.
This is minimum code required to be able to use device-tree
for u-boot initialization.
Currently only for device driver initialization.

Linker script change ensures DTB to be aligned
for both options CONFIG_OF_EMBED and CONFIG_OF_SEPARATE.

Signed-off-by: Michal Simek <monstr@monstr.eu>
CC: Simon Glass <sjg@chromium.org>
---
 arch/microblaze/config.mk                 |    2 ++
 arch/microblaze/cpu/u-boot.lds            |    1 +
 arch/microblaze/include/asm/global_data.h |    1 +
 arch/microblaze/lib/board.c               |   23 +++++++++++++++++++++++
 4 files changed, 27 insertions(+), 0 deletions(-)
Michal Simek - July 9, 2012, 8:41 a.m.
2012/6/29 Michal Simek <monstr@monstr.eu>:
> This is minimum code required to be able to use device-tree
> for u-boot initialization.
> Currently only for device driver initialization.
>
> Linker script change ensures DTB to be aligned
> for both options CONFIG_OF_EMBED and CONFIG_OF_SEPARATE.
>
> Signed-off-by: Michal Simek <monstr@monstr.eu>
> CC: Simon Glass <sjg@chromium.org>
> ---
>  arch/microblaze/config.mk                 |    2 ++
>  arch/microblaze/cpu/u-boot.lds            |    1 +
>  arch/microblaze/include/asm/global_data.h |    1 +
>  arch/microblaze/lib/board.c               |   23 +++++++++++++++++++++++
>  4 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/arch/microblaze/config.mk b/arch/microblaze/config.mk
> index aca79e2..b4935f0 100644
> --- a/arch/microblaze/config.mk
> +++ b/arch/microblaze/config.mk
> @@ -31,3 +31,5 @@ CONFIG_STANDALONE_LOAD_ADDR ?= 0x80F00000
>  PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
>
>  LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
> +
> +CONFIG_ARCH_DEVICE_TREE := microblaze
> diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds
> index ee41145..d033a28 100644
> --- a/arch/microblaze/cpu/u-boot.lds
> +++ b/arch/microblaze/cpu/u-boot.lds
> @@ -45,6 +45,7 @@ SECTIONS
>         .data ALIGN(0x4):
>         {
>                 __data_start = .;
> +               dts/libdts.o (.data)
>                 *(.data)
>                 __data_end = .;
>         }
> diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
> index 6e8537c..e802e4e 100644
> --- a/arch/microblaze/include/asm/global_data.h
> +++ b/arch/microblaze/include/asm/global_data.h
> @@ -43,6 +43,7 @@ typedef       struct  global_data {
>         unsigned long   precon_buf_idx; /* Pre-Console buffer index */
>  #endif
>         unsigned long   env_addr;       /* Address  of Environment struct */
> +       const void      *fdt_blob;      /* Our device tree, NULL if none */
>         unsigned long   env_valid;      /* Checksum of Environment valid? */
>         unsigned long   fb_base;        /* base address of frame buffer */
>         void            **jt;           /* jump table */
> diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c
> index f3679d5..59d39a0 100644
> --- a/arch/microblaze/lib/board.c
> +++ b/arch/microblaze/lib/board.c
> @@ -32,6 +32,7 @@
>  #include <stdio_dev.h>
>  #include <net.h>
>  #include <asm/processor.h>
> +#include <fdtdec.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -68,6 +69,9 @@ typedef int (init_fnc_t) (void);
>
>  init_fnc_t *init_sequence[] = {
>         env_init,
> +#ifdef CONFIG_OF_CONTROL
> +       fdtdec_check_fdt,
> +#endif
>         serial_init,
>         console_init_f,
>  #ifdef CONFIG_SYS_GPIO_0
> @@ -110,6 +114,17 @@ void board_init (void)
>
>         monitor_flash_len = __end - __text_start;
>
> +#ifdef CONFIG_OF_EMBED
> +       /* Get a pointer to the FDT */
> +       gd->fdt_blob = _binary_dt_dtb_start;
> +#elif defined CONFIG_OF_SEPARATE
> +       /* FDT is at end of image */
> +       gd->fdt_blob = (void *)__end;
> +#endif
> +       /* Allow the early environment to override the fdt address */
> +       gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
> +                                               (uintptr_t)gd->fdt_blob);
> +
>         /*
>          * The Malloc area is immediately below the monitor copy in DRAM
>          * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
> @@ -124,6 +139,14 @@ void board_init (void)
>                 }
>         }
>
> +#ifdef CONFIG_OF_CONTROL
> +       /* For now, put this check after the console is ready */
> +       if (fdtdec_prepare_fdt()) {
> +               panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
> +                       "doc/README.fdt-control");
> +       }
> +#endif
> +
>         puts ("SDRAM :\n");
>         printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF");
>         printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");
> --
> 1.7.0.4
>

Reject. v2 will add one more puts.

Michal

Patch

diff --git a/arch/microblaze/config.mk b/arch/microblaze/config.mk
index aca79e2..b4935f0 100644
--- a/arch/microblaze/config.mk
+++ b/arch/microblaze/config.mk
@@ -31,3 +31,5 @@  CONFIG_STANDALONE_LOAD_ADDR ?= 0x80F00000
 PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
 
 LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
+
+CONFIG_ARCH_DEVICE_TREE := microblaze
diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds
index ee41145..d033a28 100644
--- a/arch/microblaze/cpu/u-boot.lds
+++ b/arch/microblaze/cpu/u-boot.lds
@@ -45,6 +45,7 @@  SECTIONS
 	.data ALIGN(0x4):
 	{
 		__data_start = .;
+		dts/libdts.o (.data)
 		*(.data)
 		__data_end = .;
 	}
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 6e8537c..e802e4e 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -43,6 +43,7 @@  typedef	struct	global_data {
 	unsigned long	precon_buf_idx;	/* Pre-Console buffer index */
 #endif
 	unsigned long	env_addr;	/* Address  of Environment struct */
+	const void	*fdt_blob;	/* Our device tree, NULL if none */
 	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	fb_base;	/* base address of frame buffer */
 	void		**jt;		/* jump table */
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c
index f3679d5..59d39a0 100644
--- a/arch/microblaze/lib/board.c
+++ b/arch/microblaze/lib/board.c
@@ -32,6 +32,7 @@ 
 #include <stdio_dev.h>
 #include <net.h>
 #include <asm/processor.h>
+#include <fdtdec.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -68,6 +69,9 @@  typedef int (init_fnc_t) (void);
 
 init_fnc_t *init_sequence[] = {
 	env_init,
+#ifdef CONFIG_OF_CONTROL
+	fdtdec_check_fdt,
+#endif
 	serial_init,
 	console_init_f,
 #ifdef CONFIG_SYS_GPIO_0
@@ -110,6 +114,17 @@  void board_init (void)
 
 	monitor_flash_len = __end - __text_start;
 
+#ifdef CONFIG_OF_EMBED
+	/* Get a pointer to the FDT */
+	gd->fdt_blob = _binary_dt_dtb_start;
+#elif defined CONFIG_OF_SEPARATE
+	/* FDT is at end of image */
+	gd->fdt_blob = (void *)__end;
+#endif
+	/* Allow the early environment to override the fdt address */
+	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
+						(uintptr_t)gd->fdt_blob);
+
 	/*
 	 * The Malloc area is immediately below the monitor copy in DRAM
 	 * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
@@ -124,6 +139,14 @@  void board_init (void)
 		}
 	}
 
+#ifdef CONFIG_OF_CONTROL
+	/* For now, put this check after the console is ready */
+	if (fdtdec_prepare_fdt()) {
+		panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
+			"doc/README.fdt-control");
+	}
+#endif
+
 	puts ("SDRAM :\n");
 	printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF");
 	printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");