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 <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2019-04-30 09:24:28 +08:00 committed by Jianhong Chen
parent c664909e96
commit 0986a7dda1
3 changed files with 75 additions and 4 deletions

View File

@ -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,

View File

@ -10,6 +10,7 @@
#include <android_avb/avb_ops_user.h>
#include <android_avb/rk_avb_ops_user.h>
#include <android_image.h>
#include <asm/arch/hotkey.h>
#include <cli.h>
#include <common.h>
#include <dt_table.h>
@ -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);

View File

@ -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,