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 <s...@chromium.org>
---

(no changes since v2)

Changes in v2:
- Hang when something goes wrong, to avoid a broken boot
- Add a runtime flag to enable UPL
- Put upl_image() calls in a common place

 boot/image-fit.c                  | 4 ++++
 common/spl/spl.c                  | 8 ++++++++
 common/spl/spl_fit.c              | 9 +++++++++
 include/asm-generic/global_data.h | 4 ++++
 4 files changed, 25 insertions(+)

diff --git a/boot/image-fit.c b/boot/image-fit.c
index 9253f81fff5..c38ccd6754f 100644
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -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,9 @@ int fit_image_load(struct bootm_headers *images, ulong 
addr,
 
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_LOAD);
 
+       upl_add_image(noffset, load, len,
+                     fdt_getprop(fit, noffset, FIT_DESC_PROP, NULL));
+
        *datap = load;
        *lenp = len;
        if (fit_unamep)
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 7794ddccade..d6a364de6ee 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -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)
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 527a5691ac6..03a2ad4ebe7 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -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,9 @@ static int load_simple_fit(struct spl_load_info *info, 
ulong fit_offset,
                        image_info->entry_point = FDT_ERROR;
        }
 
+       upl_add_image(node, load_addr, length,
+                     fdt_getprop(fit, node, FIT_DESC_PROP, NULL));
+
        return 0;
 }
 
@@ -847,6 +851,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 +949,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;
 }
diff --git a/include/asm-generic/global_data.h 
b/include/asm-generic/global_data.h
index 98d822530d8..37643a4bbb9 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -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__ */
-- 
2.34.1

Reply via email to