
This image type is supposed to ignore the load address. But at present it fails if the load address is missing. If it is zero, the image is loaded at address 0, which may not work on all boards.
Make use of the kernel_addr_r environment variable, instead, since this seems to be a more reliable final address for the kernel.
Another option would be to create a new Kconfig for this, or to use a region of memory known to be free, e.g. calculated from the DRAM banks. But in any case we should try to avoid conflicting with the kernel_addr_r variable. So the approach in this patch seems reasonable to me.
Signed-off-by: Simon Glass sjg@chromium.org ---
boot/bootm.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/boot/bootm.c b/boot/bootm.c index cb61485c226c..7583be5a4515 100644 --- a/boot/bootm.c +++ b/boot/bootm.c @@ -176,7 +176,13 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
images.os.end = fit_get_end(images.fit_hdr_os);
- if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os, + if (images.os.type == IH_TYPE_KERNEL_NOLOAD) { + ulong load; + + load = env_get_hex("kernel_addr_r", -1UL); + printf("Using kernel load address %lx\n", load); + images.os.load = load; + } else if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os, &images.os.load)) { puts("Can't get image load address!\n"); bootstage_error(BOOTSTAGE_ID_FIT_LOADADDR); @@ -229,7 +235,7 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
ret = fit_image_get_entry(images.fit_hdr_os, images.fit_noffset_os, &images.ep); - if (ret) { + if (ret && images.os.type == IH_TYPE_KERNEL_NOLOAD) { puts("Can't get entry point property!\n"); return 1; }