spl: fdt: Record load/entry fit-images entries in 64bit format
authorMichal Simek <michal.simek@xilinx.com>
Thu, 3 Sep 2020 10:44:51 +0000 (12:44 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 27 Oct 2020 07:13:32 +0000 (08:13 +0100)
The commit 9f45aeb93727 ("spl: fit: implement fdt_record_loadable") which
introduced fdt_record_loadable() state there spl_fit.c is not 64bit safe.
Based on my tests on Xilinx ZynqMP zcu102 platform there shouldn't be a
problem to record these addresses in 64bit format.
The patch adds support for systems which need to load images above 4GB.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/fdt_support.c
common/image-fit.c

index b8a8768..5ae75df 100644 (file)
@@ -611,14 +611,9 @@ int fdt_record_loadable(void *blob, u32 index, const char *name,
        if (node < 0)
                return node;
 
-       /*
-        * We record these as 32bit entities, possibly truncating addresses.
-        * However, spl_fit.c is not 64bit safe either: i.e. we should not
-        * have an issue here.
-        */
-       fdt_setprop_u32(blob, node, "load", load_addr);
+       fdt_setprop_u64(blob, node, "load", load_addr);
        if (entry_point != -1)
-               fdt_setprop_u32(blob, node, "entry", entry_point);
+               fdt_setprop_u64(blob, node, "entry", entry_point);
        fdt_setprop_u32(blob, node, "size", size);
        if (type)
                fdt_setprop_string(blob, node, "type", type);
index d54eff9..c82d4d8 100644 (file)
@@ -791,17 +791,18 @@ static int fit_image_get_address(const void *fit, int noffset, char *name,
                return -1;
        }
 
-       if (len > sizeof(ulong)) {
-               printf("Unsupported %s address size\n", name);
-               return -1;
-       }
-
        cell_len = len >> 2;
        /* Use load64 to avoid compiling warning for 32-bit target */
        while (cell_len--) {
                load64 = (load64 << 32) | uimage_to_cpu(*cell);
                cell++;
        }
+
+       if (len > sizeof(ulong) && (uint32_t)(load64 >> 32)) {
+               printf("Unsupported %s address size\n", name);
+               return -1;
+       }
+
        *load = (ulong)load64;
 
        return 0;