ulong size;
unsigned long count;
struct spl_image_info image_info;
- int node, images, ret;
+ bool boot_os = false;
+ int node = -1;
+ int images, ret;
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
- * data-offset properties in each image.
+ * For FIT with external data, figure out where the external images
+ * start. This is the base for the data-offset properties in each
+ * image.
*/
size = fdt_totalsize(fit);
size = (size + 3) & ~3;
*
* In fact the FIT has its own load address, but we assume it cannot
* be before CONFIG_SYS_TEXT_BASE.
+ *
+ * For FIT with data embedded, data is loaded as part of FIT image.
+ * For FIT with external data, data is not loaded in this step.
*/
fit = (void *)((CONFIG_SYS_TEXT_BASE - size - info->bl_len -
align_len) & ~align_len);
return -1;
}
+#ifdef CONFIG_SPL_OS_BOOT
+ /* Find OS image first */
+ node = spl_fit_get_image_node(fit, images, FIT_KERNEL_PROP, 0);
+ if (node < 0)
+ debug("No kernel image.\n");
+ else
+ boot_os = true;
+#endif
/* find the U-Boot image */
- node = spl_fit_get_image_node(fit, images, "firmware", 0);
+ if (node < 0)
+ node = spl_fit_get_image_node(fit, images, "firmware", 0);
if (node < 0) {
debug("could not find firmware image, trying loadables...\n");
node = spl_fit_get_image_node(fit, images, "loadables", 0);
if (ret)
return ret;
+#ifdef CONFIG_SPL_OS_BOOT
+ if (!fit_image_get_os(fit, node, &spl_image->os))
+ debug("Image OS is %s\n", genimg_get_os_name(spl_image->os));
+#else
spl_image->os = IH_OS_U_BOOT;
+#endif
- /* Figure out which device tree the board wants to use */
- 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;
- }
+ if (!boot_os) {
+ /* Figure out which device tree the board wants to use */
+ 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;
+ }
- /*
- * Read the device tree and place it after the image.
- * Align the destination address to ARCH_DMA_MINALIGN.
- */
- image_info.load_addr = spl_image->load_addr + spl_image->size;
- ret = spl_load_fit_image(info, sector, fit, base_offset, node,
- &image_info);
- if (ret < 0)
- return ret;
+ /*
+ * Read the device tree and place it after the image.
+ * Align the destination address to ARCH_DMA_MINALIGN.
+ */
+ image_info.load_addr = spl_image->load_addr + spl_image->size;
+ ret = spl_load_fit_image(info, sector, fit, base_offset, node,
+ &image_info);
+ if (ret < 0)
+ return ret;
+ }
/* Now check if there are more images for us to load */
for (; ; index++) {