[U-Boot] [PATCH 05/17] SPL: FIT: allow loading multiple images
Simon Glass
sjg at chromium.org
Wed Mar 8 21:00:59 UTC 2017
Hi Andre,
On 28 February 2017 at 19:25, Andre Przywara <andre.przywara at arm.com> wrote:
> So far we were not using the FIT image format to its full potential:
> The SPL FIT loader was just loading the first image from the /images
> node plus one of the listed DTBs.
> Now with the refactored loader code it's easy to load an arbitrary
> number of images in addition to the two mentioned above.
> As described in the FIT image source file format description, iterate
> over all images listed at the "loadables" property in the configuration
> node and load every image at its desired location.
> This allows to load any kind of images:
> - firmware images to execute before U-Boot proper (for instance
> ARM Trusted Firmware (ATF))
> - firmware images for management processors (SCP, arisc, ...)
> - firmware images for devices like WiFi controllers
> - bit files for FPGAs
> - additional configuration data
> - kernels and/or ramdisks
> The actual usage of this feature would be platform and/or board specific.
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> ---
> common/spl/spl_fit.c | 32 ++++++++++++++++++++++++++++----
> 1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index ad5ba15..5583e09 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -178,10 +178,7 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
> if (image_info) {
> image_info->load_addr = load_addr;
> image_info->size = length;
> - if (entry == -1UL)
> - image_info->entry_point = load_addr;
> - else
> - image_info->entry_point = entry;
> + image_info->entry_point = entry;
Need to update function comment to indicate that it can put -1 in here.
> }
>
> return 0;
> @@ -196,6 +193,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> struct spl_image_info image_info;
> int node, images;
> int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
> + int index = 0;
>
> /*
> * Figure out where the external images start. This is the base for the
> @@ -240,6 +238,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> if (node < 0) {
> debug("could not find firmware image, trying loadables...\n");
> node = spl_fit_get_image_node(fit, images, "loadables", 0);
> + /*
> + * If we pick the U-Boot image from "loadables", start at
> + * the second image when later loading additional images.
> + */
> + index = 1;
> }
> if (node < 0) {
> debug("%s: Cannot find u-boot image node: %d\n",
> @@ -265,5 +268,26 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
> image_info.load_addr = spl_image->load_addr + spl_image->size;
> spl_load_fit_image(info, sector, fit, base_offset, node, &image_info);
>
> + /* Now check if there are more images for us to load */
> + for (; ; index++) {
> + node = spl_fit_get_image_node(fit, images, "loadables", index);
> + if (node < 0)
> + break;
> +
> + spl_load_fit_image(info, sector, fit, base_offset, node,
> + &image_info);
Error check?
> +
> + /*
> + * If the "firmware" image did not provide an entry point,
> + * use the first valid entry point from the loadables.
> + */
> + if (spl_image->entry_point == -1UL &&
> + image_info.entry_point != -1UL)
> + spl_image->entry_point = image_info.entry_point;
> + }
> +
> + if (spl_image->entry_point == -1UL || spl_image->entry_point == 0)
Why does 0 mean there is no entry point? I suppose that is safe, but
would anyone use this?
> + spl_image->entry_point = spl_image->load_addr;
> +
> return 0;
> }
> --
> 2.8.2
>
Regards,
Simon
More information about the U-Boot
mailing list