Michal, > On 18 Jan 2018, at 13:56, Michal Simek <mon...@monstr.eu> wrote: > > Hi Philipp, > > > 2017-09-13 21:29 GMT+02:00 Philipp Tomsich > <philipp.toms...@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.toms...@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 <s...@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. > Thanks, > Michal > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot