[U-Boot] [PATCH 06/15] spl: fit: implement recording of loadables into /fit-images
Michal Simek
monstr at monstr.eu
Thu Feb 1 07:51:45 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.
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
-------------- 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/20180201/45a5102f/attachment.sig>
More information about the U-Boot
mailing list