diff options
author | Joseph Chen <chenjh@rock-chips.com> | 2019-03-26 15:50:10 +0800 |
---|---|---|
committer | Jianhong Chen <chenjh@rock-chips.com> | 2019-04-09 10:54:14 +0800 |
commit | 8d681e4412b383ac32a7768921524eec37f99994 (patch) | |
tree | 42d2a3bc219f924bacc2c3d8cbbf57701de18b93 | |
parent | 5a54baa79344007142206f4dab5dd46d8ea1dc91 (diff) |
common: android: only adjust load address for ARM64 compressed kernel
If there is not "kernel_addr_c", using "kernel_addr_r" for Image/zImage
on 32-bit platform.
If there is not "kernel_addr_c", adjust load address to promise compressed
kernel can normal boot on 64-bit platform.
Change-Id: I42cc3c9074eb8f1caaa44d9256d2abdae6cd97b8
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
-rw-r--r-- | common/image-android.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/common/image-android.c b/common/image-android.c index 64374b10e4..cf436da62c 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -413,15 +413,31 @@ long android_image_load(struct blk_desc *dev_desc, part_info->blksz - 1) / part_info->blksz; comp = android_image_parse_kernel_comp(hdr); /* - * We should load a compressed kernel Image - * to high memory + * We should load compressed kernel Image to high memory at + * address "kernel_addr_c". */ if (comp != IH_COMP_NONE) { - load_address += android_image_get_ksize(hdr) * 3; - load_address = env_get_ulong("kernel_addr_c", 16, load_address); - load_address -= hdr->page_size; - unmap_sysmem(buf); - buf = map_sysmem(load_address, 0 /* size */); + ulong kernel_addr_c; + + kernel_addr_c = env_get_ulong("kernel_addr_c", 16, 0); + if (kernel_addr_c) { + load_address = kernel_addr_c - hdr->page_size; + unmap_sysmem(buf); + buf = map_sysmem(load_address, 0 /* size */); + } +#ifdef CONFIG_ARM64 + else { + printf("Warn: \"kernel_addr_c\" is not defined " + "for compressed kernel Image!\n"); + load_address += android_image_get_ksize(hdr) * 3; + load_address = ALIGN(load_address, ARCH_DMA_MINALIGN); + env_set_ulong("kernel_addr_c", load_address); + + load_address -= hdr->page_size; + unmap_sysmem(buf); + buf = map_sysmem(load_address, 0 /* size */); + } +#endif } if (blk_cnt * part_info->blksz > max_size) { |