Ping?
On Fri, Jun 23, 2023 at 4:06 PM Joshua Watt <[email protected]> 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 <[email protected]> > --- > 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 >

