[PATCH] android_ab: Add option to skip decrementing tries
Joshua Watt
jpewhacker at gmail.com
Mon Jul 17 18:19:59 CEST 2023
Ping?
On Fri, Jun 23, 2023 at 4:06 PM Joshua Watt <jpewhacker at gmail.com> wrote:
>
> It is is sometimes desired to be able to skip decrementing the number of
> tries remaining in an Android A/B boot, and instead just check which
> slot will be tried later. This can commonly be be the case for platforms
> that want to A/B u-boot itself, but are required to boot from a FAT MBR
> partition. In these cases, u-boot must do an early check that the MBR
> points to the correct A/B boot partition, and if not rewrite the MBR to
> point to the correct one and reboot. Decrementing the try count in this
> case is not desired because it means that each u-boot might constantly
> ping-pong overwriting the MBR and rebooting until all the retries are
> used up.
>
> Signed-off-by: Joshua Watt <JPEWhacker at gmail.com>
> ---
> boot/android_ab.c | 9 ++++++---
> cmd/ab_select.c | 20 ++++++++++++++++----
> include/android_ab.h | 3 ++-
> 3 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/boot/android_ab.c b/boot/android_ab.c
> index 2d7b392666..60ae002978 100644
> --- a/boot/android_ab.c
> +++ b/boot/android_ab.c
> @@ -181,7 +181,8 @@ static int ab_compare_slots(const struct slot_metadata *a,
> return 0;
> }
>
> -int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info)
> +int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
> + bool dec_tries)
> {
> struct bootloader_control *abc = NULL;
> u32 crc32_le;
> @@ -272,8 +273,10 @@ int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info)
> log_err("ANDROID: Attempting slot %c, tries remaining %d\n",
> BOOT_SLOT_NAME(slot),
> abc->slot_info[slot].tries_remaining);
> - abc->slot_info[slot].tries_remaining--;
> - store_needed = true;
> + if (dec_tries) {
> + abc->slot_info[slot].tries_remaining--;
> + store_needed = true;
> + }
> }
>
> if (slot >= 0) {
> diff --git a/cmd/ab_select.c b/cmd/ab_select.c
> index 3e46663d6e..bfb67b8236 100644
> --- a/cmd/ab_select.c
> +++ b/cmd/ab_select.c
> @@ -16,10 +16,19 @@ static int do_ab_select(struct cmd_tbl *cmdtp, int flag, int argc,
> struct blk_desc *dev_desc;
> struct disk_partition part_info;
> char slot[2];
> + bool dec_tries = true;
>
> - if (argc != 4)
> + if (argc < 4)
> return CMD_RET_USAGE;
>
> + for (int i = 4; i < argc; i++) {
> + if (strcmp(argv[i], "--no-dec") == 0) {
> + dec_tries = false;
> + } else {
> + return CMD_RET_USAGE;
> + }
> + }
> +
> /* Lookup the "misc" partition from argv[2] and argv[3] */
> if (part_get_info_by_dev_and_name_or_num(argv[2], argv[3],
> &dev_desc, &part_info,
> @@ -27,7 +36,8 @@ static int do_ab_select(struct cmd_tbl *cmdtp, int flag, int argc,
> return CMD_RET_FAILURE;
> }
>
> - ret = ab_select_slot(dev_desc, &part_info);
> +
> + ret = ab_select_slot(dev_desc, &part_info, dec_tries);
> if (ret < 0) {
> printf("Android boot failed, error %d.\n", ret);
> return CMD_RET_FAILURE;
> @@ -41,9 +51,9 @@ static int do_ab_select(struct cmd_tbl *cmdtp, int flag, int argc,
> return CMD_RET_SUCCESS;
> }
>
> -U_BOOT_CMD(ab_select, 4, 0, do_ab_select,
> +U_BOOT_CMD(ab_select, 5, 0, do_ab_select,
> "Select the slot used to boot from and register the boot attempt.",
> - "<slot_var_name> <interface> <dev[:part|#part_name]>\n"
> + "<slot_var_name> <interface> <dev[:part|#part_name]> [--no-dec]\n"
> " - Load the slot metadata from the partition 'part' on\n"
> " device type 'interface' instance 'dev' and store the active\n"
> " slot in the 'slot_var_name' variable. This also updates the\n"
> @@ -53,4 +63,6 @@ U_BOOT_CMD(ab_select, 4, 0, do_ab_select,
> " - If 'part_name' is passed, preceded with a # instead of :, the\n"
> " partition name whose label is 'part_name' will be looked up in\n"
> " the partition table. This is commonly the \"misc\" partition.\n"
> + " - If '--no-dec' is set, the number of tries remaining will not\n"
> + " decremented for the selected boot slot\n"
> );
> diff --git a/include/android_ab.h b/include/android_ab.h
> index 3eb61125c6..1fee7582b9 100644
> --- a/include/android_ab.h
> +++ b/include/android_ab.h
> @@ -30,6 +30,7 @@ struct disk_partition;
> * @param[in] part_info Place to store the partition information
> * Return: The slot number (>= 0) on success, or a negative on error
> */
> -int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info);
> +int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
> + bool dec_tries);
>
> #endif /* __ANDROID_AB_H */
> --
> 2.33.0
>
More information about the U-Boot
mailing list