> On 1 Feb 2018, at 08:51, Michal Simek <[email protected]> wrote: > > On 18.1.2018 14:17, Dr. Philipp Tomsich wrote: >> Michal, >> >>> On 18 Jan 2018, at 13:56, Michal Simek <[email protected]> wrote: >>> >>> Hi Philipp, >>> >>> >>> 2017-09-13 21:29 GMT+02:00 Philipp Tomsich >>> <[email protected]>: >>> 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 <[email protected]> >>> --- >>> >>> 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 <[email protected]> >>> * >>> - * 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. > > Have you sent this patch?
This had fallen off my radar. The patch is on the list now. Regards, Philipp. _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

