From 0986a7dda1c55af4d329d51f1b4e7c0964db5abc Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 30 Apr 2019 09:24:28 +0800 Subject: [PATCH] common: android: add sysmem alloc for uncompress kernel It helps check whether uncompress kernel overlap with other region or not. Change-Id: Ia7e6c027f68c2e8af398824afd8b7580531cb77e Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/memblk.c | 4 ++ common/android_bootloader.c | 74 +++++++++++++++++++++++++++++++-- include/memblk.h | 1 + 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rockchip/memblk.c b/arch/arm/mach-rockchip/memblk.c index a9cd04b0a7..cec5be6fdb 100644 --- a/arch/arm/mach-rockchip/memblk.c +++ b/arch/arm/mach-rockchip/memblk.c @@ -57,6 +57,10 @@ const static struct memblk_attr plat_mem_attr[MEMBLK_ID_MAX] = { .name = "KERNEL", .flags = M_ATTR_OFC, }, + [MEMBLK_ID_UNCOMP_KERNEL] = { + .name = "UNCOMPRESS-KERNEL", + .flags = M_ATTR_PEEK, + }, [MEMBLK_ID_ANDROID] = { .name = "ANDROID", .flags = M_ATTR_OFC, diff --git a/common/android_bootloader.c b/common/android_bootloader.c index e6da05a098..c81b4e04b7 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -306,6 +307,66 @@ static int android_bootloader_get_fdt(const char *part_name, } #endif +/* + * Test on RK3308 AARCH64 mode (Cortex A35 816 MHZ) boot with eMMC: + * + * |-------------------------------------------------------------------| + * | Format | Size(Byte) | Ratio | Decomp time(ms) | Boot time(ms) | + * |-------------------------------------------------------------------| + * | Image | 7720968 | | | 488 | + * |-------------------------------------------------------------------| + * | Image.lz4 | 4119448 | 53% | 59 | 455 | + * |-------------------------------------------------------------------| + * | Image.lzo | 3858322 | 49% | 141 | 536 | + * |-------------------------------------------------------------------| + * | Image.gz | 3529108 | 45% | 222 | 609 | + * |-------------------------------------------------------------------| + * | Image.bz2 | 3295914 | 42% | 2940 | | + * |-------------------------------------------------------------------| + * | Image.lzma| 2683750 | 34% | | | + * |-------------------------------------------------------------------| + */ +static int sysmem_alloc_uncomp_kernel(ulong kernel_address, u32 comp) +{ + struct andr_img_hdr *hdr = (struct andr_img_hdr *)kernel_address; + ulong ksize, kaddr; + + if (comp != IH_COMP_NONE) { + kaddr = env_get_hex("kernel_addr_c", 0); + if (!kaddr) + kaddr = env_get_hex("kernel_addr_r", 0); + kaddr -= hdr->page_size; + if (sysmem_free((phys_addr_t)kaddr)) + return -EINVAL; + + /* + * Use smaller Ratio to get larger estimated uncompress + * kernel size. + */ + if (comp == IH_COMP_ZIMAGE) + ksize = hdr->kernel_size * 100 / 45; + else if (comp == IH_COMP_LZ4) + ksize = hdr->kernel_size * 100 / 50; + else if (comp == IH_COMP_LZO) + ksize = hdr->kernel_size * 100 / 45; + else if (comp == IH_COMP_GZIP) + ksize = hdr->kernel_size * 100 / 40; + else if (comp == IH_COMP_BZIP2) + ksize = hdr->kernel_size * 100 / 40; + else if (comp == IH_COMP_LZMA) + ksize = hdr->kernel_size * 100 / 30; + else + ksize = hdr->kernel_size; + + ksize = ALIGN(ksize, 512); + if (!sysmem_alloc_base(MEMBLK_ID_UNCOMP_KERNEL, + (phys_addr_t)kaddr, ksize)) + return -ENOMEM; + } + + return 0; +} + int android_bootloader_boot_kernel(unsigned long kernel_address) { char *kernel_addr_r = env_get("kernel_addr_r"); @@ -344,10 +405,15 @@ int android_bootloader_boot_kernel(unsigned long kernel_address) comp_type != IH_COMP_NONE ? kernel_addr_c : kernel_addr_r, comp_str, fdt_addr); - if (gd->console_evt == CONSOLE_EVT_CTRL_M) { - bidram_dump(); - sysmem_dump(); - } + hotkey_run(HK_SYSMEM); + + /* + * Check whether there is enough space for uncompress kernel, + * Actually, here only gives a sysmem warning message when failed + * but never return -1. + */ + if (sysmem_alloc_uncomp_kernel(kernel_address, comp_type)) + return -1; do_bootm(NULL, 0, 4, bootm_args); diff --git a/include/memblk.h b/include/memblk.h index 7226c81e44..90429caad2 100644 --- a/include/memblk.h +++ b/include/memblk.h @@ -25,6 +25,7 @@ enum memblk_id { MEMBLK_ID_FDT_DTBO, MEMBLK_ID_FDT_AOSP, MEMBLK_ID_KERNEL, + MEMBLK_ID_UNCOMP_KERNEL, MEMBLK_ID_ANDROID, MEMBLK_ID_AVB_ANDROID,