On 18.1.2018 14:17, Dr. Philipp Tomsich wrote: > 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.
Have you sent this 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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot