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:
parent
c664909e96
commit
0986a7dda1
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue