summaryrefslogtreecommitdiff
path: root/common/image.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2011-11-01 06:28:21 +0000
committerWolfgang Denk <wd@denx.de>2012-03-06 22:18:48 +0100
commite37ae40e9dec9af417c19de72f76becebf160730 (patch)
tree0c0a995c06c4153459089636910258473f570db3 /common/image.c
parent23498935faa59922c90f636e1ce8364510803819 (diff)
downloadu-boot-imx-e37ae40e9dec9af417c19de72f76becebf160730.zip
u-boot-imx-e37ae40e9dec9af417c19de72f76becebf160730.tar.gz
u-boot-imx-e37ae40e9dec9af417c19de72f76becebf160730.tar.bz2
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 <swarren@nvidia.com>
Diffstat (limited to 'common/image.c')
-rw-r--r--common/image.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/common/image.c b/common/image.c
index fbdc40a..95c7a15 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;