]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - lib/fdtdec.c
net: hifemac_mdio: use log_msg_ret() correctly, report error by dev_err()
[thirdparty/u-boot.git] / lib / fdtdec.c
index 7a69167648354f005e1d6791e8d1955c879912cd..b2c59ab3818b3235e36b61b054c76a803423de63 100644 (file)
@@ -7,7 +7,10 @@
  */
 
 #ifndef USE_HOSTCC
-#include <common.h>
+
+#define LOG_CATEGORY   LOGC_DT
+
+#include <bloblist.h>
 #include <boot_fit.h>
 #include <display_options.h>
 #include <dm.h>
@@ -87,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)
@@ -1663,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 */