Record lodable to FDT passed to next boot stage. This is required for spl_invoke_opensbi(), for example, which requires u-boot/kernel load or entry address to fill opensbi_info.next_addr entry.
spl_load_simple_fit() does it, make spl_load_fit_image() also capable of recording lodables. Signed-off-by: Nikita Shubin <[email protected]> --- common/spl/spl_fit.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 4d4a96d1c4c..07e387ac7ee 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -991,7 +991,7 @@ int spl_load_fit_image(struct spl_image_info *spl_image, const char *uname; ulong fw_data = 0, dt_data = 0, img_data = 0; ulong fw_len = 0, dt_len = 0, img_len = 0; - int idx, conf_noffset; + int idx, conf_noffset, noffset; int ret; images.verify = CONFIG_IS_ENABLED(FIT_SIGNATURE); @@ -1048,17 +1048,43 @@ int spl_load_fit_image(struct spl_image_info *spl_image, for (idx = 0; uname = fdt_stringlist_get((const void *)header, conf_noffset, FIT_LOADABLE_PROP, idx, - NULL), uname; + NULL), uname; idx++) { images.verify = CONFIG_IS_ENABLED(FIT_SIGNATURE); - ret = fit_image_load(&images, virt_to_phys((void *)header), - &uname, &fit_uname_config, - IH_ARCH_DEFAULT, IH_TYPE_LOADABLE, -1, - FIT_LOAD_OPTIONAL_NON_ZERO, - &img_data, &img_len); - if (ret < 0) - return ret; + noffset = fit_image_load(&images, virt_to_phys((void *)header), + &uname, &fit_uname_config, + IH_ARCH_DEFAULT, IH_TYPE_LOADABLE, -1, + FIT_LOAD_OPTIONAL_NON_ZERO, + &img_data, &img_len); + if (noffset < 0) + return noffset; + + /* Record our loadables into the FDT */ + if (spl_image->fdt_addr) { + ulong entry_addr = -1; + + fit_image_get_entry((const void *)header, noffset, &entry_addr); + debug(PHASE_PROMPT "record_loadable: %s entry addr: 0x%lx\n", + uname, entry_addr); + + /* Try to make space, so we can inject details on the loadable */ + ret = fdt_increase_size(spl_image->fdt_addr, 256); + if (ret < 0) { + debug(PHASE_PROMPT "record_loadable: couldn't increase space " \ + "for fdt: %d\n", ret); + continue; + } + + ret = fdt_record_loadable(spl_image->fdt_addr, idx, uname, + img_data, img_len, entry_addr, + fdt_getprop((const void *)header, noffset, FIT_TYPE_PROP, NULL), + fdt_getprop((const void *)header, noffset, FIT_OS_PROP, NULL), + fdt_getprop((const void *)header, noffset, FIT_ARCH_PROP, NULL)); + if (ret < 0) + debug(PHASE_PROMPT "record_loadable: couldn't " \ + "record loadable: %s\n", uname); + } } spl_image->flags |= SPL_FIT_FOUND; -- 2.52.0
