
Hi Rob,
On 3 August 2017 at 10:48, Rob Clark robdclark@gmail.com wrote:
Similar to CONFIG_OF_BOARD, but in this case the fdt is still built by u-boot build. This allows the board to patch the fdt, etc.
In the specific case of dragonboard 410c, we pass the u-boot generated fdt to the previous stage of bootloader (by embedding it in the u-boot.img that is loaded by lk/aboot), which patches the fdt and passes it back to u-boot.
Why do you need to create a weak function for this? Isn't there already a CONFIG_OF_BOARD to enable this feature?
Signed-off-by: Rob Clark robdclark@gmail.com
include/fdtdec.h | 3 ++- lib/fdtdec.c | 45 ++++++++++++++++++++++++++------------------- 2 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/include/fdtdec.h b/include/fdtdec.h index 4a0947c626..b9acec735a 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -986,7 +986,8 @@ int fdtdec_setup(void);
/**
- Board-specific FDT initialization. Returns the address to a device tree blob.
- Called when CONFIG_OF_BOARD is defined.
- Called when CONFIG_OF_BOARD is defined, or if CONFIG_OF_SEPARATE is defined
*/
- and the board implements it.
void *board_fdt_blob_setup(void);
diff --git a/lib/fdtdec.c b/lib/fdtdec.c index d2dbd0f122..07c458673c 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -1203,34 +1203,41 @@ int fdtdec_setup_memory_banksize(void) } #endif
-int fdtdec_setup(void) +#ifdef CONFIG_OF_SEPARATE +/*
- For CONFIG_OF_SEPARATE, the board may optionally implement this to
- provide and/or fixup the fdt.
- */
+__weak void *board_fdt_blob_setup(void) { -#if CONFIG_IS_ENABLED(OF_CONTROL) -# ifdef CONFIG_OF_EMBED
/* Get a pointer to the FDT */
gd->fdt_blob = __dtb_dt_begin;
-# elif defined CONFIG_OF_SEPARATE -# ifdef CONFIG_SPL_BUILD
void *fdt_blob = NULL;
+#ifdef CONFIG_SPL_BUILD /* FDT is at end of BSS unless it is in a different memory region */ if (IS_ENABLED(CONFIG_SPL_SEPARATE_BSS))
gd->fdt_blob = (ulong *)&_image_binary_end;
fdt_blob = (ulong *)&_image_binary_end; else
gd->fdt_blob = (ulong *)&__bss_end;
fdt_blob = (ulong *)&__bss_end;
-# elif defined CONFIG_FIT_EMBED
gd->fdt_blob = locate_dtb_in_fit(&_end);
+#elif defined CONFIG_FIT_EMBED
fdt_blob = locate_dtb_in_fit(&_end);
if (gd->fdt_blob == NULL || gd->fdt_blob <= ((void *)&_end)) {
if (fdt_blob == NULL || fdt_blob <= ((void *)&_end)) puts("Failed to find proper dtb in embedded FIT Image\n");
return -1;
}
-# else +#else /* FDT is at end of image */
gd->fdt_blob = (ulong *)&_end;
fdt_blob = (ulong *)&_end;
# endif -# elif defined(CONFIG_OF_BOARD)
/* Allow the board to override the fdt address. */
return fdt_blob;
+} +#endif
+int fdtdec_setup(void) +{ +#if CONFIG_IS_ENABLED(OF_CONTROL) +# ifdef CONFIG_OF_EMBED
/* Get a pointer to the FDT */
gd->fdt_blob = __dtb_dt_begin;
+# elif defined(CONFIG_OF_SEPARATE) || defined(CONFIG_OF_BOARD) gd->fdt_blob = board_fdt_blob_setup(); # elif defined(CONFIG_OF_HOSTFILE) if (sandbox_read_fdt_from_file()) { -- 2.13.0
Regards, Simon