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

Michal Simek monstr at monstr.eu
Thu Jan 18 12:56:28 UTC 2018


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,
Michal


More information about the U-Boot mailing list