[PATCH 0/6] Add support of Android Boot Image version 2 and non-AB image

Actually bootmethod android only support android boot image version 4 and with AB image, some old platform wtill use android boot image version 2 with AB or without AB slot.
This patchset add support of both version 2 and non-AB slot images. It's fixed in same time a boot issue seen on khadas vim3{l} board with 16GB eMMC
patchset was tested on khadas VIM3 and VIM3L with AOSP main branch and android-mainline kernel and with TI AM62P with android release provided by TI.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- Guillaume La Roque (6): bootstd: android: add support of bootimage v2 bootstd: android: add non-A/B image support configs: khadas-vim3{l}: fix userdata size configs: khadas-vim3l_android{_ab}: move on bootmeth android configs: khadas-vim3_android{_ab}: move on bootmeth android bootstd: Add test for Android boot image v2
arch/sandbox/dts/test.dts | 10 +++- boot/Kconfig | 1 - boot/bootmeth_android.c | 80 ++++++++++++++++++++++--------- configs/am62x_a53_android.config | 1 + configs/khadas-vim3_android_ab_defconfig | 7 ++- configs/khadas-vim3_android_defconfig | 7 ++- configs/khadas-vim3l_android_ab_defconfig | 7 ++- configs/khadas-vim3l_android_defconfig | 7 ++- configs/sandbox_defconfig | 1 + include/configs/khadas-vim3_android.h | 31 +++++++++--- include/configs/khadas-vim3l_android.h | 33 ++++++++++--- test/boot/bootflow.c | 29 +++++++++-- test/py/tests/test_ut.py | 49 +++++++++++++++++++ 13 files changed, 219 insertions(+), 44 deletions(-) --- base-commit: 9e1cd2f2cb86865bbc002ed961a095c7a8bcc989 change-id: 20241015-adnroidv2-a01dca609707 prerequisite-message-id: 20241017-android_ab_master-v5-0-43bfcc096d95@salutedevices.com prerequisite-patch-id: 2741d3997913068fd4ce70645feaf67036adf401 prerequisite-patch-id: 3aee9fe1151f7f358c37dd18068f2270cfd11bf9 prerequisite-patch-id: d43a2bb0407de9b4d76464f5edc7d08eecb6e637 prerequisite-patch-id: 887f326fb6118f3b032f843d4f9edd382a0f3e8f prerequisite-patch-id: 51498bd770f7fe82cf6954ba61564cfd4644aace prerequisite-patch-id: 93d7bac8e10fad672833df6647f346cfce38f008 prerequisite-message-id: 20241017-topic-fastboot-fixes-mkbootimg-v2-0-c3927102d931@linaro.org prerequisite-patch-id: 03ee7fe890d6cc5734ba5950fcda820466f9eee5 prerequisite-patch-id: cdef2f4a68a8ae2eb4ffee5467ef45d1638e5266 prerequisite-patch-id: 93aa15770f62ff17e55b74480456cf1f305de65e
Best regards,

