[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