summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Chen <chenjh@rock-chips.com>2019-03-26 15:50:10 +0800
committerJianhong Chen <chenjh@rock-chips.com>2019-04-09 10:54:14 +0800
commit8d681e4412b383ac32a7768921524eec37f99994 (patch)
tree42d2a3bc219f924bacc2c3d8cbbf57701de18b93
parent5a54baa79344007142206f4dab5dd46d8ea1dc91 (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.c30
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) {