]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bloblist: Support initing from multiple places
authorSimon Glass <sjg@chromium.org>
Tue, 26 Sep 2023 14:14:51 +0000 (08:14 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 6 Oct 2023 18:38:13 +0000 (14:38 -0400)
Typically the bloblist is set up after the devicetree is present. This
makes sense because bloblist may use malloc() to allocate the space it
needs.

However sometimes the devicetree itself may be present in the bloblist.
In that case it is at a known location in memory so we can init the
bloblist very early, before devicetree.

Add a flag to indicate whether the bloblist has been inited. Add a
function to init it only if needed. Use that in the init sequence.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/bloblist.c
common/board_f.c
include/asm-generic/global_data.h
include/bloblist.h

index 2144b10e1d04f4cfcdd207fa6bb28069ab48ec67..6f2a4577708d02815cb46e877a28a077adf47470 100644 (file)
@@ -476,6 +476,17 @@ int bloblist_init(void)
                log_debug("Found existing bloblist size %lx at %lx\n", size,
                          addr);
        }
+       if (ret)
+               return log_msg_ret("ini", ret);
+       gd->flags |= GD_FLG_BLOBLIST_READY;
+
+       return 0;
+}
 
-       return ret;
+int bloblist_maybe_init(void)
+{
+       if (CONFIG_IS_ENABLED(BLOBLIST) && !(gd->flags & GD_FLG_BLOBLIST_READY))
+               return bloblist_init();
+
+       return 0;
 }
index 99c2a43c19610c376b01857c8eb00503ca08fe33..d4d7d01f8f6eb3ecf36d808bf0169a8616c82a5b 100644 (file)
@@ -841,9 +841,7 @@ static const init_fnc_t init_sequence_f[] = {
        log_init,
        initf_bootstage,        /* uses its own timer, so does not need DM */
        event_init,
-#ifdef CONFIG_BLOBLIST
-       bloblist_init,
-#endif
+       bloblist_maybe_init,
        setup_spl_handoff,
 #if defined(CONFIG_CONSOLE_RECORD_INIT_F)
        console_record_init,
index 937fb12516c1dce5a6167d5268dd0a5fe8449dee..e8c6412e3f8dfa357e844e6292eb7c597af1e671 100644 (file)
@@ -693,6 +693,10 @@ enum gd_flags {
         * the memory used to holds its tables has been mapped out.
         */
        GD_FLG_DM_DEAD = 0x400000,
+       /**
+        * @GD_FLG_BLOBLIST_READY: bloblist is ready for use
+        */
+       GD_FLG_BLOBLIST_READY = 0x800000,
 };
 
 #endif /* __ASSEMBLY__ */
index 7ea72c6bd46d1ba38307c6a6331235f7cd623a8d..080cc46a1266feffa1dc7fe6218f935ce7469032 100644 (file)
@@ -413,8 +413,26 @@ void bloblist_reloc(void *to, uint to_size, void *from, uint from_size);
  * standard passage. The size is detected automatically so CONFIG_BLOBLIST_SIZE
  * can be 0.
  *
+ * Sets GD_FLG_BLOBLIST_READY in global_data flags on success
+ *
  * Return: 0 if OK, -ve on error
  */
 int bloblist_init(void);
 
+#if CONFIG_IS_ENABLED(BLOBLIST)
+/**
+ * bloblist_maybe_init() - Init the bloblist system if not already done
+ *
+ * Calls bloblist_init() if the GD_FLG_BLOBLIST_READY flag is not et
+ *
+ * Return: 0 if OK, -ve on error
+ */
+int bloblist_maybe_init(void);
+#else
+static inline int bloblist_maybe_init(void)
+{
+       return 0;
+}
+#endif /* BLOBLIST */
+
 #endif /* __BLOBLIST_H */