[U-Boot] [PATCH v1 1/3] add boot_get_loadables() to load listed images

Karl Apsite Karl.Apsite at dornerworks.com
Fri May 15 22:17:37 CEST 2015


Hi Simon,

On 05/15/2015 09:57 AM, Simon Glass wrote:
> Hi Karl,
> 
> On 13 May 2015 at 06:53, Karl Apsite <Karl.Apsite at dornerworks.com> wrote:
>> From: Karl Apsite <karl.apsite at dornerworks.com>
>>
>> Added a trimmed down instance of boot_get_<thing>() to satisfy the
>> minimum requierments of the added feature.  The function follows the
>> normal patterns set by other boot_get<thing>'s, which should make it a
>> bit easier to combine them all together into one boot_get_image()
>> function in a later refactor.
>>
>> Documentation for the new function can be found in source:
>>   common/image.c
>>
>> Signed-off-by: Karl Apsite <Karl.Apsite at dornerworks.com>
>> ---
>>
>>  common/bootm.c      | 22 +++++++++++++
>>  common/image-fit.c  |  8 ++++-
>>  common/image.c      | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  include/bootstage.h |  1 +
>>  include/image.h     |  5 ++-
>>  5 files changed, 127 insertions(+), 2 deletions(-)
>>
> 
> This looks fine to me. Can you please add documentation - doc/uImage.FIT
> 
This will be included in one of the missing commits

