boot: Respect the load_op in fit_image_load()
authorSimon Glass <sjg@chromium.org>
Thu, 19 Dec 2024 18:28:53 +0000 (11:28 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 27 Dec 2024 21:16:10 +0000 (15:16 -0600)
Some code has crept in which ignores this parameter. Fix this and add a
little debugging.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: b1307f884a9 ("fit: Support compression for non-kernel components (e.g. FDT)")

boot/image-fit.c

index 439ff51..db7fb61 100644 (file)
@@ -2226,6 +2226,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
        data = map_to_sysmem(buf);
        load = data;
        if (load_op == FIT_LOAD_IGNORED) {
+               log_debug("load_op: not loading\n");
                /* Don't load */
        } else if (fit_image_get_load(fit, noffset, &load)) {
                if (load_op == FIT_LOAD_REQUIRED) {
@@ -2262,10 +2263,13 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
        /* Kernel images get decompressed later in bootm_load_os(). */
        if (!fit_image_get_comp(fit, noffset, &comp) &&
            comp != IH_COMP_NONE &&
+           load_op != FIT_LOAD_IGNORED &&
            !(image_type == IH_TYPE_KERNEL ||
              image_type == IH_TYPE_KERNEL_NOLOAD ||
              image_type == IH_TYPE_RAMDISK)) {
                ulong max_decomp_len = len * 20;
+
+               log_debug("decompressing image\n");
                if (load == data) {
                        loadbuf = malloc(max_decomp_len);
                        load = map_to_sysmem(loadbuf);
@@ -2280,6 +2284,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
                }
                len = load_end - load;
        } else if (load != data) {
+               log_debug("copying\n");
                loadbuf = map_sysmem(load, len);
                memcpy(loadbuf, buf, len);
        }
@@ -2289,8 +2294,9 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
                     " please fix your .its file!\n");
 
        /* verify that image data is a proper FDT blob */
-       if (image_type == IH_TYPE_FLATDT && fdt_check_header(loadbuf)) {
-               puts("Subimage data is not a FDT");
+       if (load_op != FIT_LOAD_IGNORED && image_type == IH_TYPE_FLATDT &&
+           fdt_check_header(loadbuf)) {
+               puts("Subimage data is not a FDT\n");
                return -ENOEXEC;
        }