mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from
@ 2020-11-24 10:24 Ahmad Fatoum
  2020-11-24 10:24 ` [PATCH v2 2/2] boot: introduce option to pass barebox-enabled watchdog to systemd Ahmad Fatoum
  2020-11-27  9:07 ` [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Sascha Hauer
  0 siblings, 2 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2020-11-24 10:24 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

On device-tree enabled platforms, the Linux kernel will first attempt
to use watchdog%d as watchdog name, where %d is the alias id.

Add a function that given a barebox struct watchdog and the device tree
root node of the kernel device tree, computes the corresponding kernel
alias id.

This may then later be used to pass an appropriate argument on the
kernel command line.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
  - removed extern where unneeded (Sascha)
---
 drivers/of/base.c          | 77 ++++++++++++++++++++++++++++++--------
 drivers/watchdog/wd_core.c | 19 ++++++++++
 include/of.h               |  8 ++++
 include/watchdog.h         |  8 ++++
 4 files changed, 97 insertions(+), 15 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 5b45c2023f3b..acbae3d8c4bb 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -149,6 +149,31 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np,
 		 ap->alias, ap->stem, ap->id, np->full_name);
 }
 
+static struct device_node *of_alias_resolve(struct device_node *root, struct property *pp)
+{
+	/* Skip those we do not want to proceed */
+	if (!of_prop_cmp(pp->name, "name") ||
+	    !of_prop_cmp(pp->name, "phandle") ||
+	    !of_prop_cmp(pp->name, "linux,phandle"))
+		return NULL;
+
+	return of_find_node_by_path_from(root, of_property_get_value(pp));
+}
+
+static int of_alias_id_parse(const char *start, int *len)
+{
+	const char *end = start + strlen(start);
+
+	/* walk the alias backwards to extract the id and work out
+	 * the 'stem' string */
+	while (isdigit(*(end-1)) && end > start)
+		end--;
+
+	*len = end - start;
+
+	return simple_strtol(end, NULL, 10);
+}
+
 /**
  * of_alias_scan - Scan all properties of 'aliases' node
  *
@@ -175,28 +200,15 @@ void of_alias_scan(void)
 
 	list_for_each_entry(pp, &of_aliases->properties, list) {
 		const char *start = pp->name;
-		const char *end = start + strlen(start);
 		struct device_node *np;
 		struct alias_prop *ap;
 		int id, len;
 
-		/* Skip those we do not want to proceed */
-		if (!of_prop_cmp(pp->name, "name") ||
-		    !of_prop_cmp(pp->name, "phandle") ||
-		    !of_prop_cmp(pp->name, "linux,phandle"))
-			continue;
-
-		np = of_find_node_by_path(of_property_get_value(pp));
+		np = of_alias_resolve(root_node, pp);
 		if (!np)
 			continue;
 
-		/* walk the alias backwards to extract the id and work out
-		 * the 'stem' string */
-		while (isdigit(*(end-1)) && end > start)
-			end--;
-		len = end - start;
-
-		id = simple_strtol(end, NULL, 10);
+		id = of_alias_id_parse(start, &len);
 		if (id < 0)
 			continue;
 
@@ -235,6 +247,41 @@ int of_alias_get_id(struct device_node *np, const char *stem)
 }
 EXPORT_SYMBOL_GPL(of_alias_get_id);
 
+int of_alias_get_id_from(struct device_node *root, struct device_node *np,
+			 const char *stem)
+{
+	struct device_node *aliasnp, *entrynp;
+	struct property *pp;
+
+	if (!root)
+		return of_alias_get_id(np, stem);
+
+	aliasnp = of_find_node_by_path_from(root, "/aliases");
+	if (!aliasnp)
+		return -ENODEV;
+
+	for_each_property_of_node(aliasnp, pp) {
+		const char *start = pp->name;
+		int id, len;
+
+		entrynp = of_alias_resolve(root_node, pp);
+		if (entrynp != np)
+			continue;
+
+		id = of_alias_id_parse(start, &len);
+		if (id < 0)
+			continue;
+
+		if (strncasecmp(start, stem, len))
+			continue;
+
+		return id;
+	}
+
+	return -ENODEV;
+}
+EXPORT_SYMBOL_GPL(of_alias_get_id_from);
+
 const char *of_alias_get(struct device_node *np)
 {
 	struct alias_prop *app;
diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c
index 665338af6197..643c53268fc8 100644
--- a/drivers/watchdog/wd_core.c
+++ b/drivers/watchdog/wd_core.c
@@ -261,6 +261,25 @@ struct watchdog *watchdog_get_default(void)
 }
 EXPORT_SYMBOL(watchdog_get_default);
 
