From e37ae40e9dec9af417c19de72f76becebf160730 Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Tue, 1 Nov 2011 06:28:21 +0000 Subject: [PATCH] image: Support FDTs already loaded at their load address 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 --- common/image.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/common/image.c b/common/image.c index fbdc40a4b2..95c7a15775 100644 --- a/common/image.c +++ b/common/image.c @@ -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; -- 2.25.1