diff options
-rw-r--r-- | common/spl/spl_fit.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index d4149c56fd..18269f715a 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -190,6 +190,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, struct spl_image_info image_info; int node, images; int base_offset, align_len = ARCH_DMA_MINALIGN - 1; + int index = 0; /* * Figure out where the external images start. This is the base for the @@ -234,6 +235,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, if (node < 0) { debug("could not find firmware image, trying loadables...\n"); node = spl_fit_get_image_node(fit, images, "loadables", 0); + /* + * If we pick the U-Boot image from "loadables", start at + * the second image when later loading additional images. + */ + index = 1; } if (node < 0) { debug("%s: Cannot find u-boot image node: %d\n", @@ -259,5 +265,26 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, image_info.load_addr = spl_image->load_addr + spl_image->size; spl_load_fit_image(info, sector, fit, base_offset, node, &image_info); + /* Now check if there are more images for us to load */ + for (; ; index++) { + node = spl_fit_get_image_node(fit, images, "loadables", index); + if (node < 0) + break; + + spl_load_fit_image(info, sector, fit, base_offset, node, + &image_info); + + /* + * If the "firmware" image did not provide an entry point, + * use the first valid entry point from the loadables. + */ + if (spl_image->entry_point == -1U && + image_info.entry_point != -1U) + spl_image->entry_point = image_info.entry_point; + } + + if (spl_image->entry_point == -1U || spl_image->entry_point == 0) + spl_image->entry_point = spl_image->load_addr; + return 0; } |