
Hi Simon,
I commented on the v1 thread, but let's continue the discussion here
On Thu, 21 Sept 2023 at 04:58, Simon Glass sjg@chromium.org wrote:
Standard passage provides for a bloblist to be passed from one firmware phase to the next. That can be used to pass the devicetree along as well. Add an option to support this.
Tests for this will be added as part of the Universal Payload work.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2:
- No changes as it still seems unclear what should be done
[...]
/* BLOBLISTT_VENDOR_AREA */
diff --git a/doc/develop/devicetree/control.rst b/doc/develop/devicetree/control.rst index cbb65c9b177f..56e00090166f 100644 --- a/doc/develop/devicetree/control.rst +++ b/doc/develop/devicetree/control.rst @@ -108,6 +108,9 @@ If CONFIG_OF_BOARD is defined, a board-specific routine will provide the devicetree at runtime, for example if an earlier bootloader stage creates it and passes it to U-Boot.
+If CONFIG_OF_BLOBLIST is defined, the devicetree comes from a bloblist passed +from a previous stage.
What I argued before is that we don't need to be this explicit. The bloblist can carry a bunch of options that might be used by U-Boot. It would be better if we had a more generic approach instead of adding Kconfig options per bloblist entry
[...]
#ifndef USE_HOSTCC
+#define LOG_CATEGORY LOGC_DT
#include <common.h> +#include <bloblist.h> #include <boot_fit.h> #include <display_options.h> #include <dm.h> @@ -87,6 +91,7 @@ static const char *const fdt_src_name[] = { [FDTSRC_BOARD] = "board", [FDTSRC_EMBED] = "embed", [FDTSRC_ENV] = "env",
[FDTSRC_BLOBLIST] = "bloblist",
};
const char *fdtdec_get_srcname(void) @@ -1666,20 +1671,35 @@ int fdtdec_setup(void) int ret;
/* The devicetree is typically appended to U-Boot */
if (IS_ENABLED(CONFIG_OF_SEPARATE)) {
gd->fdt_blob = fdt_find_separate();
gd->fdt_src = FDTSRC_SEPARATE;
} else { /* embed dtb in ELF file for testing / development */
gd->fdt_blob = dtb_dt_embedded();
gd->fdt_src = FDTSRC_EMBED;
}
/* Allow the board to override the fdt address. */
if (IS_ENABLED(CONFIG_OF_BOARD)) {
gd->fdt_blob = board_fdt_blob_setup(&ret);
if (CONFIG_IS_ENABLED(OF_BLOBLIST)) {
ret = bloblist_maybe_init(); if (ret) return ret;
gd->fdt_src = FDTSRC_BOARD;
So, instead of adding OF_BLOBLIST, just move this code under OF_BOARD, inside an IS_ENABLED(BLOBLIST) check. If a bloblist is required and the previous stage loader is supposed to provide a DT we can just throw an error and stop booting
gd->fdt_blob = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
if (!gd->fdt_blob) {
printf("Not FDT found in bloblist\n");
bloblist_show_list();
return -ENOENT;
}
[...]
Regards /Ilias