[U-Boot] [PATCH v4 02/20] SPL: FIT: rework U-Boot image loading

Kever Yang kever.yang at rock-chips.com
Tue May 16 01:35:50 UTC 2017



On 04/26/2017 08:32 AM, Andre Przywara wrote:
> Currently the SPL FIT loader always looks only for the first image in
> the /images node a FIT tree, which it loads and later executes.
>
> Generalize this by looking for a "firmware" property in the matched
> configuration subnode, or, if that does not exist, for the first string
> in the "loadables" property. Then using the string in that property,
> load the image of that name from the /images node.
> This still loads only one image at the moment, but refactors the code to
> allow extending this in a following patch.
> To simplify later re-usage, we also generalize the spl_fit_select_index()
> function to not return the image location, but just the node offset.
>
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> Reviewed-by: Lokesh Vutla <lokeshvuta at ti.com>
> Reviewed-by: Simon Glass <sjg at chromium.org>

Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Tested-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>   common/spl/spl_fit.c | 46 ++++++++++++++++++++++++++++++++--------------
>   1 file changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 67372ca..85af980 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -60,14 +60,25 @@ static int spl_fit_find_config_node(const void *fdt)
>   	return -ENOENT;
>   }
>   
> -static int spl_fit_select_index(const void *fit, int images, int *offsetp,
> -				const char *type, int index)
> +/**
> + * 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)
>   {
>   	const char *name, *str;
>   	int node, conf_node;
>   	int len, i;
>   
> -	*offsetp = 0;
>   	conf_node = spl_fit_find_config_node(fit);
>   	if (conf_node < 0) {
>   #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
> @@ -104,10 +115,7 @@ static int spl_fit_select_index(const void *fit, int images, int *offsetp,
>   		return -EINVAL;
>   	}
>   
> -	*offsetp = fdt_getprop_u32(fit, node, "data-offset");
> -	len = fdt_getprop_u32(fit, node, "data-size");
> -
> -	return len;
> +	return node;
>   }
>   
>   static int get_aligned_image_offset(struct spl_load_info *info, int offset)
> @@ -193,15 +201,22 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
>   	if (count == 0)
>   		return -EIO;
>   
> -	/* find the firmware image to load */
> +	/* find the node holding the images information */
>   	images = fdt_path_offset(fit, FIT_IMAGES_PATH);
>   	if (images < 0) {
>   		debug("%s: Cannot find /images node: %d\n", __func__, images);
>   		return -1;
>   	}
> -	node = fdt_first_subnode(fit, images);
> +
> +	/* find the U-Boot image */
> +	node = spl_fit_get_image_node(fit, images, "firmware", 0);
>   	if (node < 0) {
> -		debug("%s: Cannot find first image node: %d\n", __func__, node);
> +		debug("could not find firmware image, trying loadables...\n");
> +		node = spl_fit_get_image_node(fit, images, "loadables", 0);
> +	}
> +	if (node < 0) {
> +		debug("%s: Cannot find u-boot image node: %d\n",
> +		      __func__, node);
>   		return -1;
>   	}
>   
> @@ -243,10 +258,13 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
>   	memcpy(dst, src, data_size);
>   
>   	/* Figure out which device tree the board wants to use */
> -	fdt_len = spl_fit_select_index(fit, images, &fdt_offset,
> -				       FIT_FDT_PROP, 0);
> -	if (fdt_len < 0)
> -		return fdt_len;
> +	node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
> +	if (node < 0) {
> +		debug("%s: cannot find FDT node\n", __func__);
> +		return node;
> +	}
> +	fdt_offset = fdt_getprop_u32(fit, node, "data-offset");
> +	fdt_len = fdt_getprop_u32(fit, node, "data-size");
>   
>   	/*
>   	 * Read the device tree and place it after the image. There may be




More information about the U-Boot mailing list