mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-23 12:14:32 +08:00
abootimg: Add init_boot image support
Quote from [1]: "For devices launching with Android 13, the generic ramdisk is removed from the boot image and placed in a separate init_boot image. This change leaves the boot image with only the GKI kernel." While at it, update wrong error handling message when vendor_boot cannot be loaded. [1]: https://source.android.com/docs/core/architecture/partitions/generic-boot Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com> Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
This commit is contained in:
parent
da3447d09f
commit
17b1656dcd
@ -406,13 +406,20 @@ static int select_ramdisk(struct bootm_headers *images, const char *select, u8 a
|
|||||||
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
|
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
|
||||||
int ret;
|
int ret;
|
||||||
if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
|
if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
|
||||||
void *boot_img = map_sysmem(get_abootimg_addr(), 0);
|
ulong boot_img = get_abootimg_addr();
|
||||||
|
ulong init_boot_img = get_ainit_bootimg_addr();
|
||||||
void *vendor_boot_img = map_sysmem(get_avendor_bootimg_addr(), 0);
|
void *vendor_boot_img = map_sysmem(get_avendor_bootimg_addr(), 0);
|
||||||
|
void *ramdisk_img;
|
||||||
|
|
||||||
ret = android_image_get_ramdisk(boot_img, vendor_boot_img,
|
if (init_boot_img == -1)
|
||||||
|
ramdisk_img = map_sysmem(boot_img, 0);
|
||||||
|
else
|
||||||
|
ramdisk_img = map_sysmem(init_boot_img, 0);
|
||||||
|
|
||||||
|
ret = android_image_get_ramdisk(ramdisk_img, vendor_boot_img,
|
||||||
rd_datap, rd_lenp);
|
rd_datap, rd_lenp);
|
||||||
unmap_sysmem(vendor_boot_img);
|
unmap_sysmem(vendor_boot_img);
|
||||||
unmap_sysmem(boot_img);
|
unmap_sysmem(ramdisk_img);
|
||||||
} else {
|
} else {
|
||||||
void *ptr = map_sysmem(images->os.start, 0);
|
void *ptr = map_sysmem(images->os.start, 0);
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
/* Please use abootimg_addr() macro to obtain the boot image address */
|
/* Please use abootimg_addr() macro to obtain the boot image address */
|
||||||
static ulong _abootimg_addr = -1;
|
static ulong _abootimg_addr = -1;
|
||||||
|
static ulong _ainit_bootimg_addr = -1;
|
||||||
static ulong _avendor_bootimg_addr = -1;
|
static ulong _avendor_bootimg_addr = -1;
|
||||||
|
|
||||||
ulong get_abootimg_addr(void)
|
ulong get_abootimg_addr(void)
|
||||||
@ -21,6 +22,11 @@ ulong get_abootimg_addr(void)
|
|||||||
return (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr);
|
return (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ulong get_ainit_bootimg_addr(void)
|
||||||
|
{
|
||||||
|
return _ainit_bootimg_addr;
|
||||||
|
}
|
||||||
|
|
||||||
ulong get_avendor_bootimg_addr(void)
|
ulong get_avendor_bootimg_addr(void)
|
||||||
{
|
{
|
||||||
return _avendor_bootimg_addr;
|
return _avendor_bootimg_addr;
|
||||||
@ -179,7 +185,7 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
char *endp;
|
char *endp;
|
||||||
ulong img_addr;
|
ulong img_addr;
|
||||||
|
|
||||||
if (argc < 2 || argc > 3)
|
if (argc < 2 || argc > 4)
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
img_addr = hextoul(argv[1], &endp);
|
img_addr = hextoul(argv[1], &endp);
|
||||||
@ -190,16 +196,26 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
|
|
||||||
_abootimg_addr = img_addr;
|
_abootimg_addr = img_addr;
|
||||||
|
|
||||||
if (argc == 3) {
|
if (argc > 2) {
|
||||||
img_addr = simple_strtoul(argv[2], &endp, 16);
|
img_addr = simple_strtoul(argv[2], &endp, 16);
|
||||||
if (*endp != '\0') {
|
if (*endp != '\0') {
|
||||||
printf("Error: Wrong vendor image address\n");
|
printf("Error: Wrong vendor_boot image address\n");
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_avendor_bootimg_addr = img_addr;
|
_avendor_bootimg_addr = img_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argc == 4) {
|
||||||
|
img_addr = simple_strtoul(argv[3], &endp, 16);
|
||||||
|
if (*endp != '\0') {
|
||||||
|
printf("Error: Wrong init_boot image address\n");
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ainit_bootimg_addr = img_addr;
|
||||||
|
}
|
||||||
|
|
||||||
return CMD_RET_SUCCESS;
|
return CMD_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,7 +259,7 @@ static int do_abootimg_dump(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct cmd_tbl cmd_abootimg_sub[] = {
|
static struct cmd_tbl cmd_abootimg_sub[] = {
|
||||||
U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
|
U_BOOT_CMD_MKENT(addr, 4, 1, do_abootimg_addr, "", ""),
|
||||||
U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
|
U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
|
||||||
U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
|
U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
|
||||||
};
|
};
|
||||||
@ -271,7 +287,7 @@ static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
|
abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
|
||||||
"manipulate Android Boot Image",
|
"manipulate Android Boot Image",
|
||||||
"addr <boot_img_addr> [<vendor_boot_img_addr>]>\n"
|
"addr <boot_img_addr> [<vendor_boot_img_addr> [<init_boot_img_addr>]]\n"
|
||||||
" - set the address in RAM where boot image is located\n"
|
" - set the address in RAM where boot image is located\n"
|
||||||
" ($loadaddr is used by default)\n"
|
" ($loadaddr is used by default)\n"
|
||||||
"abootimg dump dtb\n"
|
"abootimg dump dtb\n"
|
||||||
|
@ -1970,6 +1970,13 @@ bool is_android_vendor_boot_image_header(const void *vendor_boot_img);
|
|||||||
*/
|
*/
|
||||||
ulong get_abootimg_addr(void);
|
ulong get_abootimg_addr(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_ainit_bootimg_addr() - Get Android init boot image address
|
||||||
|
*
|
||||||
|
* Return: Android init boot image address
|
||||||
|
*/
|
||||||
|
ulong get_ainit_bootimg_addr(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_avendor_bootimg_addr() - Get Android vendor boot image address
|
* get_avendor_bootimg_addr() - Get Android vendor boot image address
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user