[U-Boot] [RFC PATCH v2 4/6] fdt: ARM: Implement embedded and separate device tree

Simon Glass
2011-09-12T22:04:25Z

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 a7fb251..6a02001 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>

#ifdef CONFIG_BITBANGMII
#include <miiphy.h>
@@ -195,6 +196,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->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...
*
@@ -237,6 +249,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,
@@ -274,6 +289,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->blob = _binary_dt_dtb_start;
+#elif defined CONFIG_OF_SEPARATE
+ /* FDT is at end of image */
+ gd->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