diff options
-rw-r--r-- | common/spl/spl_fit.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 67372cadba..85af9805af 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 |