+int watchdog_get_alias_id_from(struct watchdog *wd, struct device_node *root)
+{
+	struct device_node *dstnp, *srcnp = wd->hwdev ? wd->hwdev->device_node : NULL;
+	char *name;
+
+	if (!srcnp)
+		return -ENODEV;
+
+	name = of_get_reproducible_name(srcnp);
+	dstnp = of_find_node_by_reproducible_name(root, name);
+	free(name);
+
+	if (!dstnp)
+		return -ENODEV;
+
+	return of_alias_get_id_from(root, wd->hwdev->device_node, "watchdog");
+}
+EXPORT_SYMBOL(watchdog_get_alias_id_from);
+
 struct watchdog *watchdog_get_by_name(const char *name)
 {
 	struct watchdog *tmp;
diff --git a/include/of.h b/include/of.h
index 08a02e110522..dc3aa0730bf7 100644
--- a/include/of.h
+++ b/include/of.h
@@ -254,6 +254,8 @@ extern int of_count_phandle_with_args(const struct device_node *np,
 
 extern void of_alias_scan(void);
 extern int of_alias_get_id(struct device_node *np, const char *stem);
+extern int of_alias_get_id_from(struct device_node *root, struct device_node *np,
+				const char *stem);
 extern const char *of_alias_get(struct device_node *np);
 extern int of_modalias_node(struct device_node *node, char *modalias, int len);
 
@@ -677,6 +679,12 @@ static inline int of_alias_get_id(struct device_node *np, const char *stem)
 	return -ENOSYS;
 }
 
+static inline int of_alias_get_id_from(struct device_node *root, struct device_node *np,
+				       const char *stem)
+{
+	return -ENOSYS
+}
+
 static inline const char *of_alias_get(struct device_node *np)
 {
 	return NULL;
diff --git a/include/watchdog.h b/include/watchdog.h
index 81414ef8ecaa..ee8efdecd030 100644
--- a/include/watchdog.h
+++ b/include/watchdog.h
@@ -13,6 +13,8 @@ enum wdog_hw_runnning {
 	 WDOG_HW_NOT_RUNNING = PARAM_TRISTATE_FALSE
 };
 
+struct device_node;
+
 struct watchdog {
 	int (*set_timeout)(struct watchdog *, unsigned);
 	const char *name;
@@ -44,6 +46,7 @@ int watchdog_register(struct watchdog *);
 int watchdog_deregister(struct watchdog *);
 struct watchdog *watchdog_get_default(void);
 struct watchdog *watchdog_get_by_name(const char *name);
+int watchdog_get_alias_id_from(struct watchdog *, struct device_node *);
 int watchdog_set_timeout(struct watchdog*, unsigned);
 int watchdog_inhibit_all(void);
 #else
@@ -76,6 +79,11 @@ static inline int watchdog_inhibit_all(void)
 {
 	return -ENOSYS;
 }
+
+static inline int watchdog_get_alias_id_from(struct watchdog *, struct device_node *)
+{
+	return -ENOSYS;
+}
 #endif
 
 #define WATCHDOG_DEFAULT_PRIORITY 100
-- 
2.29.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] boot: introduce option to pass barebox-enabled watchdog to systemd
  2020-11-24 10:24 [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Ahmad Fatoum
@ 2020-11-24 10:24 ` Ahmad Fatoum
  2020-11-27  9:07 ` [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Sascha Hauer
  1 sibling, 0 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2020-11-24 10:24 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

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>
---
v1 -> v2:
  - renamed __watchdog to boot_enabled_watchdog (Sascha)
  - integrated separate fixup into of_fixup_bootargs. This makes the
    code work even with initcall shuffling (Sascha)
  - adjusted binary size impact in commit message. 567 -> 354 bytes
---
 common/Kconfig  | 10 ++++++++++
 common/boot.c   | 16 +++++++++++++---
 common/oftree.c | 25 +++++++++++++++++++++++++
 include/boot.h  |  3 +++
 4 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/common/Kconfig b/common/Kconfig
index 9b73aa84549c..3cb43a7190bb 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -1006,6 +1006,16 @@ config MACHINE_ID
 	  Note: if no hashable information is available no machine id will be passed
 	  to the kernel.
 
+config SYSTEMD_OF_WATCHDOG
+	bool "inform devicetree-enabled kernel of used watchdog"
+	depends on WATCHDOG && OFTREE && FLEXIBLE_BOOTARGS
+	help
+	  Sets the linux.bootargs.dyn.watchdog global variable with a value of
+	  systemd.watchdog-device=/dev/WDOG if barebox succeeded in enabling
+	  the watchdog WDOG prior to boot. WDOG is the alias of the watchdog
+	  in the kernel device tree. If the kernel is booted without a device
+	  tree or with one that lacks aliases, nothing is added.
+
 menu "OP-TEE loading"
 
 config OPTEE_SIZE
diff --git a/common/boot.c b/common/boot.c
index 90d504e3c324..710eb6c25f5b 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -119,6 +119,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;
 
@@ -146,10 +153,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);
diff --git a/common/oftree.c b/common/oftree.c
index 36906e86fc7d..075b9d6b8be2 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -14,6 +14,8 @@
 #include <bootsource.h>
 #include <i2c/i2c.h>
 #include <reset_source.h>
+#include <watchdog.h>
+#include <globalvar.h>
 
 #define MAX_LEVEL	32		/* how deeply nested we will go */
 
@@ -139,6 +141,26 @@ static int of_fixup_bootargs_bootsource(struct device_node *root,
 	return ret;
 }
 
+static void watchdog_build_bootargs(struct watchdog *watchdog, struct device_node *root)
+{
+	int alias_id;
+	char *buf;
+
+	if (!watchdog)
+		return;
+
+	alias_id = watchdog_get_alias_id_from(watchdog, root);
+	if (alias_id < 0)
+		return;
+
+	buf = basprintf("systemd.watchdog-device=/dev/watchdog%d", alias_id);
+	if (!buf)
+		return;
+
+	globalvar_add_simple("linux.bootargs.dyn.watchdog", buf);
+	free(buf);
+}
+
 static int of_fixup_bootargs(struct device_node *root, void *unused)
 {
 	struct device_node *node;
@@ -147,6 +169,9 @@ static int of_fixup_bootargs(struct device_node *root, void *unused)
 	int instance = reset_source_get_instance();
 	struct device_d *dev;
 
+	if (IS_ENABLED(CONFIG_SYSTEMD_OF_WATCHDOG))
+		watchdog_build_bootargs(boot_get_enabled_watchdog(), root);
+
 	str = linux_bootargs_get();
 	if (!str)
 		return 0;
diff --git a/include/boot.h b/include/boot.h
index 4054c27d935a..3d5dd1cb6e2c 100644
--- a/include/boot.h
+++ b/include/boot.h
@@ -42,7 +42,10 @@ int bootentry_register_provider(int (*fn)(struct bootentries *bootentries, const
 #define bootentries_for_each_entry(bootentries, entry) \
 	list_for_each_entry(entry, &bootentries->entries, list)
 
+struct watchdog;
+
 void boot_set_watchdog_timeout(unsigned int timeout);
+struct watchdog *boot_get_enabled_watchdog(void);
 struct bootentries *bootentries_alloc(void);
 void bootentries_free(struct bootentries *bootentries);
 int bootentry_create_from_name(struct bootentries *bootentries,
-- 
2.29.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from
  2020-11-24 10:24 [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Ahmad Fatoum
  2020-11-24 10:24 ` [PATCH v2 2/2] boot: introduce option to pass barebox-enabled watchdog to systemd Ahmad Fatoum
@ 2020-11-27  9:07 ` Sascha Hauer
  1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2020-11-27  9:07 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

On Tue, Nov 24, 2020 at 11:24:29AM +0100, Ahmad Fatoum wrote:
> On device-tree enabled platforms, the Linux kernel will first attempt
> to use watchdog%d as watchdog name, where %d is the alias id.
> 
> Add a function that given a barebox struct watchdog and the device tree
> root node of the kernel device tree, computes the corresponding kernel
> alias id.
> 
> This may then later be used to pass an appropriate argument on the
> kernel command line.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
> v1 -> v2:
>   - removed extern where unneeded (Sascha)
> ---
>  drivers/of/base.c          | 77 ++++++++++++++++++++++++++++++--------
>  drivers/watchdog/wd_core.c | 19 ++++++++++
>  include/of.h               |  8 ++++
>  include/watchdog.h         |  8 ++++
>  4 files changed, 97 insertions(+), 15 deletions(-)

Applied, thanks

Sascha

> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 5b45c2023f3b..acbae3d8c4bb 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -149,6 +149,31 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np,
>  		 ap->alias, ap->stem, ap->id, np->full_name);
>  }
>  
> +static struct device_node *of_alias_resolve(struct device_node *root, struct property *pp)
> +{
> +	/* Skip those we do not want to proceed */
> +	if (!of_prop_cmp(pp->name, "name") ||
> +	    !of_prop_cmp(pp->name, "phandle") ||
> +	    !of_prop_cmp(pp->name, "linux,phandle"))
> +		return NULL;
> +
> +	return of_find_node_by_path_from(root, of_property_get_value(pp));
> +}
> +
> +static int of_alias_id_parse(const char *start, int *len)
> +{
> +	const char *end = start + strlen(start);
> +
> +	/* walk the alias backwards to extract the id and work out
> +	 * the 'stem' string */
> +	while (isdigit(*(end-1)) && end > start)
> +		end--;
> +
> +	*len = end - start;
> +
> +	return simple_strtol(end, NULL, 10);
> +}
> +
>  /**
>   * of_alias_scan - Scan all properties of 'aliases' node
>   *
> @@ -175,28 +200,15 @@ void of_alias_scan(void)
>  
>  	list_for_each_entry(pp, &of_aliases->properties, list) {
>  		const char *start = pp->name;
> -		const char *end = start + strlen(start);
>  		struct device_node *np;
>  		struct alias_prop *ap;
>  		int id, len;
>  
> -		/* Skip those we do not want to proceed */
> -		if (!of_prop_cmp(pp->name, "name") ||
> -		    !of_prop_cmp(pp->name, "phandle") ||
> -		    !of_prop_cmp(pp->name, "linux,phandle"))
> -			continue;
> -
> -		np = of_find_node_by_path(of_property_get_value(pp));
> +		np = of_alias_resolve(root_node, pp);
>  		if (!np)
>  			continue;
>  
> -		/* walk the alias backwards to extract the id and work out
> -		 * the 'stem' string */
> -		while (isdigit(*(end-1)) && end > start)
> -			end--;
> -		len = end - start;
> -
> -		id = simple_strtol(end, NULL, 10);
> +		id = of_alias_id_parse(start, &len);
>  		if (id < 0)
>  			continue;
>  
> @@ -235,6 +247,41 @@ int of_alias_get_id(struct device_node *np, const char *stem)
>  }
>  EXPORT_SYMBOL_GPL(of_alias_get_id);
>  
> +int of_alias_get_id_from(struct device_node *root, struct device_node *np,
> +			 const char *stem)
> +{
> +	struct device_node *aliasnp, *entrynp;
> +	struct property *pp;
> +
> +	if (!root)
> +		return of_alias_get_id(np, stem);
> +
> +	aliasnp = of_find_node_by_path_from(root, "/aliases");
> +	if (!aliasnp)
> +		return -ENODEV;
> +
> +	for_each_property_of_node(aliasnp, pp) {
> +		const char *start = pp->name;
> +		int id, len;
> +
> +		entrynp = of_alias_resolve(root_node, pp);
> +		if (entrynp != np)
> +			continue;
> +
> +		id = of_alias_id_parse(start, &len);
> +		if (id < 0)
> +			continue;
> +
> +		if (strncasecmp(start, stem, len))
> +			continue;
> +
> +		return id;
> +	}
> +
> +	return -ENODEV;
> +}
> +EXPORT_SYMBOL_GPL(of_alias_get_id_from);
> +
>  const char *of_alias_get(struct device_node *np)
>  {
>  	struct alias_prop *app;
> diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c
> index 665338af6197..643c53268fc8 100644
> --- a/drivers/watchdog/wd_core.c
> +++ b/drivers/watchdog/wd_core.c
> @@ -261,6 +261,25 @@ struct watchdog *watchdog_get_default(void)
>  }
>  EXPORT_SYMBOL(watchdog_get_default);
>  
> +int watchdog_get_alias_id_from(struct watchdog *wd, struct device_node *root)
> +{
> +	struct device_node *dstnp, *srcnp = wd->hwdev ? wd->hwdev->device_node : NULL;
> +	char *name;
> +
> +	if (!srcnp)
> +		return -ENODEV;
> +
> +	name = of_get_reproducible_name(srcnp);
> +	dstnp = of_find_node_by_reproducible_name(root, name);
> +	free(name);
> +
> +	if (!dstnp)
> +		return -ENODEV;
> +
> +	return of_alias_get_id_from(root, wd->hwdev->device_node, "watchdog");
> +}
> +EXPORT_SYMBOL(watchdog_get_alias_id_from);
> +
>  struct watchdog *watchdog_get_by_name(const char *name)
>  {
>  	struct watchdog *tmp;
> diff --git a/include/of.h b/include/of.h
> index 08a02e110522..dc3aa0730bf7 100644
> --- a/include/of.h
> +++ b/include/of.h
> @@ -254,6 +254,8 @@ extern int of_count_phandle_with_args(const struct device_node *np,
>  
>  extern void of_alias_scan(void);
>  extern int of_alias_get_id(struct device_node *np, const char *stem);
> +extern int of_alias_get_id_from(struct device_node *root, struct device_node *np,
> +				const char *stem);
>  extern const char *of_alias_get(struct device_node *np);
>  extern int of_modalias_node(struct device_node *node, char *modalias, int len);
>  
> @@ -677,6 +679,12 @@ static inline int of_alias_get_id(struct device_node *np, const char *stem)
>  	return -ENOSYS;
>  }
>  
> +static inline int of_alias_get_id_from(struct device_node *root, struct device_node *np,
> +				       const char *stem)
> +{
> +	return -ENOSYS
> +}
> +
>  static inline const char *of_alias_get(struct device_node *np)
>  {
>  	return NULL;
> diff --git a/include/watchdog.h b/include/watchdog.h
> index 81414ef8ecaa..ee8efdecd030 100644
> --- a/include/watchdog.h
> +++ b/include/watchdog.h
> @@ -13,6 +13,8 @@ enum wdog_hw_runnning {
>  	 WDOG_HW_NOT_RUNNING = PARAM_TRISTATE_FALSE
>  };
>  
> +struct device_node;
> +
>  struct watchdog {
>  	int (*set_timeout)(struct watchdog *, unsigned);
>  	const char *name;
> @@ -44,6 +46,7 @@ int watchdog_register(struct watchdog *);
>  int watchdog_deregister(struct watchdog *);
>  struct watchdog *watchdog_get_default(void);
>  struct watchdog *watchdog_get_by_name(const char *name);
> +int watchdog_get_alias_id_from(struct watchdog *, struct device_node *);
>  int watchdog_set_timeout(struct watchdog*, unsigned);
>  int watchdog_inhibit_all(void);
>  #else
> @@ -76,6 +79,11 @@ static inline int watchdog_inhibit_all(void)
>  {
>  	return -ENOSYS;
>  }
> +
> +static inline int watchdog_get_alias_id_from(struct watchdog *, struct device_node *)
> +{
> +	return -ENOSYS;
> +}
>  #endif
>  
>  #define WATCHDOG_DEFAULT_PRIORITY 100
> -- 
> 2.29.2
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-11-27  9:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-24 10:24 [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Ahmad Fatoum
2020-11-24 10:24 ` [PATCH v2 2/2] boot: introduce option to pass barebox-enabled watchdog to systemd Ahmad Fatoum
2020-11-27  9:07 ` [PATCH v2 1/2] watchdog: implement watchdog_get_alias_id_from Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox