summaryrefslogtreecommitdiff
path: root/common/boot.c
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2020-11-24 11:24:30 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-11-30 09:41:20 +0100
commitf382be77f8c02cbaa94dc2664c3ab0d46775cab9 (patch)
tree76127cdc37396acf6801b43e957b6093a6dd1dba /common/boot.c
parent1ac440d8149184f3de289e8596bfa516b8a65d66 (diff)
downloadbarebox-f382be77f8c02cbaa94dc2664c3ab0d46775cab9.tar.gz
boot: introduce option to pass barebox-enabled watchdog to systemd
Like Linux, barebox supports co-existence of multiple watchdog devices. On boot, barebox enables only the default watchdog, which is defined as the watchdog with highest non-zero priority. The kernel handles all watchdogs the same and defers to userspace, which watchdogs to service. It can be useful to have barebox tell the system, which watchdog it activated, so it can service the same. Having this feature behind a global variable adds 354 bytes to a LZO compressed THUMB2 barebox. Users can opt out by toggling the Kconfig option, which defaults to off. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/boot.c')
-rw-r--r--common/boot.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/common/boot.c b/common/boot.c
index c6ec22873d..1657608d33 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -116,6 +116,13 @@ void boot_set_watchdog_timeout(unsigned int timeout)
boot_watchdog_timeout = timeout;
}
+static struct watchdog *boot_enabled_watchdog;
+
+struct watchdog *boot_get_enabled_watchdog(void)
+{
+ return boot_enabled_watchdog;
+}
+
static char *global_boot_default;
static char *global_user;
@@ -143,10 +150,13 @@ int boot_entry(struct bootentry *be, int verbose, int dryrun)
printf("Booting entry '%s'\n", be->title);
if (IS_ENABLED(CONFIG_WATCHDOG) && boot_watchdog_timeout) {
- ret = watchdog_set_timeout(watchdog_get_default(),
- boot_watchdog_timeout);
- if (ret)
+ boot_enabled_watchdog = watchdog_get_default();
+
+ ret = watchdog_set_timeout(boot_enabled_watchdog, boot_watchdog_timeout);
+ if (ret) {
pr_warn("Failed to enable watchdog: %s\n", strerror(-ret));
+ boot_enabled_watchdog = NULL;
+ }
}
ret = be->boot(be, verbose, dryrun);