spl: fit: don't load the firmware twice
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Tue, 22 Oct 2019 14:39:10 +0000 (16:39 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 7 Jan 2020 16:12:47 +0000 (11:12 -0500)
When u-boot.img is a FIT image generated automatically by mkimage, the
configuration node has the following structure:
conf-1 {
   description = "k3-am654-base-board";
   firmware = "firmware-1";
   loadables = "firmware-1";
   fdt = "fdt-1";
};

The firmware is referenced twice. Once by the 'firmware' property and
once by the 'loadables' property. Currently this result in the firmware
being loaded twice. This is not a big problem but has an impact on the
boot time.
Fixing it by not loading a loadable image if it is also the firmware image.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Andreas Dannenberg <dannenberg@ti.com>
common/spl/spl_fit.c

index cbc00a4..346f9ed 100644 (file)
@@ -373,6 +373,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        int images, ret;
        int base_offset, hsize, align_len = ARCH_DMA_MINALIGN - 1;
        int index = 0;
+       int firmware_node;
 
        /*
         * For FIT with external data, figure out where the external images
@@ -502,6 +503,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                spl_fit_append_fdt(spl_image, info, sector, fit,
                                   images, base_offset);
 
+       firmware_node = node;
        /* Now check if there are more images for us to load */
        for (; ; index++) {
                uint8_t os_type = IH_OS_INVALID;
@@ -510,6 +512,14 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                if (node < 0)
                        break;
 
+               /*
+                * if the firmware is also a loadable, skip it because
+                * it already has been loaded. This is typically the case with
+                * u-boot.img generated by mkimage.
+                */
+               if (firmware_node == node)
+                       continue;
+
                ret = spl_load_fit_image(info, sector, fit, base_offset, node,
                                         &image_info);
                if (ret < 0)