[U-Boot] [PATCH 05/17] SPL: FIT: allow loading multiple images

Simon Glass sjg at chromium.org
Sat Apr 1 04:22:46 UTC 2017


Hi Andre,

On 26 March 2017 at 19:19, André Przywara <andre.przywara at arm.com> wrote:
> On 08/03/17 21:00, Simon Glass wrote:
>> 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?
>
> So this is due to U-Boot's own Makefile, which sets
> CONFIG_SYS_UBOOT_START to 0 if it isn't already defined. This then gets
> passed on to mkimage -f auto as the -e argument.
> So today's FIT images have 0 as an entry point - a least on sunxi.  As I
> wanted to retain compatibility with that, I added this check.
> Maybe sunxi (and other platforms?) should explicitly define the entry
> point to avoid it being set to 0, or we should default to the load
> address as the fallback in absence of such an explicit definition.
>
> In any case I wanted to keep existing u-boot.img files booting, so I
> added this safe guard here to do "the right thing (tm)".

I very much doubt that 0 is needed as a default, so it should be OK to
break that. I'm almost certain there is no test to verify it.
Sometimes there are wierd things in the code that we should try to
drop.

>
> I added a comment there to point this out.
>
> Cheers,
> Andre.

Regards,
Simon


More information about the U-Boot mailing list