From: George Chan <gchan9...@gmail.com> Some vendor bootloader ignored kernel/ramdisk addr and use their own addr. Even those addr are pointing to out-of-reach memory block at 0, and available address start at 0x80000000.
So we also need to use our own available addr for loadaddr. Signed-off-by: George Chan <gchan9...@gmail.com> --- boot/image-android.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/boot/image-android.c b/boot/image-android.c index 1746b018900..36822d788b0 100644 --- a/boot/image-android.c +++ b/boot/image-android.c @@ -12,6 +12,7 @@ #include <asm/unaligned.h> #include <mapmem.h> #include <linux/libfdt.h> +#include <dm/of.h> #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR 0x10008000 #define ANDROID_IMAGE_DEFAULT_RAMDISK_ADDR 0x11000000 @@ -281,6 +282,13 @@ static ulong android_image_get_kernel_addr(struct andr_image_data *img_data, if (img_data->kernel_addr == 0 && img_data->ramdisk_addr == 0) return env_get_ulong("kernel_addr_r", 16, 0); + /* + * Some vendor bootloader ignore kernel and ramdisk address also + * default value are out of physical mem base... so we use ours. + */ + if (img_data->kernel_addr < gd->ram_base) + return env_get_ulong("kernel_addr_r", 16, 0); + return img_data->kernel_addr; } @@ -490,6 +498,8 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img, if (img_data.ramdisk_addr == 0 || img_data.ramdisk_addr == ANDROID_IMAGE_DEFAULT_RAMDISK_ADDR) { *rd_data = img_data.ramdisk_ptr; + } else if (img_data.ramdisk_addr < gd->ram_base) { + *rd_data = img_data.ramdisk_ptr; } else { ramdisk_ptr = img_data.ramdisk_addr; *rd_data = ramdisk_ptr; -- 2.43.0