[U-Boot] [PATCH 06/15] spl: fit: implement recording of loadables into /fit-images

Michal Simek monstr at monstr.eu
Thu Jan 18 13:40:55 UTC 2018


On 18.1.2018 14:17, Dr. Philipp Tomsich wrote:
> Michal,
> 
>> On 18 Jan 2018, at 13:56, Michal Simek <monstr at monstr.eu> wrote:
>>
>> Hi Philipp,
>>
>>
>> 2017-09-13 21:29 GMT+02:00 Philipp Tomsich <philipp.tomsich at theobroma-systems.com>:
>> If a FDT was loaded (e.g. to append it to U-Boot image), we store it's
>> address and record information for all loadables into this FDT.  This
>> allows us to easily keep track of images for multiple privilege levels
>> (e.g. with ATF) or of firmware images preloaded into temporary
>> locations (e.g. PMU firmware that may overlap the SPL stage).
>>
>> Signed-off-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
>> ---
>>
>>  common/spl/spl_fit.c | 95 ++++++++++++++++++++++++++++++++++++++++++++--------
>>  1 file changed, 81 insertions(+), 14 deletions(-)
>>
>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>> index 9f05e1e..6dc0969 100644
>> --- a/common/spl/spl_fit.c
>> +++ b/common/spl/spl_fit.c
>> @@ -2,7 +2,7 @@
>>   * Copyright (C) 2016 Google, Inc
>>   * Written by Simon Glass <sjg at chromium.org>
>>   *
>> - * SPDX-License-Identifier:     GPL-2.0+
>> + * SPDX-License-Identifier:    GPL-2.0+
>>   */
>>
>>  #include <common.h>
>> @@ -16,22 +16,24 @@
>>  #endif
>>
>>  /**
>> - * spl_fit_get_image_node(): By using the matching configuration subnode,
>> + * spl_fit_get_image_name(): By using the matching configuration subnode,
>>   * retrieve the name of an image, specified by a property name and an index
>>   * into that.
>>   * @fit:       Pointer to the FDT blob.
>>   * @images:    Offset of the /images subnode.
>>   * @type:      Name of the property within the configuration subnode.
>>   * @index:     Index into the list of strings in this property.
>> + * @outname:   Name of the image
>>   *
>> - * Return:     the node offset of the respective image node or a negative
>> - *             error number.
>> + * Return:     0 on success, or a negative error number
>>   */
>> -static int spl_fit_get_image_node(const void *fit, int images,
>> -                                 const char *type, int index)
>> +static int spl_fit_get_image_name(const void *fit, int images,
>> +                                 const char *type, int index,
>> +                                 char **outname)
>>  {
>>         const char *name, *str;
>> -       int node, conf_node;
>> +       __maybe_unused int node;
>> +       int conf_node;
>>         int len, i;
>>
>>         conf_node = fit_find_config_node(fit);
>> @@ -63,7 +65,35 @@ static int spl_fit_get_image_node(const void *fit, int images,
>>                 }
>>         }
>>
>> +       *outname = (char *)str;
>> +       return 0;
>> +}
>> +
>> +/**
>> + * spl_fit_get_image_node(): By using the matching configuration subnode,
>> + * retrieve the name of an image, specified by a property name and an index
>> + * into that.
>> + * @fit:       Pointer to the FDT blob.
>> + * @images:    Offset of the /images subnode.
>> + * @type:      Name of the property within the configuration subnode.
>> + * @index:     Index into the list of strings in this property.
>> + *
>> + * Return:     the node offset of the respective image node or a negative
>> + *             error number.
>> + */
>> +static int spl_fit_get_image_node(const void *fit, int images,
>> +                                 const char *type, int index)
>> +{
>> +       char *str;
>> +       int err;
>> +       int node;
>> +
>> +       err = spl_fit_get_image_name(fit, images, type, index, &str);
>> +       if (err)
>> +               return err;
>> +
>>         debug("%s: '%s'\n", type, str);
>> +
>>         node = fdt_subnode_offset(fit, images, str);
>>         if (node < 0) {
>>                 debug("cannot find image node '%s': %d\n", str, node);
>> @@ -116,15 +146,15 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
>>   * @info:      points to information about the device to load data from
>>   * @sector:    the start sector of the FIT image on the device
>>   * @fit:       points to the flattened device tree blob describing the FIT
>> - *             image
>> + *             image
>>   * @base_offset: the beginning of the data area containing the actual
>>   *             image data, relative to the beginning of the FIT
>>   * @node:      offset of the DT node describing the image to load (relative
>> - *             to @fit)
>> + *             to @fit)
>>   * @image_info:        will be filled with information about the loaded image
>> - *             If the FIT node does not contain a "load" (address) property,
>> - *             the image gets loaded to the address pointed to by the
>> - *             load_addr member in this struct.
>> + *             If the FIT node does not contain a "load" (address) property,
>> + *             the image gets loaded to the address pointed to by the
>> + *             load_addr member in this struct.
>>   *
>>   * Return:     0 on success or a negative error number.
>>   */
>> @@ -236,6 +266,35 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
>>         image_info.load_addr = spl_image->load_addr + spl_image->size;
>>         ret = spl_load_fit_image(info, sector, fit, base_offset, node,
>>                                  &image_info);
>> +
>> +       if (ret < 0)
>> +               return ret;
>> +
>> +       /* Make the load-address of the FDT available for the SPL framework */
>> +       spl_image->fdt_addr = (void *)image_info.load_addr;
>> +       /* Try to make space, so we can inject details on the loadables */
>> +       ret = fdt_shrink_to_minimum(spl_image->fdt_addr, 8192);
>> +
>> +       return ret;
>> +}
>> +
>> +static int spl_fit_record_loadable(const void *fit, int images, int index,
>> +                                  void *blob, struct spl_image_info *image)
>> +{
>> +       char *name;
>> +       int node, ret;
>> +
>> +       ret = spl_fit_get_image_name(fit, images, "loadables",
>> +                                    index, &name);
>> +       if (ret < 0)
>> +               return ret;
>> +
>> +       node = spl_fit_get_image_node(fit, images, "loadables", index);
>> +
>> +       ret = fdt_record_loadable(blob, index, name, image->load_addr,
>> +                                 image->size, image->entry_point,
>> +                                 fdt_getprop(fit, node, "type", NULL),
>> +                                 fdt_getprop(fit, node, "os", NULL));
>>
>>
>> Calling this fdt_record_loadable is causing compilation issue when CONFIG_ARCH_FIXUP_FDT_MEMORY is disabled.
>>
>> common/spl/built-in.o: In function `spl_fit_record_loadable':
>> /mnt/disk/u-boot/common/spl/spl_fit.c:308: undefined reference to `fdt_record_loadable'
>> /mnt/disk/u-boot/common/spl/spl_fit.c:308:(.text.spl_load_simple_fit+0x2ec): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `fdt_record_loadable'
>> make[1]: *** [spl/u-boot-spl] Error 1
>>
>> You can see this issue with xilinx_zynqmp_zcu102_rev1_0_defconfig when you disable that option.
>> Just a note adding dependency to Kconfig is not a proper solution because for this combination I need fit image support.
>>
>> Can you please propose solution?
> 
> Thanks for the heads-up.
> 
> Sloppy editing on my part. The fdt_record_loadable function needs to be moved out of
> the #ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY guard in common/fdt_support.c.
> I’ll send a patch.

Will wait for a patch.

Thanks,
Michal


-- 
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP SoCs


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180118/206ddfa5/attachment.sig>


More information about the U-Boot mailing list