Android bootmeth only support boot image v3/4.
Add support of Android Boot Image version 2 [1]. Vendor boot image is only supported in version 3 and 4 so don't try to read it when header version if version is less than 3.
1: https://source.android.com/docs/core/architecture/bootloader/boot-image-head...
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- boot/bootmeth_android.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
diff --git a/boot/bootmeth_android.c b/boot/bootmeth_android.c index 19b1f2c377b9..2e7f85e4a708 100644 --- a/boot/bootmeth_android.c +++ b/boot/bootmeth_android.c @@ -259,16 +259,12 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow) goto free_priv; }
- if (priv->header_version != 4) { - log_debug("only boot.img v4 is supported %u\n", priv->header_version); - ret = -EINVAL; - goto free_priv; - } - - ret = scan_vendor_boot_part(bflow->blk, priv); - if (ret < 0) { - log_debug("scan vendor_boot failed: err=%d\n", ret); - goto free_priv; + if (priv->header_version >= 3) { + ret = scan_vendor_boot_part(bflow->blk, priv); + if (ret < 0) { + log_debug("scan vendor_boot failed: err=%d\n", ret); + goto free_priv; + } }
/* @@ -476,12 +472,13 @@ static int boot_android_normal(struct bootflow *bflow) if (ret < 0) return log_msg_ret("read boot", ret);
- ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr); - if (ret < 0) - return log_msg_ret("read vendor_boot", ret); - + if (priv->header_version >= 3) { + ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr); + if (ret < 0) + return log_msg_ret("read vendor_boot", ret); + set_avendor_bootimg_addr(vloadaddr); + } set_abootimg_addr(loadaddr); - set_avendor_bootimg_addr(vloadaddr);
ret = bootm_boot_start(loadaddr, bflow->cmdline);

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
Android bootmeth only support boot image v3/4.
Add support of Android Boot Image version 2 [1]. Vendor boot image is only supported in version 3 and 4 so don't try to read it when header version if version is less than 3.
Remove: "if version": don't try to read it when header is less than 3.
1: https://source.android.com/docs/core/architecture/bootloader/boot-image-head...
Please use standard link notation (using [1] instead of 1:). See some examples:
https://source.denx.de/u-boot/u-boot/-/commit/9214627f5ecede8610e33abf2de5a0... https://source.denx.de/u-boot/u-boot/-/commit/608a31bdec6284ad6f821226e4c62c...
With that fixed:
Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
boot/bootmeth_android.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
diff --git a/boot/bootmeth_android.c b/boot/bootmeth_android.c index 19b1f2c377b9..2e7f85e4a708 100644 --- a/boot/bootmeth_android.c +++ b/boot/bootmeth_android.c @@ -259,16 +259,12 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow) goto free_priv; }
- if (priv->header_version != 4) {
log_debug("only boot.img v4 is supported %u\n", priv->header_version);
ret = -EINVAL;
goto free_priv;
- }
- ret = scan_vendor_boot_part(bflow->blk, priv);
- if (ret < 0) {
log_debug("scan vendor_boot failed: err=%d\n", ret);
goto free_priv;
if (priv->header_version >= 3) {
ret = scan_vendor_boot_part(bflow->blk, priv);
if (ret < 0) {
log_debug("scan vendor_boot failed: err=%d\n", ret);
goto free_priv;
}
}
/*
@@ -476,12 +472,13 @@ static int boot_android_normal(struct bootflow *bflow) if (ret < 0) return log_msg_ret("read boot", ret);
- ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr);
- if (ret < 0)
return log_msg_ret("read vendor_boot", ret);
- if (priv->header_version >= 3) {
ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr);
if (ret < 0)
return log_msg_ret("read vendor_boot", ret);
set_avendor_bootimg_addr(vloadaddr);
- } set_abootimg_addr(loadaddr);
set_avendor_bootimg_addr(vloadaddr);
ret = bootm_boot_start(loadaddr, bflow->cmdline);
-- 2.34.1

On Fri 08 Nov 2024 at 11:07, Guillaume La Roque glaroque@baylibre.com wrote:
Android bootmeth only support boot image v3/4.
Add support of Android Boot Image version 2 [1]. Vendor boot image is only supported in version 3 and 4 so don't try to read it when header version if version is less than 3.
1: https://source.android.com/docs/core/architecture/bootloader/boot-image-head...
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
boot/bootmeth_android.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
diff --git a/boot/bootmeth_android.c b/boot/bootmeth_android.c index 19b1f2c377b9..2e7f85e4a708 100644 --- a/boot/bootmeth_android.c +++ b/boot/bootmeth_android.c @@ -259,16 +259,12 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow) goto free_priv; }
- if (priv->header_version != 4) {
log_debug("only boot.img v4 is supported %u\n", priv->header_version);
ret = -EINVAL;
goto free_priv;
- }
- ret = scan_vendor_boot_part(bflow->blk, priv);
- if (ret < 0) {
log_debug("scan vendor_boot failed: err=%d\n", ret);
goto free_priv;
if (priv->header_version >= 3) {
ret = scan_vendor_boot_part(bflow->blk, priv);
if (ret < 0) {
log_debug("scan vendor_boot failed: err=%d\n", ret);
goto free_priv;
}
}
/*
@@ -476,12 +472,13 @@ static int boot_android_normal(struct bootflow *bflow) if (ret < 0) return log_msg_ret("read boot", ret);
- ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr);
- if (ret < 0)
return log_msg_ret("read vendor_boot", ret);
- if (priv->header_version >= 3) {
ret = read_slotted_partition(desc, "vendor_boot", priv->slot, vloadaddr);
if (ret < 0)
return log_msg_ret("read vendor_boot", ret);
set_avendor_bootimg_addr(vloadaddr);
- } set_abootimg_addr(loadaddr);
set_avendor_bootimg_addr(vloadaddr);
ret = bootm_boot_start(loadaddr, bflow->cmdline);
-- 2.34.1
Tested on mediatek MT8365 EVK board with boot image V2.
Tested-by: Julien Masson jmasson@baylibre.com

Update android bootmeth to support non-A/B image. Enable AB support only when ANDROID_AB is enabled.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- boot/Kconfig | 1 - boot/bootmeth_android.c | 53 ++++++++++++++++++++++++++++++++++------ configs/am62x_a53_android.config | 1 + configs/sandbox_defconfig | 1 + 4 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/boot/Kconfig b/boot/Kconfig index 1d50a83a2d2f..fa0739ff05dd 100644 --- a/boot/Kconfig +++ b/boot/Kconfig @@ -500,7 +500,6 @@ config BOOTMETH_ANDROID bool "Bootdev support for Android" depends on X86 || ARM || SANDBOX depends on CMDLINE - select ANDROID_AB select ANDROID_BOOT_IMAGE select CMD_BCB imply CMD_FASTBOOT diff --git a/boot/bootmeth_android.c b/boot/bootmeth_android.c index 2e7f85e4a708..8fa4952df3f2 100644 --- a/boot/bootmeth_android.c +++ b/boot/bootmeth_android.c @@ -29,6 +29,7 @@ #define BCB_PART_NAME "misc" #define BOOT_PART_NAME "boot" #define VENDOR_BOOT_PART_NAME "vendor_boot" +#define SLOT_LEN 2
/** * struct android_priv - Private data @@ -42,7 +43,7 @@ */ struct android_priv { enum android_boot_mode boot_mode; - char slot[2]; + char *slot; u32 header_version; };
@@ -71,7 +72,11 @@ static int scan_boot_part(struct udevice *blk, struct android_priv *priv) char *buf; int ret;
- sprintf(partname, BOOT_PART_NAME "_%s", priv->slot); + if (priv->slot) + sprintf(partname, BOOT_PART_NAME "_%s", priv->slot); + else + sprintf(partname, BOOT_PART_NAME); + ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part info", ret); @@ -108,7 +113,11 @@ static int scan_vendor_boot_part(struct udevice *blk, struct android_priv *priv) char *buf; int ret;
- sprintf(partname, VENDOR_BOOT_PART_NAME "_%s", priv->slot); + if (priv->slot) + sprintf(partname, VENDOR_BOOT_PART_NAME "_%s", priv->slot); + else + sprintf(partname, VENDOR_BOOT_PART_NAME); + ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part info", ret); @@ -142,6 +151,11 @@ static int android_read_slot_from_bcb(struct bootflow *bflow, bool decrement) char slot_suffix[3]; int ret;
+ if (!CONFIG_IS_ENABLED(ANDROID_AB)) { + priv->slot = NULL; + return 0; + } + ret = part_get_info_by_name(desc, BCB_PART_NAME, &misc); if (ret < 0) return log_msg_ret("part", ret); @@ -150,6 +164,7 @@ static int android_read_slot_from_bcb(struct bootflow *bflow, bool decrement) if (ret < 0) return log_msg_ret("slot", ret);
+ priv->slot = malloc(SLOT_LEN); priv->slot[0] = BOOT_SLOT_NAME(ret); priv->slot[1] = '\0';
@@ -274,7 +289,7 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow) configure_serialno(bflow); configure_bootloader_version(bflow);
- if (priv->boot_mode == ANDROID_BOOT_MODE_NORMAL) { + if (priv->boot_mode == ANDROID_BOOT_MODE_NORMAL && priv->slot) { ret = bootflow_cmdline_set_arg(bflow, "androidboot.force_normal_boot", "1", false); if (ret < 0) { @@ -323,14 +338,24 @@ static int read_slotted_partition(struct blk_desc *desc, const char *const name, { struct disk_partition partition; char partname[PART_NAME_LEN]; + int partname_len; int ret; u32 n;
/* Ensure name fits in partname it should be: <name>_<slot>\0 */ - if (strlen(name) > (PART_NAME_LEN - 2 - 1)) + if (CONFIG_IS_ENABLED(ANDROID_AB)) + partname_len = PART_NAME_LEN - 2 - 1; + else + partname_len = PART_NAME_LEN - 1; + + if (strlen(name) > partname_len) return log_msg_ret("name too long", -EINVAL);
- sprintf(partname, "%s_%s", name, slot); + if (slot) + sprintf(partname, "%s_%s", name, slot); + else + sprintf(partname, "%s", name); + ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part", ret); @@ -382,7 +407,7 @@ static int run_avb_verification(struct bootflow *bflow) AvbSlotVerifyData *out_data; enum avb_boot_state boot_state; char *extra_args; - char slot_suffix[3]; + char *slot_suffix = ""; bool unlocked = false; int ret;
@@ -390,7 +415,10 @@ static int run_avb_verification(struct bootflow *bflow) if (!avb_ops) return log_msg_ret("avb ops", -ENOMEM);
- sprintf(slot_suffix, "_%s", priv->slot); + if (priv->slot) { + slot_suffix = malloc(3); + sprintf(slot_suffix, "_%s", priv->slot); + }
ret = avb_ops->read_is_device_unlocked(avb_ops, &unlocked); if (ret != AVB_IO_RESULT_OK) @@ -427,12 +455,18 @@ static int run_avb_verification(struct bootflow *bflow) if (ret < 0) goto free_out_data;
+ if (priv->slot) + free(slot_suffix); + return 0;
free_out_data: if (out_data) avb_slot_verify_data_free(out_data);
+ if (priv->slot) + free(slot_suffix); + return log_msg_ret("avb cmdline", ret); } #else @@ -480,6 +514,9 @@ static int boot_android_normal(struct bootflow *bflow) } set_abootimg_addr(loadaddr);
+ if (priv->slot) + free(priv->slot); + ret = bootm_boot_start(loadaddr, bflow->cmdline);
return log_msg_ret("boot", ret); diff --git a/configs/am62x_a53_android.config b/configs/am62x_a53_android.config index adbe2b8e126f..2aca51e3a107 100644 --- a/configs/am62x_a53_android.config +++ b/configs/am62x_a53_android.config @@ -11,6 +11,7 @@ CONFIG_RANDOM_UUID=y # Needed for FASTBOOT_CMD_OEM_FORMAT CONFIG_FASTBOOT_CMD_OEM_FORMAT=y # Enable Android boot flow CONFIG_BOOTMETH_ANDROID=y +CONFIG_ANDROID_AB=y CONFIG_SYS_BOOTM_LEN=0x4000000 CONFIG_SYS_MALLOC_LEN=0x08000000 CONFIG_AVB_VERIFY=y diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index d111858082d5..6b8dedf20712 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -50,6 +50,7 @@ CONFIG_LOG_DEFAULT_LEVEL=6 CONFIG_LOGF_FUNC=y CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_STACKPROTECTOR=y +CONFIG_ANDROID_AB=y CONFIG_CMD_CPU=y CONFIG_CMD_LICENSE=y CONFIG_CMD_SMBIOS=y

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
Update android bootmeth to support non-A/B image. Enable AB support only when ANDROID_AB is enabled.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
boot/Kconfig | 1 - boot/bootmeth_android.c | 53 ++++++++++++++++++++++++++++++++++------ configs/am62x_a53_android.config | 1 + configs/sandbox_defconfig | 1 + 4 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/boot/Kconfig b/boot/Kconfig index 1d50a83a2d2f..fa0739ff05dd 100644 --- a/boot/Kconfig +++ b/boot/Kconfig @@ -500,7 +500,6 @@ config BOOTMETH_ANDROID bool "Bootdev support for Android" depends on X86 || ARM || SANDBOX depends on CMDLINE
- select ANDROID_AB select ANDROID_BOOT_IMAGE select CMD_BCB imply CMD_FASTBOOT
diff --git a/boot/bootmeth_android.c b/boot/bootmeth_android.c index 2e7f85e4a708..8fa4952df3f2 100644 --- a/boot/bootmeth_android.c +++ b/boot/bootmeth_android.c @@ -29,6 +29,7 @@ #define BCB_PART_NAME "misc" #define BOOT_PART_NAME "boot" #define VENDOR_BOOT_PART_NAME "vendor_boot" +#define SLOT_LEN 2
/**
- struct android_priv - Private data
@@ -42,7 +43,7 @@ */ struct android_priv { enum android_boot_mode boot_mode;
- char slot[2];
- char *slot; u32 header_version;
};
@@ -71,7 +72,11 @@ static int scan_boot_part(struct udevice *blk, struct android_priv *priv) char *buf; int ret;
- sprintf(partname, BOOT_PART_NAME "_%s", priv->slot);
- if (priv->slot)
sprintf(partname, BOOT_PART_NAME "_%s", priv->slot);
- else
sprintf(partname, BOOT_PART_NAME);
- ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part info", ret);
@@ -108,7 +113,11 @@ static int scan_vendor_boot_part(struct udevice *blk, struct android_priv *priv) char *buf; int ret;
- sprintf(partname, VENDOR_BOOT_PART_NAME "_%s", priv->slot);
- if (priv->slot)
sprintf(partname, VENDOR_BOOT_PART_NAME "_%s", priv->slot);
- else
sprintf(partname, VENDOR_BOOT_PART_NAME);
- ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part info", ret);
@@ -142,6 +151,11 @@ static int android_read_slot_from_bcb(struct bootflow *bflow, bool decrement) char slot_suffix[3]; int ret;
- if (!CONFIG_IS_ENABLED(ANDROID_AB)) {
priv->slot = NULL;
return 0;
- }
- ret = part_get_info_by_name(desc, BCB_PART_NAME, &misc); if (ret < 0) return log_msg_ret("part", ret);
@@ -150,6 +164,7 @@ static int android_read_slot_from_bcb(struct bootflow *bflow, bool decrement) if (ret < 0) return log_msg_ret("slot", ret);
- priv->slot = malloc(SLOT_LEN); priv->slot[0] = BOOT_SLOT_NAME(ret); priv->slot[1] = '\0';
@@ -274,7 +289,7 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow) configure_serialno(bflow); configure_bootloader_version(bflow);
- if (priv->boot_mode == ANDROID_BOOT_MODE_NORMAL) {
- if (priv->boot_mode == ANDROID_BOOT_MODE_NORMAL && priv->slot) { ret = bootflow_cmdline_set_arg(bflow, "androidboot.force_normal_boot", "1", false); if (ret < 0) {
@@ -323,14 +338,24 @@ static int read_slotted_partition(struct blk_desc *desc, const char *const name, { struct disk_partition partition; char partname[PART_NAME_LEN];
- int partname_len;
Should be size_t since we compare it with the output of strlen().
int ret; u32 n;
/* Ensure name fits in partname it should be: <name>_<slot>\0 */
The comment is not valid for non A/B. Maybe we can update it?
/* * Ensure name fits in partname. * For A/B, it should be <name>_<slot>\0 * For non A/B, it should be <name>\0 */
- if (strlen(name) > (PART_NAME_LEN - 2 - 1))
- if (CONFIG_IS_ENABLED(ANDROID_AB))
partname_len = PART_NAME_LEN - 2 - 1;
- else
partname_len = PART_NAME_LEN - 1;
- if (strlen(name) > partname_len) return log_msg_ret("name too long", -EINVAL);
- sprintf(partname, "%s_%s", name, slot);
- if (slot)
sprintf(partname, "%s_%s", name, slot);
- else
sprintf(partname, "%s", name);
- ret = part_get_info_by_name(desc, partname, &partition); if (ret < 0) return log_msg_ret("part", ret);
@@ -382,7 +407,7 @@ static int run_avb_verification(struct bootflow *bflow) AvbSlotVerifyData *out_data; enum avb_boot_state boot_state; char *extra_args;
- char slot_suffix[3];
- char *slot_suffix = "";
Why are we making this a char *?
Can't we keep slot_suffix[3] = ""; instead ?
It should work similarly and avoids using malloc() and free() for a local variable.
bool unlocked = false; int ret;
@@ -390,7 +415,10 @@ static int run_avb_verification(struct bootflow *bflow) if (!avb_ops) return log_msg_ret("avb ops", -ENOMEM);
- sprintf(slot_suffix, "_%s", priv->slot);
if (priv->slot) {
slot_suffix = malloc(3);
sprintf(slot_suffix, "_%s", priv->slot);
}
ret = avb_ops->read_is_device_unlocked(avb_ops, &unlocked); if (ret != AVB_IO_RESULT_OK)
@@ -427,12 +455,18 @@ static int run_avb_verification(struct bootflow *bflow) if (ret < 0) goto free_out_data;
if (priv->slot)
free(slot_suffix);
return 0;
free_out_data: if (out_data) avb_slot_verify_data_free(out_data);
if (priv->slot)
free(slot_suffix);
return log_msg_ret("avb cmdline", ret);
} #else @@ -480,6 +514,9 @@ static int boot_android_normal(struct bootflow *bflow) } set_abootimg_addr(loadaddr);
if (priv->slot)
free(priv->slot);
ret = bootm_boot_start(loadaddr, bflow->cmdline);
return log_msg_ret("boot", ret);
diff --git a/configs/am62x_a53_android.config b/configs/am62x_a53_android.config index adbe2b8e126f..2aca51e3a107 100644 --- a/configs/am62x_a53_android.config +++ b/configs/am62x_a53_android.config @@ -11,6 +11,7 @@ CONFIG_RANDOM_UUID=y # Needed for FASTBOOT_CMD_OEM_FORMAT CONFIG_FASTBOOT_CMD_OEM_FORMAT=y # Enable Android boot flow CONFIG_BOOTMETH_ANDROID=y +CONFIG_ANDROID_AB=y CONFIG_SYS_BOOTM_LEN=0x4000000 CONFIG_SYS_MALLOC_LEN=0x08000000 CONFIG_AVB_VERIFY=y diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index d111858082d5..6b8dedf20712 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -50,6 +50,7 @@ CONFIG_LOG_DEFAULT_LEVEL=6 CONFIG_LOGF_FUNC=y CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_STACKPROTECTOR=y +CONFIG_ANDROID_AB=y CONFIG_CMD_CPU=y CONFIG_CMD_LICENSE=y CONFIG_CMD_SMBIOS=y
-- 2.34.1

After increase boot and recovery partition userdata was not resize. so on VIM3 16GB and VIM3L `fastboot oem format` or `gpt write mmc 2 $partitions` fail because end of last partition is outside of eMMC size.
Remove 64MB on userdata partitions to fix it.
Fixes: ce138d9742bf ("configs: khadas-vim3{l}: Increase boot/recovery partition size") Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- include/configs/khadas-vim3_android.h | 4 ++-- include/configs/khadas-vim3l_android.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/configs/khadas-vim3_android.h b/include/configs/khadas-vim3_android.h index fc89efb4c36e..0e2953fe71b3 100644 --- a/include/configs/khadas-vim3_android.h +++ b/include/configs/khadas-vim3_android.h @@ -24,7 +24,7 @@ "name=boot_a,size=64M,bootable,uuid=${uuid_gpt_boot_a};" \ "name=boot_b,size=64M,bootable,uuid=${uuid_gpt_boot_b};" \ "name=super,size=3072M,uuid=${uuid_gpt_super};" \ - "name=userdata,size=11282M,uuid=${uuid_gpt_userdata};" \ + "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID #else #define PARTS_DEFAULT \ @@ -37,7 +37,7 @@ "name=recovery,size=64M,uuid=${uuid_gpt_recovery};" \ "name=cache,size=256M,uuid=${uuid_gpt_cache};" \ "name=super,size=1792M,uuid=${uuid_gpt_super};" \ - "name=userdata,size=12786M,uuid=${uuid_gpt_userdata};" \ + "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID #endif
diff --git a/include/configs/khadas-vim3l_android.h b/include/configs/khadas-vim3l_android.h index 5b2aed1cf62a..f39a3782d663 100644 --- a/include/configs/khadas-vim3l_android.h +++ b/include/configs/khadas-vim3l_android.h @@ -24,7 +24,7 @@ "name=boot_a,size=64M,bootable,uuid=${uuid_gpt_boot_a};" \ "name=boot_b,size=64M,bootable,uuid=${uuid_gpt_boot_b};" \ "name=super,size=3072M,uuid=${uuid_gpt_super};" \ - "name=userdata,size=11282M,uuid=${uuid_gpt_userdata};" \ + "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID #else #define PARTS_DEFAULT \ @@ -37,7 +37,7 @@ "name=recovery,size=64M,uuid=${uuid_gpt_recovery};" \ "name=cache,size=256M,uuid=${uuid_gpt_cache};" \ "name=super,size=1792M,uuid=${uuid_gpt_super};" \ - "name=userdata,size=12786M,uuid=${uuid_gpt_userdata};" \ + "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID #endif

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
After increase boot and recovery partition userdata was not resize. so on VIM3 16GB and VIM3L `fastboot oem format` or `gpt write mmc 2 $partitions` fail because end of last partition is outside of eMMC size.
Remove 64MB on userdata partitions to fix it.
Fixes: ce138d9742bf ("configs: khadas-vim3{l}: Increase boot/recovery partition size")
nitpick: Fixes should be a single line.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
When making the patch, I was not aware that VIM3 had 2 models with different eMMC sizes: - VIM3 (Basic) with 16GB of eMMC - VIM3 Pro with 32GB of eMMC
I of course have the VIM3 pro so I did not notice this regression.
Sorry about this.
Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
include/configs/khadas-vim3_android.h | 4 ++-- include/configs/khadas-vim3l_android.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/configs/khadas-vim3_android.h b/include/configs/khadas-vim3_android.h index fc89efb4c36e..0e2953fe71b3 100644 --- a/include/configs/khadas-vim3_android.h +++ b/include/configs/khadas-vim3_android.h @@ -24,7 +24,7 @@ "name=boot_a,size=64M,bootable,uuid=${uuid_gpt_boot_a};" \ "name=boot_b,size=64M,bootable,uuid=${uuid_gpt_boot_b};" \ "name=super,size=3072M,uuid=${uuid_gpt_super};" \
- "name=userdata,size=11282M,uuid=${uuid_gpt_userdata};" \
- "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
#else #define PARTS_DEFAULT \ @@ -37,7 +37,7 @@ "name=recovery,size=64M,uuid=${uuid_gpt_recovery};" \ "name=cache,size=256M,uuid=${uuid_gpt_cache};" \ "name=super,size=1792M,uuid=${uuid_gpt_super};" \
- "name=userdata,size=12786M,uuid=${uuid_gpt_userdata};" \
- "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
#endif
diff --git a/include/configs/khadas-vim3l_android.h b/include/configs/khadas-vim3l_android.h index 5b2aed1cf62a..f39a3782d663 100644 --- a/include/configs/khadas-vim3l_android.h +++ b/include/configs/khadas-vim3l_android.h @@ -24,7 +24,7 @@ "name=boot_a,size=64M,bootable,uuid=${uuid_gpt_boot_a};" \ "name=boot_b,size=64M,bootable,uuid=${uuid_gpt_boot_b};" \ "name=super,size=3072M,uuid=${uuid_gpt_super};" \
- "name=userdata,size=11282M,uuid=${uuid_gpt_userdata};" \
- "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
#else #define PARTS_DEFAULT \ @@ -37,7 +37,7 @@ "name=recovery,size=64M,uuid=${uuid_gpt_recovery};" \ "name=cache,size=256M,uuid=${uuid_gpt_cache};" \ "name=super,size=1792M,uuid=${uuid_gpt_super};" \
- "name=userdata,size=12786M,uuid=${uuid_gpt_userdata};" \
- "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
#endif
-- 2.34.1

Hi Neil,
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
After increase boot and recovery partition userdata was not resize. so on VIM3 16GB and VIM3L `fastboot oem format` or `gpt write mmc 2 $partitions` fail because end of last partition is outside of eMMC size.
Remove 64MB on userdata partitions to fix it.
Fixes: ce138d9742bf ("configs: khadas-vim3{l}: Increase boot/recovery partition size") Signed-off-by: Guillaume La Roque glaroque@baylibre.com
Do you think you can pick up just this patch ([3/6])?
Since it's a fixing a regression that I introduced I'd like this to picked up without depending on the rest of the series.
Thanks! Mattijs
include/configs/khadas-vim3_android.h | 4 ++-- include/configs/khadas-vim3l_android.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
[...]

On 08/11/2024 11:05, Mattijs Korpershoek wrote:
Hi Neil,
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
After increase boot and recovery partition userdata was not resize. so on VIM3 16GB and VIM3L `fastboot oem format` or `gpt write mmc 2 $partitions` fail because end of last partition is outside of eMMC size.
Remove 64MB on userdata partitions to fix it.
Fixes: ce138d9742bf ("configs: khadas-vim3{l}: Increase boot/recovery partition size") Signed-off-by: Guillaume La Roque glaroque@baylibre.com
Do you think you can pick up just this patch ([3/6])?
Since it's a fixing a regression that I introduced I'd like this to picked up without depending on the rest of the series.
Sure I was waiting for your go!
Neil
Thanks! Mattijs
include/configs/khadas-vim3_android.h | 4 ++-- include/configs/khadas-vim3l_android.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
[...]

Actually khadas vim3l use distro command to boot android image. Move on new bootmeth android for A/B and non-A/B vim3l android.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- configs/khadas-vim3l_android_ab_defconfig | 7 ++++++- configs/khadas-vim3l_android_defconfig | 7 ++++++- include/configs/khadas-vim3l_android.h | 29 +++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/configs/khadas-vim3l_android_ab_defconfig b/configs/khadas-vim3l_android_ab_defconfig index 4d7b90f23002..43db61056baf 100644 --- a/configs/khadas-vim3l_android_ab_defconfig +++ b/configs/khadas-vim3l_android_ab_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -35,7 +41,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/configs/khadas-vim3l_android_defconfig b/configs/khadas-vim3l_android_defconfig index 4ec27262cdc7..32d57a5b9090 100644 --- a/configs/khadas-vim3l_android_defconfig +++ b/configs/khadas-vim3l_android_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -34,7 +40,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/include/configs/khadas-vim3l_android.h b/include/configs/khadas-vim3l_android.h index f39a3782d663..4455898b5262 100644 --- a/include/configs/khadas-vim3l_android.h +++ b/include/configs/khadas-vim3l_android.h @@ -26,6 +26,7 @@ "name=super,size=3072M,uuid=${uuid_gpt_super};" \ "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID + #else #define PARTS_DEFAULT \ "uuid_disk=${uuid_gpt_disk};" \ @@ -39,12 +40,32 @@ "name=super,size=1792M,uuid=${uuid_gpt_super};" \ "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID + #endif
-#define EXTRA_ANDROID_ENV_SETTINGS \ - "board=vim3l\0" \ - "board_name=vim3l\0" \ +#define CFG_EXTRA_ENV_SETTINGS \ + "board=vim3l\0" \ + "board_name=vim3l\0" \ + "bootmeths=android\0" \ + "bootcmd=bootflow scan\0" \ + "adtb_idx=2\0" \ + "partitions=" PARTS_DEFAULT "\0" \ + "mmcdev=2\0" \ + "fastboot_raw_partition_bootloader=0x1 0xfff mmcpart 1\0" \ + "fastboot_raw_partition_bootenv=0x0 0xfff mmcpart 2\0" \ + "gpio_recovery=88\0" \ + "check_button=gpio input ${gpio_recovery};test $? -eq 0;\0" \ + "stdin=" STDIN_CFG "\0" \ + "stdout=" STDOUT_CFG "\0" \ + "stderr=" STDOUT_CFG "\0" \ + "dtboaddr=0x08200000\0" \ + "loadaddr=0x01080000\0" \ + "fdt_addr_r=0x01000000\0" \ + "scriptaddr=0x08000000\0" \ + "kernel_addr_r=0x01080000\0" \ + "pxefile_addr_r=0x01080000\0" \ + "ramdisk_addr_r=0x13000000\0" \
-#include <configs/meson64_android.h> +#include <configs/meson64.h>
#endif /* __CONFIG_H */

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
Actually khadas vim3l use distro command to boot android image. Move on new bootmeth android for A/B and non-A/B vim3l android.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
configs/khadas-vim3l_android_ab_defconfig | 7 ++++++- configs/khadas-vim3l_android_defconfig | 7 ++++++- include/configs/khadas-vim3l_android.h | 29 +++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/configs/khadas-vim3l_android_ab_defconfig b/configs/khadas-vim3l_android_ab_defconfig index 4d7b90f23002..43db61056baf 100644 --- a/configs/khadas-vim3l_android_ab_defconfig +++ b/configs/khadas-vim3l_android_ab_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -35,7 +41,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/configs/khadas-vim3l_android_defconfig b/configs/khadas-vim3l_android_defconfig index 4ec27262cdc7..32d57a5b9090 100644 --- a/configs/khadas-vim3l_android_defconfig +++ b/configs/khadas-vim3l_android_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -34,7 +40,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/include/configs/khadas-vim3l_android.h b/include/configs/khadas-vim3l_android.h index f39a3782d663..4455898b5262 100644 --- a/include/configs/khadas-vim3l_android.h +++ b/include/configs/khadas-vim3l_android.h @@ -26,6 +26,7 @@ "name=super,size=3072M,uuid=${uuid_gpt_super};" \ "name=userdata,size=11218M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
nit: un-necessary change here?
#else #define PARTS_DEFAULT \ "uuid_disk=${uuid_gpt_disk};" \ @@ -39,12 +40,32 @@ "name=super,size=1792M,uuid=${uuid_gpt_super};" \ "name=userdata,size=12722M,uuid=${uuid_gpt_userdata};" \ "name=rootfs,size=-,uuid=" ROOT_UUID
nit: un-necessary change here?
#endif
-#define EXTRA_ANDROID_ENV_SETTINGS \
- "board=vim3l\0" \
- "board_name=vim3l\0" \
+#define CFG_EXTRA_ENV_SETTINGS \
- "board=vim3l\0" \
- "board_name=vim3l\0" \
- "bootmeths=android\0" \
- "bootcmd=bootflow scan\0" \
- "adtb_idx=2\0" \
- "partitions=" PARTS_DEFAULT "\0" \
- "mmcdev=2\0" \
- "fastboot_raw_partition_bootloader=0x1 0xfff mmcpart 1\0" \
- "fastboot_raw_partition_bootenv=0x0 0xfff mmcpart 2\0" \
- "gpio_recovery=88\0" \
- "check_button=gpio input ${gpio_recovery};test $? -eq 0;\0" \
What is check_button needed for ? It's used in include/configs/meson64_android.h to check if we should boot recovery but since we no longer use that file here I think we can safely remove this.
- "stdin=" STDIN_CFG "\0" \
- "stdout=" STDOUT_CFG "\0" \
- "stderr=" STDOUT_CFG "\0" \
- "dtboaddr=0x08200000\0" \
- "loadaddr=0x01080000\0" \
- "fdt_addr_r=0x01000000\0" \
- "scriptaddr=0x08000000\0" \
- "kernel_addr_r=0x01080000\0" \
- "pxefile_addr_r=0x01080000\0" \
- "ramdisk_addr_r=0x13000000\0" \
-#include <configs/meson64_android.h>
Should we also patch configs/meson64_android.h to remove everything related to VIM3L? This way, we don't keep unused code in there.
+#include <configs/meson64.h>
#endif /* __CONFIG_H */
-- 2.34.1

Actually khadas vim3 use distro command to boot android image. Move on new bootmeth android for A/B and non-A/B vim3 android.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- configs/khadas-vim3_android_ab_defconfig | 7 ++++++- configs/khadas-vim3_android_defconfig | 7 ++++++- include/configs/khadas-vim3_android.h | 27 +++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/configs/khadas-vim3_android_ab_defconfig b/configs/khadas-vim3_android_ab_defconfig index de5357c45cbf..a078c5d363ae 100644 --- a/configs/khadas-vim3_android_ab_defconfig +++ b/configs/khadas-vim3_android_ab_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -35,7 +41,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/configs/khadas-vim3_android_defconfig b/configs/khadas-vim3_android_defconfig index a0d9c423c3c3..b77a44ce859b 100644 --- a/configs/khadas-vim3_android_defconfig +++ b/configs/khadas-vim3_android_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -34,7 +40,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/include/configs/khadas-vim3_android.h b/include/configs/khadas-vim3_android.h index 0e2953fe71b3..498afd0287f4 100644 --- a/include/configs/khadas-vim3_android.h +++ b/include/configs/khadas-vim3_android.h @@ -41,10 +41,29 @@ "name=rootfs,size=-,uuid=" ROOT_UUID #endif
-#define EXTRA_ANDROID_ENV_SETTINGS \ - "board=vim3\0" \ - "board_name=vim3\0" \ +#define CFG_EXTRA_ENV_SETTINGS \ + "board=vim3\0" \ + "board_name=vim3\0" \ + "bootmeths=android\0" \ + "bootcmd=bootflow scan\0" \ + "adtb_idx=3\0" \ + "partitions=" PARTS_DEFAULT "\0" \ + "mmcdev=2\0" \ + "fastboot_raw_partition_bootloader=0x1 0xfff mmcpart 1\0" \ + "fastboot_raw_partition_bootenv=0x0 0xfff mmcpart 2\0" \ + "gpio_recovery=88\0" \ + "check_button=gpio input ${gpio_recovery};test $? -eq 0;\0" \ + "stdin=" STDIN_CFG "\0" \ + "stdout=" STDOUT_CFG "\0" \ + "stderr=" STDOUT_CFG "\0" \ + "dtboaddr=0x08200000\0" \ + "loadaddr=0x01080000\0" \ + "fdt_addr_r=0x01000000\0" \ + "scriptaddr=0x08000000\0" \ + "kernel_addr_r=0x01080000\0" \ + "pxefile_addr_r=0x01080000\0" \ + "ramdisk_addr_r=0x13000000\0" \
-#include <configs/meson64_android.h> +#include <configs/meson64.h>
#endif /* __CONFIG_H */

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
Actually khadas vim3 use distro command to boot android image. Move on new bootmeth android for A/B and non-A/B vim3 android.
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
configs/khadas-vim3_android_ab_defconfig | 7 ++++++- configs/khadas-vim3_android_defconfig | 7 ++++++- include/configs/khadas-vim3_android.h | 27 +++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/configs/khadas-vim3_android_ab_defconfig b/configs/khadas-vim3_android_ab_defconfig index de5357c45cbf..a078c5d363ae 100644 --- a/configs/khadas-vim3_android_ab_defconfig +++ b/configs/khadas-vim3_android_ab_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -35,7 +41,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/configs/khadas-vim3_android_defconfig b/configs/khadas-vim3_android_defconfig index a0d9c423c3c3..b77a44ce859b 100644 --- a/configs/khadas-vim3_android_defconfig +++ b/configs/khadas-vim3_android_defconfig @@ -24,6 +24,12 @@ CONFIG_REMAKE_ELF=y CONFIG_FIT=y CONFIG_FIT_SIGNATURE=y CONFIG_FIT_VERBOSE=y +CONFIG_BOOTMETH_ANDROID=y +# CONFIG_BOOTMETH_EXTLINUX is not set +# CONFIG_BOOTMETH_EXTLINUX_PXE is not set +# CONFIG_BOOTMETH_EFILOADER is not set +# CONFIG_BOOTMETH_EFI_BOOTMGR is not set +# CONFIG_BOOTMETH_VBE is not set CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_OF_BOARD_SETUP=y # CONFIG_DISPLAY_CPUINFO is not set @@ -34,7 +40,6 @@ CONFIG_SYS_MAXARGS=32 CONFIG_CMD_ADTIMG=y CONFIG_CMD_ABOOTIMG=y # CONFIG_CMD_IMI is not set -CONFIG_CMD_BCB=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y CONFIG_CMD_I2C=y diff --git a/include/configs/khadas-vim3_android.h b/include/configs/khadas-vim3_android.h index 0e2953fe71b3..498afd0287f4 100644 --- a/include/configs/khadas-vim3_android.h +++ b/include/configs/khadas-vim3_android.h @@ -41,10 +41,29 @@ "name=rootfs,size=-,uuid=" ROOT_UUID #endif
-#define EXTRA_ANDROID_ENV_SETTINGS \
- "board=vim3\0" \
- "board_name=vim3\0" \
+#define CFG_EXTRA_ENV_SETTINGS \
- "board=vim3\0" \
- "board_name=vim3\0" \
- "bootmeths=android\0" \
- "bootcmd=bootflow scan\0" \
- "adtb_idx=3\0" \
- "partitions=" PARTS_DEFAULT "\0" \
- "mmcdev=2\0" \
- "fastboot_raw_partition_bootloader=0x1 0xfff mmcpart 1\0" \
- "fastboot_raw_partition_bootenv=0x0 0xfff mmcpart 2\0" \
- "gpio_recovery=88\0" \
- "check_button=gpio input ${gpio_recovery};test $? -eq 0;\0" \
What is check_button needed for ? It's used in include/configs/meson64_android.h to check if we should boot recovery but since we no longer use that file here I think we can safely remove this.
- "stdin=" STDIN_CFG "\0" \
- "stdout=" STDOUT_CFG "\0" \
- "stderr=" STDOUT_CFG "\0" \
- "dtboaddr=0x08200000\0" \
- "loadaddr=0x01080000\0" \
- "fdt_addr_r=0x01000000\0" \
- "scriptaddr=0x08000000\0" \
- "kernel_addr_r=0x01080000\0" \
- "pxefile_addr_r=0x01080000\0" \
- "ramdisk_addr_r=0x13000000\0" \
-#include <configs/meson64_android.h>
Should we also patch configs/meson64_android.h to remove everything related to VIM3L? This way, we don't keep unused code in there.
+#include <configs/meson64.h>
#endif /* __CONFIG_H */
-- 2.34.1

Rename actual android bootmethod test to specify it's for boot image version 4. Add a unit test for testing the Android bootmethod with boot image version 2.
This requires another mmc image (mmc8) to contain the following partitions: - misc: contains the Bootloader Control Block (BCB) - boot_a: contains a fake generic kernel image
we can test this with:
$ ./test/py/test.py --bd sandbox --build -k test_ut # build the mmc8.img $ ./test/py/test.py --bd sandbox --build -k bootflow_android
Signed-off-by: Guillaume La Roque glaroque@baylibre.com --- arch/sandbox/dts/test.dts | 10 +++++++++- test/boot/bootflow.c | 29 +++++++++++++++++++++++++--- test/py/tests/test_ut.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-)
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 9bf44ae3b0bc..108633a727f9 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -44,6 +44,7 @@ mmc5 = "/mmc5"; mmc6 = "/mmc6"; mmc7 = "/mmc7"; + mmc8 = "/mmc8"; pci0 = &pci0; pci1 = &pci1; pci2 = &pci2; @@ -1135,13 +1136,20 @@ filename = "mmc6.img"; };
- /* This is used for Android tests */ + /* This is used for Android tests image v4 tests */ mmc7 { status = "disabled"; compatible = "sandbox,mmc"; filename = "mmc7.img"; };
+ /* This is used for Android boot image v2 tests. */ + mmc8 { + status = "disabled"; + compatible = "sandbox,mmc"; + filename = "mmc8.img"; + }; + pch { compatible = "sandbox,pch"; }; diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c index 154dea70a59c..febe85ca2fd6 100644 --- a/test/boot/bootflow.c +++ b/test/boot/bootflow.c @@ -1191,8 +1191,8 @@ static int bootflow_cros(struct unit_test_state *uts) } BOOTSTD_TEST(bootflow_cros, UTF_CONSOLE);
-/* Test Android bootmeth */ -static int bootflow_android(struct unit_test_state *uts) +/* Test Android bootmeth with boot image version 4 */ +static int bootflow_android_image_v4(struct unit_test_state *uts) { if (!IS_ENABLED(CONFIG_BOOTMETH_ANDROID)) return -EAGAIN; @@ -1212,4 +1212,27 @@ static int bootflow_android(struct unit_test_state *uts)
return 0; } -BOOTSTD_TEST(bootflow_android, UTF_CONSOLE); +BOOTSTD_TEST(bootflow_android_image_v4, UTF_CONSOLE); + +/* Test Android bootmeth with boot image version 2 */ +static int bootflow_android_image_v2(struct unit_test_state *uts) +{ + if (!IS_ENABLED(CONFIG_BOOTMETH_ANDROID)) + return -EAGAIN; + + ut_assertok(scan_mmc_android_bootdev(uts, "mmc8")); + ut_assertok(run_command("bootflow list", 0)); + + ut_assert_nextlinen("Showing all"); + ut_assert_nextlinen("Seq"); + ut_assert_nextlinen("---"); + ut_assert_nextlinen(" 0 extlinux"); + ut_assert_nextlinen(" 1 android ready mmc 0 mmc8.bootdev.whole "); + ut_assert_nextlinen("---"); + ut_assert_skip_to_line("(2 bootflows, 2 valid)"); + + ut_assert_console_end(); + + return 0; +} +BOOTSTD_TEST(bootflow_android_image_v2, UTF_CONSOLE); diff --git a/test/py/tests/test_ut.py b/test/py/tests/test_ut.py index 39aa1035e34d..6d2420798e80 100644 --- a/test/py/tests/test_ut.py +++ b/test/py/tests/test_ut.py @@ -501,6 +501,55 @@ def setup_android_image(cons):
print(f'wrote to {fname}')
+ mmc_dev = 8 + fname = os.path.join(cons.config.source_dir, f'mmc{mmc_dev}.img') + u_boot_utils.run_and_log(cons, f'qemu-img create {fname} 20M') + u_boot_utils.run_and_log(cons, f'cgpt create {fname}') + + ptr = 40 + + # Number of sectors in 1MB + sect_size = 512 + sect_1mb = (1 << 20) // sect_size + + required_parts = [ + {'num': 1, 'label':'misc', 'size': '1M'}, + {'num': 2, 'label':'boot_a', 'size': '4M'}, + {'num': 3, 'label':'boot_b', 'size': '4M'}, + ] + + for part in required_parts: + size_str = part['size'] + if 'M' in size_str: + size = int(size_str[:-1]) * sect_1mb + else: + size = int(size_str) + u_boot_utils.run_and_log( + cons, + f"cgpt add -i {part['num']} -b {ptr} -s {size} -l {part['label']} -t basicdata {fname}") + ptr += size + + u_boot_utils.run_and_log(cons, f'cgpt boot -p {fname}') + out = u_boot_utils.run_and_log(cons, f'cgpt show -q {fname}') + + # Create a dict (indexed by partition number) containing the above info + for line in out.splitlines(): + start, size, num, name = line.split(maxsplit=3) + parts[int(num)] = Partition(int(start), int(size), name) + + with open(fname, 'rb') as inf: + disk_data = inf.read() + + test_abootimg.AbootimgTestDiskImage(cons, 'boot.img', test_abootimg.img_hex) + boot_img = os.path.join(cons.config.result_dir, 'boot.img') + with open(boot_img, 'rb') as inf: + set_part_data(2, inf.read()) + + with open(fname, 'wb') as outf: + outf.write(disk_data) + + print(f'wrote to {fname}') + return fname
def setup_cedit_file(cons):

Hi Guillaume,
Thank you for the patch.
On jeu., oct. 17, 2024 at 18:10, Guillaume La Roque glaroque@baylibre.com wrote:
Rename actual android bootmethod test to specify it's for boot image version 4. Add a unit test for testing the Android bootmethod with boot image version 2.
This requires another mmc image (mmc8) to contain the following partitions:
- misc: contains the Bootloader Control Block (BCB)
- boot_a: contains a fake generic kernel image
we can test this with:
$ ./test/py/test.py --bd sandbox --build -k test_ut # build the mmc8.img $ ./test/py/test.py --bd sandbox --build -k bootflow_android
Signed-off-by: Guillaume La Roque glaroque@baylibre.com
arch/sandbox/dts/test.dts | 10 +++++++++- test/boot/bootflow.c | 29 +++++++++++++++++++++++++--- test/py/tests/test_ut.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-)
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 9bf44ae3b0bc..108633a727f9 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -44,6 +44,7 @@ mmc5 = "/mmc5"; mmc6 = "/mmc6"; mmc7 = "/mmc7";
pci0 = &pci0; pci1 = &pci1; pci2 = &pci2;mmc8 = "/mmc8";
@@ -1135,13 +1136,20 @@ filename = "mmc6.img"; };
- /* This is used for Android tests */
- /* This is used for Android tests image v4 tests */
Nit: we are repeating "tests" twice here. Maybe rephrase to "This is used for Android boot image v4 tests" ?
With the nit addressed:
Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
[...]
mmc7 {
-- 2.34.1

Hi,
On Thu, 17 Oct 2024 18:10:24 +0200, Guillaume La Roque wrote:
Actually bootmethod android only support android boot image version 4 and with AB image, some old platform wtill use android boot image version 2 with AB or without AB slot.
This patchset add support of both version 2 and non-AB slot images. It's fixed in same time a boot issue seen on khadas vim3{l} board with 16GB eMMC
[...]
Thanks, Applied to https://source.denx.de/u-boot/custodians/u-boot-amlogic (u-boot-amlogic)
[3/6] configs: khadas-vim3{l}: fix userdata size https://source.denx.de/u-boot/custodians/u-boot-amlogic/-/commit/895b54998e5...

On ven., nov. 08, 2024 at 11:11, Neil Armstrong neil.armstrong@linaro.org wrote:
Hi,
On Thu, 17 Oct 2024 18:10:24 +0200, Guillaume La Roque wrote:
Actually bootmethod android only support android boot image version 4 and with AB image, some old platform wtill use android boot image version 2 with AB or without AB slot.
This patchset add support of both version 2 and non-AB slot images. It's fixed in same time a boot issue seen on khadas vim3{l} board with 16GB eMMC
[...]
Thanks, Applied to https://source.denx.de/u-boot/custodians/u-boot-amlogic (u-boot-amlogic)
[3/6] configs: khadas-vim3{l}: fix userdata size https://source.denx.de/u-boot/custodians/u-boot-amlogic/-/commit/895b54998e5...
Great, thanks a lot, Neil !
-- Neil
participants (4)
-
Guillaume La Roque
-
Julien Masson
-
Mattijs Korpershoek
-
Neil Armstrong