]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fdt: Allow the devicetree to come from a bloblist
authorSimon Glass <sjg@chromium.org>
Thu, 4 Jan 2024 01:49:19 +0000 (18:49 -0700)
committerSimon Glass <sjg@chromium.org>
Sun, 7 Jan 2024 20:45:07 +0000 (13:45 -0700)
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>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
doc/develop/devicetree/control.rst
include/fdtdec.h
lib/fdtdec.c

index cbb65c9b177f15d30e462b66641a920cd7d510d5..11c92d440f4daab285213594d42841c7a9c6e074 100644 (file)
@@ -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_BLOBLIST is defined, the devicetree may come from a bloblist passed
+from a previous stage, if present.
+
 If CONFIG_SANDBOX is defined, then it will be read from a file on
 startup. Use the -d flag to U-Boot to specify the file to read, -D for the
 default and -T for the test devicetree, used to run sandbox unit tests.
index bd1149f46d08d00d0ec186be923e9f8b899a0391..e80de24076cb41922197d066965d4fadf9cfe4fd 100644 (file)
@@ -72,7 +72,7 @@ struct bd_info;
  *     U-Boot is packaged as an ELF file, e.g. for debugging purposes
  * @FDTSRC_ENV: Provided by the fdtcontroladdr environment variable. This should
  *     be used for debugging/development only
- * @FDTSRC_NONE: No devicetree at all
+ * @FDTSRC_BLOBLIST: Provided by a bloblist from an earlier phase
  */
 enum fdt_source_t {
        FDTSRC_SEPARATE,
@@ -80,6 +80,7 @@ enum fdt_source_t {
        FDTSRC_BOARD,
        FDTSRC_EMBED,
        FDTSRC_ENV,
+       FDTSRC_BLOBLIST,
 };
 
 /*
@@ -1190,7 +1191,8 @@ int fdtdec_resetup(int *rescan);
  *
  * The existing devicetree is available at gd->fdt_blob
  *
- * @err internal error code if we fail to setup a DTB
+ * @err: 0 on success, -EEXIST if the devicetree is already correct, or other
+ * internal error code if we fail to setup a DTB
  * @returns new devicetree blob pointer
  */
 void *board_fdt_blob_setup(int *err);
index 4016bf3c1130401dca574c7f99dd15144f4e51a7..b2c59ab3818b3235e36b61b054c76a803423de63 100644 (file)
@@ -7,6 +7,10 @@
  */
 
 #ifndef USE_HOSTCC
+
+#define LOG_CATEGORY   LOGC_DT
+
+#include <bloblist.h>
 #include <boot_fit.h>
 #include <display_options.h>
 #include <dm.h>
@@ -86,6 +90,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)
@@ -1662,23 +1667,42 @@ static void setup_multi_dtb_fit(void)
 
 int fdtdec_setup(void)
 {
-       int ret;
+       int ret = -ENOENT;
+
+       /* If allowing a bloblist, check that first */
+       if (CONFIG_IS_ENABLED(BLOBLIST)) {
+               ret = bloblist_maybe_init();
+               if (!ret) {
+                       gd->fdt_blob = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
+                       if (gd->fdt_blob) {
+                               gd->fdt_src = FDTSRC_BLOBLIST;
+                               log_debug("Devicetree is in bloblist at %p\n",
+                                         gd->fdt_blob);
+                       } else {
+                               log_debug("No FDT found in bloblist\n");
+                               ret = -ENOENT;
+                       }
+               }
+       }
 
-       /* 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;
+       /* Otherwise, the devicetree is typically appended to U-Boot */
+       if (ret) {
+               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 (ret)
+               if (!ret)
+                       gd->fdt_src = FDTSRC_BOARD;
+               else if (ret != -EEXIST)
                        return ret;
-               gd->fdt_src = FDTSRC_BOARD;
        }
 
        /* Allow the early environment to override the fdt address */