* [PATCH] android_ab: Add option to skip decrementing tries
@ 2023-06-23 22:05 Joshua Watt
2023-07-17 16:19 ` Joshua Watt
2023-07-18 13:58 ` Tom Rini
0 siblings, 2 replies; 3+ messages in thread
From: Joshua Watt @ 2023-06-23 22:05 UTC (permalink / raw)
To: u-boot; +Cc: Joshua Watt, Igor Opaniuk, Sam Protsenko
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@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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] android_ab: Add option to skip decrementing tries
2023-06-23 22:05 [PATCH] android_ab: Add option to skip decrementing tries Joshua Watt
@ 2023-07-17 16:19 ` Joshua Watt
2023-07-18 13:58 ` Tom Rini
1 sibling, 0 replies; 3+ messages in thread
From: Joshua Watt @ 2023-07-17 16:19 UTC (permalink / raw)
To: u-boot; +Cc: Igor Opaniuk, Sam Protsenko
Ping?
On Fri, Jun 23, 2023 at 4:06 PM Joshua Watt <jpewhacker@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@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
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] android_ab: Add option to skip decrementing tries
2023-06-23 22:05 [PATCH] android_ab: Add option to skip decrementing tries Joshua Watt
2023-07-17 16:19 ` Joshua Watt
@ 2023-07-18 13:58 ` Tom Rini
1 sibling, 0 replies; 3+ messages in thread
From: Tom Rini @ 2023-07-18 13:58 UTC (permalink / raw)
To: Joshua Watt; +Cc: u-boot, Igor Opaniuk, Sam Protsenko
[-- Attachment #1: Type: text/plain, Size: 851 bytes --]
On Fri, Jun 23, 2023 at 05:05:48PM -0500, Joshua Watt 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@gmail.com>
Applied to u-boot/master, thanks!
--
Tom
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-07-18 13:59 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-23 22:05 [PATCH] android_ab: Add option to skip decrementing tries Joshua Watt
2023-07-17 16:19 ` Joshua Watt
2023-07-18 13:58 ` Tom Rini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox