summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/spl/spl_fit.c46
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