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