> A few bits below.
> 
>> diff --git a/common/bootm.c b/common/bootm.c
>> index 6842029..f04e49b 100644
>> --- a/common/bootm.c
>> +++ b/common/bootm.c
>> @@ -240,6 +240,23 @@ static int bootm_find_fdt(int flag, int argc, char * const argv[])
>>  }
>>  #endif
>>
>> +#if defined(CONFIG_FIT)
>> +static int bootm_find_loadables(int flag, int argc, char * const argv[])
>> +{
>> +       int ret;
>> +
>> +       /* find all of the loadables */
>> +       ret = boot_get_loadable(argc, argv, &images, IH_ARCH_DEFAULT,
>> +                              NULL, NULL);
>> +       if (ret) {
>> +               puts("Loadable(s) is corrupt or invalid\n");
> 
> printf() here (we are trying to avoid using puts() so that one day we
> can make it compatible with the C library puts in that it
> automatically outputs \n).
> 
I will convert puts to printf in all 3 cases.

>> +               return 1;
>> +       }
>> +
>> +       return 0;
>> +}
>> +#endif
>> +
>>  int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[])
>>  {
>>         if (bootm_find_ramdisk(flag, argc, argv))
>> @@ -250,6 +267,11 @@ int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[])
>>                 return 1;
>>  #endif
>>
>> +#if defined(CONFIG_FIT)
>> +       if (bootm_find_loadables(flag, argc, argv))
>> +               return 1;
>> +#endif
>> +
>>         return 0;
>>  }
>>
>> diff --git a/common/image-fit.c b/common/image-fit.c
>> index 245264d..fe23c13 100644
>> --- a/common/image-fit.c
>> +++ b/common/image-fit.c
>> @@ -1544,6 +1544,8 @@ static const char *fit_get_image_type_property(int type)
>>                 return FIT_RAMDISK_PROP;
>>         case IH_TYPE_X86_SETUP:
>>                 return FIT_SETUP_PROP;
>> +       case IH_TYPE_LOADABLE:
>> +               return FIT_LOADABLE_PROP;
>>         }
>>
>>         return "unknown";
>> @@ -1661,7 +1663,11 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
>>         os_ok = image_type == IH_TYPE_FLATDT ||
>>                 fit_image_check_os(fit, noffset, IH_OS_LINUX) ||
>>                 fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
>> -       if (!type_ok || !os_ok) {
>> +
>> +       /* If either of the checks fail, we should report an error, but
> 
> /*
>  * If either ...
>  * what it is
>  */
> 
I'll correct the comment

>> +        * if the image type is coming from the "loadables" field, we
>> +        * don't care about what it is */
>> +       if ((!type_ok || !os_ok) && image_type != IH_TYPE_LOADABLE) {
>>                 fit_image_get_os(fit, noffset, &os);
>>                 printf("No %s %s %s Image\n",
>>                        genimg_get_os_name(os),
>> diff --git a/common/image.c b/common/image.c
>> index fdec496..dc7e795 100644
>> --- a/common/image.c
>> +++ b/common/image.c
>> @@ -1165,6 +1165,99 @@ int boot_get_setup(bootm_headers_t *images, uint8_t arch,
>>  #endif
>>  }
>>
>> +/**
>> + * boot_get_loadable - routine to load a list of binaries to memory
>> + * @argc: Ignored Argument
>> + * @argv: Ignored Argument
>> + * @images: pointer to the bootm images structure
>> + * @arch: expected architecture for the image
>> + * @ld_start: Ignored Argument
>> + * @ld_len: Ignored Argument
>> + *
>> + * boot_get_loadable() will take the given FIT configuration, and look
>> + * for a field named "loadables".  Loadables, is a list of elements in
>> + * the FIT given as strings.  exe:
>> + *   loadables = "linux_kernel at 1", "fdt at 2";
>> + * this function will attempt to parse each string, and load the
>> + * corresponding element from the FIT into memory.  Once placed,
>> + * no aditional actions are taken.
>> + *
>> + * returns:
> 
> @return
I did not see @return in the linked documentation:
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kernel-doc-nano-HOWTO.txt

I will change it to @return

> 
>> + *     0, if only valid images or no images are found
>> + *     error code, if an error occurs during fit_image_load
> 
> Great docs.
> 
>> + */
>> +#if defined(CONFIG_FIT)
>> +int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
>> +               uint8_t arch, const ulong *ld_start, ulong * const ld_len)
>> +{
>> +       /*
>> +        * These variabels are used to hold the current image location
>> +        * in system memory.
>> +        */
s/variabels/variables

>> +       ulong tmp_img_addr;
>> +       /* These are not used */
I will make this comment a bit more clear

>> +       ulong img_data, img_len;
>> +       void *buf;
>> +       char *uname;
>> +       char *uname_end;
>> +       int len, fit_img_result;
> 
> blank line
> 
I looked, and didn't see a blank line, so I take this to mean you WANT a line here.

>> +       /* Check to see if the images struct has a FIT configuration */
>> +       if (genimg_has_config(images)) {
> 
> Can we do...
> 
> if (!genimg_has_config(images)) {
>    debug("## FIT configuration was not specified\n");
>    return 0;
> }
> 
> just to limit the indent level?
> 
Totally!

>> +               /*
>> +                * Obtain the os FIT header from the images struct
>> +                * copy from dataflash if needed
>> +                */
>> +               tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
>> +               tmp_img_addr = genimg_get_image(tmp_img_addr);
>> +               buf = map_sysmem(tmp_img_addr, 0);
>> +               /*
>> +                * Check image type. For FIT images get FIT node
>> +                * and attempt to locate a generic binary.
>> +                */
>> +               switch (genimg_get_format(buf)) {
>> +               case IMAGE_FORMAT_FIT:
>> +                       /*
>> +                        * Try to obtain the 'loadables' field from the
>> +                        * configuration If it exists, then try and load
>> +                        * all of the listed strings
>> +                        *
>> +                        * This logic assumes a character is one byte
>> +                        */
>> +                       uname = (char *)fdt_getprop(buf,
> 
> do you need the cast?
> 
It is a (const void *) without the cast.  An error is tossed if I don't have the
cast because I am discarding the ‘const’ qualifier.  Probably a moot point.

>> +                               fit_conf_get_node(buf, images->fit_uname_cfg),
>> +                               FIT_LOADABLE_PROP, &len);
>> +                       uname_end = uname + len;
>> +                       if (NULL != uname) {
> 
> if (uname)
> 
> but perhaps you should use:
> 
> for (index = 0; !fdt_get_string_index(...index...); index++) {
>    process string
> 
Sure!

>> [snip]
>> +#endif
>> +
>>  #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
>>  /**
>>   * boot_get_cmdline - allocate and initialize kernel cmdline
>> diff --git a/include/bootstage.h b/include/bootstage.h
>> index be44014..4e2e0fb 100644
>> --- a/include/bootstage.h
>> +++ b/include/bootstage.h
>> @@ -168,6 +168,7 @@ enum bootstage_id {
>>         BOOTSTAGE_ID_NAND_FIT_READ = 150,
>>         BOOTSTAGE_ID_NAND_FIT_READ_OK,
>>
>> +       BOOTSTAGE_ID_FIT_LOADS_START = 160,     /* for Loadable Images */
> 
> FIT_LOADABLE_START?
> 
The name is getting a bit long, but I can change it.

>>         /*
>>          * These boot stages are new, higher level, and not directly related
>>          * to the old boot progress numbers. They are useful for recording
>> diff --git a/include/image.h b/include/image.h
>> index 97b96b3..0b0b55b 100644
>> --- a/include/image.h
>> +++ b/include/image.h
>> @@ -244,6 +244,7 @@ struct lmb;
>>  #define IH_TYPE_SOCFPGAIMAGE   19      /* Altera SOCFPGA Preloader     */
>>  #define IH_TYPE_X86_SETUP      20      /* x86 setup.bin Image          */
>>  #define IH_TYPE_LPC32XXIMAGE   21      /* x86 setup.bin Image          */
>> +#define IH_TYPE_LOADABLE       22      /* A list of typeless images    */
>>
>>  /*
>>   * Compression Types
>> @@ -455,7 +456,9 @@ ulong genimg_get_image(ulong img_addr);
>>
>>  int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
>>                 uint8_t arch, ulong *rd_start, ulong *rd_end);
>> -#endif
>> +int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
>> +               uint8_t arch, const ulong *ld_start, ulong * const ld_len);
> 
> Function comment should go here since this is the API definition (move
> it from the C file).
> 
I agree, however by that logic, ALL of the comments on non-static functions in
common/image.c should move.  If that's correct, then it might be a good idea to
defer this until someone can get around to moving the lot of them together, to
maintain consistency.

Current examples:
http://git.denx.de/?p=u-boot.git;a=blob;f=common/image.c;h=fdec496c4bf0e936f26e8876f621d9103c19595c;hb=HEAD#l852

http://git.denx.de/?p=u-boot.git;a=blob;f=common/image-fdt.c;h=7e2da7b3b7218d10c40167e1d80c0d678ff47c1a;hb=HEAD#l201

>> +#endif /* !USE_HOSTCC */
>>
>>  int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
>>                        ulong *setup_start, ulong *setup_len);
>> --
>> 2.3.7
>>
> 
> Regards,
> Simon
> 


More information about the U-Boot mailing list