spl: fit: Support both external and embedded data
authorYork Sun <york.sun@nxp.com>
Tue, 15 Aug 2017 18:14:44 +0000 (11:14 -0700)
committerYork Sun <york.sun@nxp.com>
Mon, 11 Sep 2017 14:55:36 +0000 (07:55 -0700)
SPL supports U-Boot image in FIT format which has data outside of
FIT structure. This adds support for embedded data for normal FIT
images.

Signed-off-by: York Sun <york.sun@nxp.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/spl/spl_fit.c
doc/uImage.FIT/source_file_format.txt

index fe41ce02d229b345f1e7cff078a1a4d4b18a7cd2..9449a225fff20711fb3377b28985ecfb7d546ba2 100644 (file)
@@ -132,14 +132,16 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
                              void *fit, ulong base_offset, int node,
                              struct spl_image_info *image_info)
 {
-       ulong offset;
+       int offset;
        size_t length;
+       int len;
        ulong load_addr, load_ptr;
        void *src;
        ulong overhead;
        int nr_sectors;
        int align_len = ARCH_DMA_MINALIGN - 1;
        uint8_t image_comp = -1, type = -1;
+       const void *data;
 
        if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
                if (fit_image_get_comp(fit, node, &image_comp))
@@ -153,28 +155,40 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
                        debug("%s ", genimg_get_type_name(type));
        }
 
-       offset = fdt_getprop_u32(fit, node, "data-offset");
-       if (offset == FDT_ERROR)
-               return -ENOENT;
-       offset += base_offset;
-       length = fdt_getprop_u32(fit, node, "data-size");
-       if (length == FDT_ERROR)
-               return -ENOENT;
-       load_addr = fdt_getprop_u32(fit, node, "load");
-       if (load_addr == FDT_ERROR && image_info)
+       if (fit_image_get_load(fit, node, &load_addr))
                load_addr = image_info->load_addr;
-       load_ptr = (load_addr + align_len) & ~align_len;
 
-       overhead = get_aligned_image_overhead(info, offset);
-       nr_sectors = get_aligned_image_size(info, length, offset);
+       if (!fit_image_get_data_offset(fit, node, &offset)) {
+               /* External data */
+               offset += base_offset;
+               if (fit_image_get_data_size(fit, node, &len))
+                       return -ENOENT;
 
-       if (info->read(info, sector + get_aligned_image_offset(info, offset),
-                      nr_sectors, (void*)load_ptr) != nr_sectors)
-               return -EIO;
-       debug("image dst=%lx, offset=%lx, size=%lx\n", load_ptr, offset,
-             (unsigned long)length);
+               load_ptr = (load_addr + align_len) & ~align_len;
+               length = len;
+
+               overhead = get_aligned_image_overhead(info, offset);
+               nr_sectors = get_aligned_image_size(info, length, offset);
+
+               if (info->read(info,
+                              sector + get_aligned_image_offset(info, offset),
+                              nr_sectors, (void *)load_ptr) != nr_sectors)
+                       return -EIO;
+
+               debug("External data: dst=%lx, offset=%x, size=%lx\n",
+                     load_ptr, offset, (unsigned long)length);
+               src = (void *)load_ptr + overhead;
+       } else {
+               /* Embedded data */
+               if (fit_image_get_data(fit, node, &data, &length)) {
+                       puts("Cannot get image data/size\n");
+                       return -ENOENT;
+               }
+               debug("Embedded data: dst=%lx, size=%lx\n", load_addr,
+                     (unsigned long)length);
+               src = (void *)data;
+       }
 
-       src = (void *)load_ptr + overhead;
 #ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
        board_fit_image_post_process(&src, &length);
 #endif
index 136d3d7078eed79a7c4e68109e955974efb8b2c8..32825eda8d571b1d3eca1e100aec394ed0a3ec63 100644 (file)
@@ -288,6 +288,10 @@ The 'data-offset' property can be substituted with 'data-position', which
 defines an absolute position or address as the offset. This is helpful when
 booting U-Boot proper before performing relocation.
 
+Normal kernel FIT image has data embedded within FIT structure. U-Boot image
+for SPL boot has external data. Existence of 'data-offset' can be used to
+identify which format is used.
+
 9) Examples
 -----------