Add support for loading fitImage with device tree overlay image, which is applied to the U-Boot's own device tree. Once the DT is applied, the fitImage loading process is restarted.
This patch allows a usecase where the DTO patches ie. load address in the U-Boot's DT or patches in a new public key for authenticating the subsequently loaded fitImages. Signed-off-by: Marek Vasut <ma...@denx.de> Cc: Pantelis Antoniou <pantelis.anton...@konsulko.com> Cc: Simon Glass <s...@chromium.org> --- common/spl/spl.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/common/spl/spl.c b/common/spl/spl.c index d429ea2c82..2444abbb08 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -140,6 +140,38 @@ void spl_set_header_raw_uboot(struct spl_image_info *spl_image) } #ifdef CONFIG_SPL_LOAD_FIT_FULL +#ifdef CONFIG_OF_LIBFDT_OVERLAY +static int spl_fit_overlay_uboot_fdt_full(const struct image_header *header) +{ + bootm_headers_t images; + const char *fit_uname_config = NULL; + const char *fit_uname_dtbo = "u-boot-dtbo"; + ulong dto_data = 0; + ulong dto_len = 0; + int ret; + + ret = fit_image_load(&images, (ulong)header, + &fit_uname_dtbo, &fit_uname_config, + IH_ARCH_DEFAULT, IH_TYPE_FLATDT, -1, + FIT_LOAD_OPTIONAL, &dto_data, &dto_len); + if (ret < 0) + return 0; + + ret = fdt_overlay_apply_verbose((struct fdt_header *)gd->fdt_blob, + (void *)dto_data); + if (ret) + hang(); + + /* Restart the loading process to cater for the DT changes */ + return -EAGAIN; +} +#else +static int spl_fit_overlay_uboot_fdt_full(const struct image_header *header) +{ + return 0; +} +#endif + /* Parse and load full fitImage in SPL */ static int spl_load_fit_image(struct spl_image_info *spl_image, const struct image_header *header) @@ -152,6 +184,10 @@ static int spl_load_fit_image(struct spl_image_info *spl_image, ulong fw_len = 0, dt_len = 0; int ret; + ret = spl_fit_overlay_uboot_fdt_full(header); + if (ret) + return ret; + ret = fit_image_load(&images, (ulong)header, NULL, &fit_uname_config, IH_ARCH_DEFAULT, IH_TYPE_STANDALONE, -1, @@ -182,7 +218,7 @@ int spl_parse_image_header(struct spl_image_info *spl_image, { #ifdef CONFIG_SPL_LOAD_FIT_FULL int ret = spl_load_fit_image(spl_image, header); - if (!ret) + if (!ret || ret == -EAGAIN) return ret; #endif if (image_get_magic(header) == IH_MAGIC) { -- 2.15.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot