Patchwork [U-Boot,v4,4/6] fdt: ARM: Implement and verify embedded and separate device tree

login
register
mail settings
Submitter Simon Glass
Date Oct. 15, 2011, 3:48 p.m.
Message ID <1318693706-3381-5-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/119980/
State New, archived
Headers show

Comments

Simon Glass - Oct. 15, 2011, 3:48 p.m.
This locates the device tree either embedded within U-Boot or attached to the
end as a separate binary.

When CONFIG_OF_CONTROL is defined, U-Boot requires a valid fdt. A check is
provided for this early in initialisation.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
 arch/arm/lib/board.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)
Kumar Gala - Oct. 21, 2011, 5:13 a.m.
On Oct 15, 2011, at 10:48 AM, Simon Glass wrote:

> This locates the device tree either embedded within U-Boot or attached to the
> end as a separate binary.
> 
> When CONFIG_OF_CONTROL is defined, U-Boot requires a valid fdt. A check is
> provided for this early in initialisation.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> arch/arm/lib/board.c |   22 ++++++++++++++++++++++
> 1 files changed, 22 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
> index 1fe3751..b0f3162 100644
> --- a/arch/arm/lib/board.c
> +++ b/arch/arm/lib/board.c
> @@ -48,6 +48,7 @@
> #include <nand.h>
> #include <onenand_uboot.h>
> #include <mmc.h>
> +#include <libfdt.h>
> #include <post.h>
> #include <logbuff.h>
> 
> @@ -197,6 +198,17 @@ static int arm_pci_init(void)
> }
> #endif /* CONFIG_CMD_PCI || CONFIG_PCI */
> 
> +#ifdef CONFIG_OF_CONTROL
> +static int check_fdt(void)
> +{
> +	/* We must have an fdt */
> +	if (fdt_check_header(gd->fdt_blob))
> +		panic("No valid fdt found - please append one to U-Boot\n"
> +			"binary or define CONFIG_OF_EMBED\n");
> +	return 0;
> +}
> +#endif
> +

this isn't arm specific, maybe put in fdt_support.c

> /*
>  * Breathe some life into the board...
>  *
> @@ -239,6 +251,9 @@ init_fnc_t *init_sequence[] = {
> #if defined(CONFIG_BOARD_EARLY_INIT_F)
> 	board_early_init_f,
> #endif
> +#ifdef CONFIG_OF_CONTROL
> +	check_fdt,
> +#endif
> 	timer_init,		/* initialize timer */
> #ifdef CONFIG_FSL_ESDHC
> 	get_clocks,
> @@ -276,6 +291,13 @@ void board_init_f(ulong bootflag)
> 	memset((void *)gd, 0, sizeof(gd_t));
> 
> 	gd->mon_len = _bss_end_ofs;
> +#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_ofs + _TEXT_BASE);
> +#endif
> 
> 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
> 		if ((*init_fnc_ptr)() != 0) {
> -- 
> 1.7.3.1
Simon Glass - Oct. 25, 2011, 12:40 p.m.
Hi Kumar,

On Thu, Oct 20, 2011 at 10:13 PM, Kumar Gala <galak@kernel.crashing.org> wrote:
>
> On Oct 15, 2011, at 10:48 AM, Simon Glass wrote:
>
>> This locates the device tree either embedded within U-Boot or attached to the
>> end as a separate binary.
>>
>> When CONFIG_OF_CONTROL is defined, U-Boot requires a valid fdt. A check is
>> provided for this early in initialisation.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>> arch/arm/lib/board.c |   22 ++++++++++++++++++++++
>> 1 files changed, 22 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
>> index 1fe3751..b0f3162 100644
>> --- a/arch/arm/lib/board.c
>> +++ b/arch/arm/lib/board.c
>> @@ -48,6 +48,7 @@
>> #include <nand.h>
>> #include <onenand_uboot.h>
>> #include <mmc.h>
>> +#include <libfdt.h>
>> #include <post.h>
>> #include <logbuff.h>
>>
>> @@ -197,6 +198,17 @@ static int arm_pci_init(void)
>> }
>> #endif /* CONFIG_CMD_PCI || CONFIG_PCI */
>>
>> +#ifdef CONFIG_OF_CONTROL
>> +static int check_fdt(void)
>> +{
>> +     /* We must have an fdt */
>> +     if (fdt_check_header(gd->fdt_blob))
>> +             panic("No valid fdt found - please append one to U-Boot\n"
>> +                     "binary or define CONFIG_OF_EMBED\n");
>> +     return 0;
>> +}
>> +#endif
>> +
>
> this isn't arm specific, maybe put in fdt_support.c

Thanks. I have made this change in v6.

Regards,
Simon

>
>> /*
>>  * Breathe some life into the board...
>>  *
>> @@ -239,6 +251,9 @@ init_fnc_t *init_sequence[] = {
>> #if defined(CONFIG_BOARD_EARLY_INIT_F)
>>       board_early_init_f,
>> #endif
>> +#ifdef CONFIG_OF_CONTROL
>> +     check_fdt,
>> +#endif
>>       timer_init,             /* initialize timer */
>> #ifdef CONFIG_FSL_ESDHC
>>       get_clocks,
>> @@ -276,6 +291,13 @@ void board_init_f(ulong bootflag)
>>       memset((void *)gd, 0, sizeof(gd_t));
>>
>>       gd->mon_len = _bss_end_ofs;
>> +#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_ofs + _TEXT_BASE);
>> +#endif
>>
>>       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
>>               if ((*init_fnc_ptr)() != 0) {
>> --
>> 1.7.3.1
>
>

Patch

diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 1fe3751..b0f3162 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -48,6 +48,7 @@ 
 #include <nand.h>
 #include <onenand_uboot.h>
 #include <mmc.h>
+#include <libfdt.h>
 #include <post.h>
 #include <logbuff.h>
 
@@ -197,6 +198,17 @@  static int arm_pci_init(void)
 }
 #endif /* CONFIG_CMD_PCI || CONFIG_PCI */
 
+#ifdef CONFIG_OF_CONTROL
+static int check_fdt(void)
+{
+	/* We must have an fdt */
+	if (fdt_check_header(gd->fdt_blob))
+		panic("No valid fdt found - please append one to U-Boot\n"
+			"binary or define CONFIG_OF_EMBED\n");
+	return 0;
+}
+#endif
+
 /*
  * Breathe some life into the board...
  *
@@ -239,6 +251,9 @@  init_fnc_t *init_sequence[] = {
 #if defined(CONFIG_BOARD_EARLY_INIT_F)
 	board_early_init_f,
 #endif
+#ifdef CONFIG_OF_CONTROL
+	check_fdt,
+#endif
 	timer_init,		/* initialize timer */
 #ifdef CONFIG_FSL_ESDHC
 	get_clocks,
@@ -276,6 +291,13 @@  void board_init_f(ulong bootflag)
 	memset((void *)gd, 0, sizeof(gd_t));
 
 	gd->mon_len = _bss_end_ofs;
+#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_ofs + _TEXT_BASE);
+#endif
 
 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
 		if ((*init_fnc_ptr)() != 0) {