spl: Set up the bloblist in SPL
authorSimon Glass <sjg@chromium.org>
Fri, 16 Nov 2018 01:43:51 +0000 (18:43 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 26 Nov 2018 13:25:32 +0000 (08:25 -0500)
The bloblist is normally set up in SPL ready for use by U-Boot. Add
a simple implementation of this to the common SPL code.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/spl/spl.c
include/spl.h

index 740182a8be601b169bf34804ee38398c6309a9a7..eea92ec1f8ca898484dad1385a162736eb3aa455 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <common.h>
+#include <bloblist.h>
 #include <binman_sym.h>
 #include <dm.h>
 #include <spl.h>
@@ -343,6 +344,14 @@ static int spl_common_init(bool setup_malloc)
                return ret;
        }
 #endif
+       if (CONFIG_IS_ENABLED(BLOBLIST)) {
+               ret = bloblist_init();
+               if (ret) {
+                       debug("%s: Failed to set up bloblist: ret=%d\n",
+                             __func__, ret);
+                       return ret;
+               }
+       }
        if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
                ret = fdtdec_setup();
                if (ret) {
@@ -481,6 +490,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                BOOT_DEVICE_NONE,
        };
        struct spl_image_info spl_image;
+       int ret;
 
        debug(">>spl:board_init_r()\n");
 
@@ -527,6 +537,12 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        }
 
        spl_perform_fixups(&spl_image);
+       if (CONFIG_IS_ENABLED(BLOBLIST)) {
+               ret = bloblist_finish();
+               if (ret)
+                       printf("Warning: Failed to finish bloblist (ret=%d)\n",
+                              ret);
+       }
 
 #ifdef CONFIG_CPU_V7M
        spl_image.entry_point |= 0x1;
@@ -563,8 +579,6 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
              gd->malloc_ptr / 1024);
 #endif
 #ifdef CONFIG_BOOTSTAGE_STASH
-       int ret;
-
        bootstage_mark_name(BOOTSTAGE_ID_END_SPL, "end_spl");
        ret = bootstage_stash((void *)CONFIG_BOOTSTAGE_STASH_ADDR,
                              CONFIG_BOOTSTAGE_STASH_SIZE);
index 9a439f468b9b0ad876b7e2677ccd1dd4467fcc2f..a56032ae3ebd2bef749f49349482e6c4c761afe5 100644 (file)
 #define MMCSD_MODE_FS          2
 #define MMCSD_MODE_EMMCBOOT    3
 
+/*
+ * u_boot_first_phase() - check if this is the first U-Boot phase
+ *
+ * U-Boot has up to three phases: TPL, SPL and U-Boot proper. Depending on the
+ * build flags we can determine whether the current build is for the first
+ * phase of U-Boot or not. If there is no SPL, then this is U-Boot proper. If
+ * there is SPL but no TPL, the the first phase is SPL. If there is TPL, then
+ * it is the first phase.
+ *
+ * @returns true if this is the first phase of U-Boot
+ *
+ */
+static inline bool u_boot_first_phase(void)
+{
+       if (IS_ENABLED(CONFIG_TPL)) {
+               if (IS_ENABLED(CONFIG_TPL_BUILD))
+                       return true;
+       } else if (IS_ENABLED(CONFIG_SPL)) {
+               if (IS_ENABLED(CONFIG_SPL_BUILD))
+                       return true;
+       } else {
+               return true;
+       }
+
+       return false;
+}
+
 struct spl_image_info {
        const char *name;
        u8 os;