bootchooser provides a mechanism that allows for resetting the "remaining_attempts" counters of all enabled boot slots to their defaults. The current possible trigger values to be stored in the defining variable $bootchooser.reset_attempts are "all-zero" (i.e. no attempts left at any boot slot) and "power-on" (i.e. $global.system.reset="POR"). We now want to add the option "reset" (i.e. $global.system.reset="RST") to that list, so that we do not have to perform an entire power cycle every time we need a counter reset. By introducing the "reset" value as an option, we can deliberately cause the bootchooser to set the "remaining_attempts" values to their defaults when performing a generic restart. The restart handler of the main OS is hence responsible that the subsequent barebox run sees "RESET_RST" as reset reason instead of e.g. "RESET_WDG". Signed-off-by: Holger Assmann <h.assmann@xxxxxxxxxxxxxx> --- Documentation/user/bootchooser.rst | 6 ++++++ common/bootchooser.c | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/Documentation/user/bootchooser.rst b/Documentation/user/bootchooser.rst index db0a4f8898..1a2ce70bb2 100644 --- a/Documentation/user/bootchooser.rst +++ b/Documentation/user/bootchooser.rst @@ -92,6 +92,12 @@ list of space-separated flags. Possible values are: (``$global.system.reset="POR"``) is detected, the ``remaining_attempts`` counters of all enabled targets are reset to their defaults. This means after a power cycle all boot targets will be tried again for the configured number of retries. +- ``reset``: When the bootchooser starts and a generic reset + (``$global.system.reset="RST"``) is detected, the ``remaining_attempts`` + counters of all enabled targets are reset to their defaults. + This means that, if the systems reports a generic restart, the + ``remaining_attempts`` counters of all enabled targets are reset to + their defaults. - ``all-zero``: When the bootchooser starts and the ``remaining_attempts`` counters of all enabled targets are zero, the ``remaining_attempts`` counters of all enabled targets are reset to their defaults. diff --git a/common/bootchooser.c b/common/bootchooser.c index eb3dda52ab..022e225165 100644 --- a/common/bootchooser.c +++ b/common/bootchooser.c @@ -77,6 +77,7 @@ struct bootchooser_target { enum reset_attempts { RESET_ATTEMPTS_POWER_ON, RESET_ATTEMPTS_ALL_ZERO, + RESET_ATTEMPTS_SRC_RST, }; static unsigned long reset_attempts; @@ -439,6 +440,13 @@ struct bootchooser *bootchooser_get(void) attempts_resetted = 1; } + if (test_bit(RESET_ATTEMPTS_SRC_RST, &reset_attempts) && + reset_source_get() == RESET_RST && !attempts_resetted) { + pr_info("RST Reset, resetting remaining attempts\n"); + bootchooser_reset_attempts(bc); + attempts_resetted = 1; + } + if (test_bit(RESET_ATTEMPTS_ALL_ZERO, &reset_attempts)) { int attempts = 0; @@ -915,6 +923,7 @@ static int bootchooser_add_entry(struct bootentries *entries, const char *name) static const char * const reset_attempts_names[] = { [RESET_ATTEMPTS_POWER_ON] = "power-on", [RESET_ATTEMPTS_ALL_ZERO] = "all-zero", + [RESET_ATTEMPTS_SRC_RST] = "reset", }; static const char * const reset_priorities_names[] = { @@ -951,6 +960,8 @@ BAREBOX_MAGICVAR(global.bootchooser.targets, "bootchooser: Space separated list of target names"); BAREBOX_MAGICVAR(global.bootchooser.default_attempts, "bootchooser: Default number of attempts for a target"); +BAREBOX_MAGICVAR(global.bootchooser.reset_attempts, + "bootchooser: Choose condition to reset number of attempts for all enabled targets ('power-on', 'all-zero', 'reset')"); BAREBOX_MAGICVAR(global.bootchooser.default_priority, "bootchooser: Default priority for a target"); BAREBOX_MAGICVAR(global.bootchooser.state_prefix, -- 2.39.2