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.

Signed-off-by: Simon Glass <[email protected]>
---

 common/spl/spl.c     |  6 ++++++
 common/spl/spl_fit.c | 22 ++++++++++++++++++++++
 include/spl.h        | 11 +++++++++++
 3 files changed, 39 insertions(+)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 0a9fea4f22d..1bfefaafd93 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -792,6 +792,12 @@ 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)) {
+               ret = spl_write_upl_handoff(&spl_image);
+               if (ret)
+                       printf(SPL_TPL_PROMPT
+                              "UPL hand-off write failed (err=%d)\n", ret);
+       }
        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 03ff9a5db9a..89b5f624340 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -13,6 +13,7 @@
 #include <memalign.h>
 #include <mapmem.h>
 #include <spl.h>
+#include <upl.h>
 #include <sysinfo.h>
 #include <asm/cache.h>
 #include <asm/global_data.h>
@@ -621,6 +622,8 @@ static int spl_fit_load_fpga(struct spl_fit_info *ctx,
                printf("%s: Cannot load the FPGA: %i\n", __func__, ret);
                return ret;
        }
+       upl_add_image(node, fpga_image.load_addr, fpga_image.size,
+                     fdt_getprop(ctx->fit, node, FIT_DESC_PROP, NULL));
 
        return spl_fit_upload_fpga(ctx, node, &fpga_image);
 }
@@ -745,6 +748,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        if (ret)
                return ret;
 
+       upl_add_image(node, spl_image->load_addr, spl_image->size,
+                     fdt_getprop(ctx.fit, node, FIT_DESC_PROP, NULL));
+
        /*
         * For backward compatibility, we treat the first node that is
         * as a U-Boot image, if no OS-type has been declared.
@@ -788,6 +794,8 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                               __func__, index, ret);
                        return ret;
                }
+               upl_add_image(node, image_info.load_addr, image_info.size,
+                             fdt_getprop(ctx.fit, node, FIT_DESC_PROP, NULL));
 
                if (spl_fit_image_is_fpga(ctx.fit, node))
                        spl_fit_upload_fpga(&ctx, node, &image_info);
@@ -824,6 +832,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;
 }
@@ -868,6 +878,9 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
        if (ret < 0)
                return ret;
 
+       upl_add_image(ret, fw_data, fw_len,
+                     fdt_getprop((void *)header, ret, FIT_DESC_PROP, NULL));
+
        spl_image->size = fw_len;
        spl_image->entry_point = fw_data;
        spl_image->load_addr = fw_data;
@@ -887,6 +900,9 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
        if (ret >= 0) {
                spl_image->fdt_addr = (void *)dt_data;
 
+               upl_add_image(ret, dt_data, dt_len,
+                     fdt_getprop((void *)header, ret, FIT_DESC_PROP, NULL));
+
                if (spl_image->os == IH_OS_U_BOOT) {
                        /* HACK: U-Boot expects FDT at a specific address */
                        fdt_hack = spl_image->load_addr + spl_image->size;
@@ -916,7 +932,13 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
                                     &img_data, &img_len);
                if (ret < 0)
                        return ret;
+               upl_add_image(ret, img_data, img_len,
+                     fdt_getprop((void *)header, ret, FIT_DESC_PROP, NULL));
        }
 
+       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/spl.h b/include/spl.h
index e958ace2cc6..ed51e6c862d 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -250,6 +250,9 @@ struct spl_image_info {
        uintptr_t entry_point;
 #if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL)
        void *fdt_addr;
+#endif
+#if CONFIG_IS_ENABLED(UPL)
+       int conf_node;          /* FDT offset to selected configuration node */
 #endif
        u32 boot_device;
        u32 offset;
@@ -921,4 +924,12 @@ void spl_save_restore_data(void);
 int spl_load_fit_image(struct spl_image_info *spl_image,
                       const struct legacy_img_hdr *header);
 
+/**
+ * spl_write_upl_handoff() - Write a Universal Payload hand-off structure
+ *
+ * @spl_image: Information about the image being booted
+ * Return: 0 if OK, -ve on error
+ */
+int spl_write_upl_handoff(struct spl_image_info *spl_image);
+
 #endif
-- 
2.42.0.rc2.253.gd59a3bf2b4-goog

Reply via email to