diff options
-rw-r--r-- | boot/android_ab.c | 9 | ||||
-rw-r--r-- | cmd/ab_select.c | 20 | ||||
-rw-r--r-- | 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 2d7b3926665..60ae002978f 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 3e46663d6ea..bfb67b8236b 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 3eb61125c66..1fee7582b90 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 */ |