image: Support FDTs already loaded at their load address
authorStephen Warren <swarren@nvidia.com>
Tue, 1 Nov 2011 06:28:21 +0000 (06:28 +0000)
committerWolfgang Denk <wd@denx.de>
Tue, 6 Mar 2012 21:18:48 +0000 (22:18 +0100)
boot_get_fdt() expects a uImage-wrapped FDT to be loaded to a staging
location, and then memmove()s it to the load address specified in the
header. This change enhances boot_get_fdt() to detect when the image has
already been loaded to the correct address, and skip this memmove(). The
detection algorithm was written to match the equivalent for the kernel;
see bootm_load_os()'s IH_COMP_NONE case.

v2: New patch

Signed-off-by: Stephen Warren <swarren@nvidia.com>
common/image.c

index fbdc40a4b2f06a79b8faf4917463559c8d900387..95c7a15775f411384a899cddb5b87a4c54023667 100644 (file)
@@ -1374,7 +1374,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
        const image_header_t *fdt_hdr;
        ulong           fdt_addr;
        char            *fdt_blob = NULL;
-       ulong           image_start, image_end;
+       ulong           image_start, image_data, image_end;
        ulong           load_start, load_end;
 #if defined(CONFIG_FIT)
        void            *fit_hdr;
@@ -1482,21 +1482,28 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                         * make sure we don't overwrite initial image
                         */
                        image_start = (ulong)fdt_hdr;
+                       image_data = (ulong)image_get_data(fdt_hdr);
                        image_end = image_get_image_end(fdt_hdr);
 
                        load_start = image_get_load(fdt_hdr);
                        load_end = load_start + image_get_data_size(fdt_hdr);
 
+                       if (load_start == image_start ||
+                           load_start == image_data) {
+                               fdt_blob = (char *)image_data;
+                               break;
+                       }
+
                        if ((load_start < image_end) && (load_end > image_start)) {
                                fdt_error("fdt overwritten");
                                goto error;
                        }
 
                        debug("   Loading FDT from 0x%08lx to 0x%08lx\n",
-                                       image_get_data(fdt_hdr), load_start);
+                                       image_data, load_start);
 
                        memmove((void *)load_start,
-                                       (void *)image_get_data(fdt_hdr),
+                                       (void *)image_data,
                                        image_get_data_size(fdt_hdr));
 
                        fdt_blob = (char *)load_start;