]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spl: Plumb in the Universal Payload handoff
authorSimon Glass <sjg@chromium.org>
Wed, 7 Aug 2024 22:47:33 +0000 (16:47 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 9 Aug 2024 22:03:20 +0000 (16:03 -0600)
Specify the FIT and include information about each loaded image, as
required by the UPL handoff.

Write the UPL handoff into the bloblist before jumping to the next phase.

Control this using a runtime flag to avoid conflicting with other
handoff mechanisms.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/image-fit.c
common/spl/spl.c
common/spl/spl_fit.c
include/asm-generic/global_data.h

index 9253f81fff5430e84eb4c5ec48eb9b2f4ff8c8de..7d56f0b5e6ed39a75e029b09dc95d605835c0f91 100644 (file)
@@ -36,6 +36,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #include <bootm.h>
 #include <image.h>
 #include <bootstage.h>
+#include <upl.h>
 #include <u-boot/crc.h>
 
 /*****************************************************************************/
@@ -2294,6 +2295,8 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
 
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_LOAD);
 
+       upl_add_image(fit, noffset, load, len);
+
        *datap = load;
        *lenp = len;
        if (fit_unamep)
index 7794ddccade187a91eafa942ba5e4dda47d20bf9..d6a364de6ee89d26ed719a27edb88a906eb5a811 100644 (file)
@@ -810,6 +810,14 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                        printf(SPL_TPL_PROMPT
                               "SPL hand-off write failed (err=%d)\n", ret);
        }
+       if (CONFIG_IS_ENABLED(UPL_OUT) && (gd->flags & GD_FLG_UPL)) {
+               ret = spl_write_upl_handoff(&spl_image);
+               if (ret) {
+                       printf(SPL_TPL_PROMPT
+                              "UPL hand-off write failed (err=%d)\n", ret);
+                       hang();
+               }
+       }
        if (CONFIG_IS_ENABLED(BLOBLIST)) {
                ret = bloblist_finish();
                if (ret)
index 527a5691ac6a3e84e6386e2cfe158c9507d8965f..1ad5a69d807866a86a058e8d34992849d45c0438 100644 (file)
@@ -12,6 +12,7 @@
 #include <memalign.h>
 #include <mapmem.h>
 #include <spl.h>
+#include <upl.h>
 #include <sysinfo.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
@@ -336,6 +337,8 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
                        image_info->entry_point = FDT_ERROR;
        }
 
+       upl_add_image(fit, node, load_addr, length);
+
        return 0;
 }
 
@@ -847,6 +850,8 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                spl_image->entry_point = spl_image->load_addr;
 
        spl_image->flags |= SPL_FIT_FOUND;
+       upl_set_fit_info(map_to_sysmem(ctx.fit), ctx.conf_node,
+                        spl_image->entry_point);
 
        return 0;
 }
@@ -943,5 +948,8 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
        }
        spl_image->flags |= SPL_FIT_FOUND;
 
+       upl_set_fit_info(map_to_sysmem(header), conf_noffset,
+                        spl_image->entry_point);
+
        return 0;
 }
index 94d054ee54ec1f101de6bd348ea0d145ac4b180c..19c66e1fe5d83094de0ef8099e44f104ba0bd8a1 100644 (file)
@@ -716,6 +716,10 @@ enum gd_flags {
         * @GD_FLG_HUSH_MODERN_PARSER: Use hush 2021 parser.
         */
        GD_FLG_HUSH_MODERN_PARSER = 0x2000000,
+       /**
+        * @GD_FLG_UPL: Read/write a Universal Payload (UPL) handoff
+        */
+       GD_FLG_UPL = 0x4000000,
 };
 
 #endif /* __ASSEMBLY__ */