All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] watchdog: aspeed: Add pre-timeout interrupt support
@ 2022-10-21 15:15 Eddie James
  2022-10-21 15:15 ` [PATCH 1/2] " Eddie James
  2022-10-21 15:15 ` [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us Eddie James
  0 siblings, 2 replies; 10+ messages in thread
From: Eddie James @ 2022-10-21 15:15 UTC (permalink / raw)
  To: linux-watchdog
  Cc: linux-aspeed, linux-kernel, wim, linux, andrew, joel, robh+dt,
	krzysztof.kozlowski+dt, devicetree, Eddie James

Enable the pre-timeout interrupt if requested by device property, and
document that property.

Eddie James (2):
  watchdog: aspeed: Add pre-timeout interrupt support
  dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us

 .../bindings/watchdog/aspeed-wdt.txt          |  7 ++-
 drivers/watchdog/aspeed_wdt.c                 | 53 ++++++++++++++++++-
 2 files changed, 57 insertions(+), 3 deletions(-)

-- 
2.31.1


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

* [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
  2022-10-21 15:15 [PATCH 0/2] watchdog: aspeed: Add pre-timeout interrupt support Eddie James
@ 2022-10-21 15:15 ` Eddie James
  2022-10-21 16:56   ` Guenter Roeck
  2022-10-21 15:15 ` [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us Eddie James
  1 sibling, 1 reply; 10+ messages in thread
From: Eddie James @ 2022-10-21 15:15 UTC (permalink / raw)
  To: linux-watchdog
  Cc: linux-aspeed, linux-kernel, wim, linux, andrew, joel, robh+dt,
	krzysztof.kozlowski+dt, devicetree, Eddie James

Enable the pre-timeout interrupt if requested by device property.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 drivers/watchdog/aspeed_wdt.c | 53 +++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 2 deletions(-)

diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
index 0cff2adfbfc9..8e12181a827e 100644
--- a/drivers/watchdog/aspeed_wdt.c
+++ b/drivers/watchdog/aspeed_wdt.c
@@ -5,11 +5,14 @@
  * Joel Stanley <joel@jms.id.au>
  */
 
+#include <linux/bits.h>
 #include <linux/delay.h>
+#include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/watchdog.h>
 
@@ -26,20 +29,32 @@ struct aspeed_wdt {
 
 struct aspeed_wdt_config {
 	u32 ext_pulse_width_mask;
+	u32 irq_shift;
+	u32 irq_mask;
 };
 
 static const struct aspeed_wdt_config ast2400_config = {
 	.ext_pulse_width_mask = 0xff,
+	.irq_shift = 0,
+	.irq_mask = 0,
 };
 
 static const struct aspeed_wdt_config ast2500_config = {
 	.ext_pulse_width_mask = 0xfffff,
+	.irq_shift = 12,
+	.irq_mask = GENMASK(31, 12),
+};
+
+static const struct aspeed_wdt_config ast2600_config = {
+	.ext_pulse_width_mask = 0xfffff,
+	.irq_shift = 0,
+	.irq_mask = GENMASK(31, 10),
 };
 
 static const struct of_device_id aspeed_wdt_of_table[] = {
 	{ .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
 	{ .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
-	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2500_config },
+	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2600_config },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
@@ -58,6 +73,7 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
 #define   WDT_CTRL_RESET_SYSTEM		BIT(1)
 #define   WDT_CTRL_ENABLE		BIT(0)
 #define WDT_TIMEOUT_STATUS	0x10
+#define   WDT_TIMEOUT_STATUS_IRQ		BIT(2)
 #define   WDT_TIMEOUT_STATUS_BOOT_SECONDARY	BIT(1)
 #define WDT_CLEAR_TIMEOUT_STATUS	0x14
 #define   WDT_CLEAR_TIMEOUT_AND_BOOT_CODE_SELECTION	BIT(0)
@@ -243,6 +259,17 @@ static const struct watchdog_info aspeed_wdt_info = {
 	.identity	= KBUILD_MODNAME,
 };
 
+static irqreturn_t aspeed_wdt_irq(int irq, void *arg)
+{
+	struct aspeed_wdt *wdt = arg;
+	u32 status = readl(wdt->base + WDT_TIMEOUT_STATUS);
+
+	if (status & WDT_TIMEOUT_STATUS_IRQ)
+		panic("Watchdog pre-timeout IRQ");
+
+	return IRQ_NONE;
+}
+
 static int aspeed_wdt_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -253,6 +280,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
 	const char *reset_type;
 	u32 duration;
 	u32 status;
+	u32 timeout = 0;
 	int ret;
 
 	wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
@@ -291,6 +319,27 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
 	if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
 		wdt->ctrl = WDT_CTRL_1MHZ_CLK;
 
+	if (config->irq_mask) {
+		if (!of_property_read_u32(np, "aspeed,pre-timeout-irq-us", &timeout) && timeout) {
+			int irq =  platform_get_irq(pdev, 0);
+
+			if (irq < 0) {
+				dev_warn(dev, "Couldn't find IRQ: %d\n", irq);
+				timeout = 0;
+			} else {
+				ret = devm_request_irq(dev, irq, aspeed_wdt_irq, IRQF_SHARED,
+						       dev_name(dev), wdt);
+				if (ret) {
+					dev_warn(dev, "Couldn't request IRQ:%d\n", ret);
+					timeout = 0;
+				} else {
+					wdt->ctrl |= ((timeout << config->irq_shift) &
+						      config->irq_mask) | WDT_CTRL_WDT_INTR;
+				}
+			}
+		}
+	}
+
 	/*
 	 * Control reset on a per-device basis to ensure the
 	 * host is not affected by a BMC reboot
@@ -308,7 +357,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
 		else if (!strcmp(reset_type, "system"))
 			wdt->ctrl |= WDT_CTRL_RESET_MODE_FULL_CHIP |
 				     WDT_CTRL_RESET_SYSTEM;
-		else if (strcmp(reset_type, "none"))
+		else if (strcmp(reset_type, "none") && !timeout)
 			return -EINVAL;
 	}
 	if (of_property_read_bool(np, "aspeed,external-signal"))
-- 
2.31.1


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

* [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us
  2022-10-21 15:15 [PATCH 0/2] watchdog: aspeed: Add pre-timeout interrupt support Eddie James
  2022-10-21 15:15 ` [PATCH 1/2] " Eddie James
@ 2022-10-21 15:15 ` Eddie James
  2022-10-22 16:20   ` Krzysztof Kozlowski
  2022-10-24 18:44   ` Rob Herring
  1 sibling, 2 replies; 10+ messages in thread
From: Eddie James @ 2022-10-21 15:15 UTC (permalink / raw)
  To: linux-watchdog
  Cc: linux-aspeed, linux-kernel, wim, linux, andrew, joel, robh+dt,
	krzysztof.kozlowski+dt, devicetree, Eddie James

Document this new property for the pre-timeout interrupt.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
 Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
index a8197632d6d2..81d2c35ca7e3 100644
--- a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
@@ -40,12 +40,17 @@ Optional properties:
 			specified no external signal is sent.
  - aspeed,ext-pulse-duration: External signal pulse duration in microseconds
 
-Optional properties for AST2500-compatible watchdogs:
+Optional properties for AST2500 and AST2600 compatible watchdogs:
  - aspeed,ext-push-pull: If aspeed,external-signal is present, set the pin's
 			 drive type to push-pull. The default is open-drain.
  - aspeed,ext-active-high: If aspeed,external-signal is present and and the pin
 			   is configured as push-pull, then set the pulse
 			   polarity to active-high. The default is active-low.
+ - aspeed,pre-timeout-irq-us: If aspeed,pre-timeout-irq-us is non-zero, the
+			      pre-timeout interrupt will be enabled for the
+			      watchdog. The interrupt will fire the specified
+			      number of microseconds before the watchdog expires
+			      and trigger a kernel panic.
 
 Example:
 
-- 
2.31.1


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

* Re: [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
  2022-10-21 15:15 ` [PATCH 1/2] " Eddie James
@ 2022-10-21 16:56   ` Guenter Roeck
  2022-10-21 19:39     ` Eddie James
  0 siblings, 1 reply; 10+ messages in thread
From: Guenter Roeck @ 2022-10-21 16:56 UTC (permalink / raw)
  To: Eddie James
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, andrew, joel,
	robh+dt, krzysztof.kozlowski+dt, devicetree

On Fri, Oct 21, 2022 at 10:15:58AM -0500, Eddie James wrote:
> Enable the pre-timeout interrupt if requested by device property.
> 

I am not inclined to accept this patch without detailed explanation.
Why would it make sense and/or be desirable to completely bypass the
watchdog core with this pretimeout support ?

Thanks,
Guenter

> Signed-off-by: Eddie James <eajames@linux.ibm.com>
> ---
>  drivers/watchdog/aspeed_wdt.c | 53 +++++++++++++++++++++++++++++++++--
>  1 file changed, 51 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
> index 0cff2adfbfc9..8e12181a827e 100644
> --- a/drivers/watchdog/aspeed_wdt.c
> +++ b/drivers/watchdog/aspeed_wdt.c
> @@ -5,11 +5,14 @@
>   * Joel Stanley <joel@jms.id.au>
>   */
>  
> +#include <linux/bits.h>
>  #include <linux/delay.h>
> +#include <linux/interrupt.h>
>  #include <linux/io.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_irq.h>
>  #include <linux/platform_device.h>
>  #include <linux/watchdog.h>
>  
> @@ -26,20 +29,32 @@ struct aspeed_wdt {
>  
>  struct aspeed_wdt_config {
>  	u32 ext_pulse_width_mask;
> +	u32 irq_shift;
> +	u32 irq_mask;
>  };
>  
>  static const struct aspeed_wdt_config ast2400_config = {
>  	.ext_pulse_width_mask = 0xff,
> +	.irq_shift = 0,
> +	.irq_mask = 0,
>  };
>  
>  static const struct aspeed_wdt_config ast2500_config = {
>  	.ext_pulse_width_mask = 0xfffff,
> +	.irq_shift = 12,
> +	.irq_mask = GENMASK(31, 12),
> +};
> +
> +static const struct aspeed_wdt_config ast2600_config = {
> +	.ext_pulse_width_mask = 0xfffff,
> +	.irq_shift = 0,
> +	.irq_mask = GENMASK(31, 10),
>  };
>  
>  static const struct of_device_id aspeed_wdt_of_table[] = {
>  	{ .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
>  	{ .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
> -	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2500_config },
> +	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2600_config },
>  	{ },
>  };
>  MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
> @@ -58,6 +73,7 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>  #define   WDT_CTRL_RESET_SYSTEM		BIT(1)
>  #define   WDT_CTRL_ENABLE		BIT(0)
>  #define WDT_TIMEOUT_STATUS	0x10
> +#define   WDT_TIMEOUT_STATUS_IRQ		BIT(2)
>  #define   WDT_TIMEOUT_STATUS_BOOT_SECONDARY	BIT(1)
>  #define WDT_CLEAR_TIMEOUT_STATUS	0x14
>  #define   WDT_CLEAR_TIMEOUT_AND_BOOT_CODE_SELECTION	BIT(0)
> @@ -243,6 +259,17 @@ static const struct watchdog_info aspeed_wdt_info = {
>  	.identity	= KBUILD_MODNAME,
>  };
>  
> +static irqreturn_t aspeed_wdt_irq(int irq, void *arg)
> +{
> +	struct aspeed_wdt *wdt = arg;
> +	u32 status = readl(wdt->base + WDT_TIMEOUT_STATUS);
> +
> +	if (status & WDT_TIMEOUT_STATUS_IRQ)
> +		panic("Watchdog pre-timeout IRQ");
> +
> +	return IRQ_NONE;
> +}
> +
>  static int aspeed_wdt_probe(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
> @@ -253,6 +280,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>  	const char *reset_type;
>  	u32 duration;
>  	u32 status;
> +	u32 timeout = 0;
>  	int ret;
>  
>  	wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
> @@ -291,6 +319,27 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>  	if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
>  		wdt->ctrl = WDT_CTRL_1MHZ_CLK;
>  
> +	if (config->irq_mask) {
> +		if (!of_property_read_u32(np, "aspeed,pre-timeout-irq-us", &timeout) && timeout) {
> +			int irq =  platform_get_irq(pdev, 0);
> +
> +			if (irq < 0) {
> +				dev_warn(dev, "Couldn't find IRQ: %d\n", irq);
> +				timeout = 0;
> +			} else {
> +				ret = devm_request_irq(dev, irq, aspeed_wdt_irq, IRQF_SHARED,
> +						       dev_name(dev), wdt);
> +				if (ret) {
> +					dev_warn(dev, "Couldn't request IRQ:%d\n", ret);
> +					timeout = 0;
> +				} else {
> +					wdt->ctrl |= ((timeout << config->irq_shift) &
> +						      config->irq_mask) | WDT_CTRL_WDT_INTR;
> +				}
> +			}
> +		}
> +	}
> +
>  	/*
>  	 * Control reset on a per-device basis to ensure the
>  	 * host is not affected by a BMC reboot
> @@ -308,7 +357,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>  		else if (!strcmp(reset_type, "system"))
>  			wdt->ctrl |= WDT_CTRL_RESET_MODE_FULL_CHIP |
>  				     WDT_CTRL_RESET_SYSTEM;
> -		else if (strcmp(reset_type, "none"))
> +		else if (strcmp(reset_type, "none") && !timeout)
>  			return -EINVAL;
>  	}
>  	if (of_property_read_bool(np, "aspeed,external-signal"))
> -- 
> 2.31.1
> 

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

* Re: [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
  2022-10-21 16:56   ` Guenter Roeck
@ 2022-10-21 19:39     ` Eddie James
  2022-10-22  4:00       ` Guenter Roeck
  0 siblings, 1 reply; 10+ messages in thread
From: Eddie James @ 2022-10-21 19:39 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, andrew, joel,
	robh+dt, krzysztof.kozlowski+dt, devicetree


On 10/21/22 11:56, Guenter Roeck wrote:
> On Fri, Oct 21, 2022 at 10:15:58AM -0500, Eddie James wrote:
>> Enable the pre-timeout interrupt if requested by device property.
>>
> I am not inclined to accept this patch without detailed explanation.
> Why would it make sense and/or be desirable to completely bypass the
> watchdog core with this pretimeout support ?


Sorry, I should add more detail.

It doesn't necessarily bypass the watchdog core. It can, if you specify 
reset-type="none". But if not, the watchdog will still fire at the 
appropriate time.

The purpose is to get a stack dump from a kernel panic rather than a 
hard reset from the watchdog. The interrupt will fire a certain number 
of microseconds (configurable by dts property) before the watchdog does. 
The interrupt handler then panics, and all the CPU stacks are dumped, so 
hopefully you can catch where another processor was stuck.


I can submit v2 with this information in the commit message and/or comments.

Thanks,

Eddie


>
> Thanks,
> Guenter
>
>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
>> ---
>>   drivers/watchdog/aspeed_wdt.c | 53 +++++++++++++++++++++++++++++++++--
>>   1 file changed, 51 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
>> index 0cff2adfbfc9..8e12181a827e 100644
>> --- a/drivers/watchdog/aspeed_wdt.c
>> +++ b/drivers/watchdog/aspeed_wdt.c
>> @@ -5,11 +5,14 @@
>>    * Joel Stanley <joel@jms.id.au>
>>    */
>>   
>> +#include <linux/bits.h>
>>   #include <linux/delay.h>
>> +#include <linux/interrupt.h>
>>   #include <linux/io.h>
>>   #include <linux/kernel.h>
>>   #include <linux/module.h>
>>   #include <linux/of.h>
>> +#include <linux/of_irq.h>
>>   #include <linux/platform_device.h>
>>   #include <linux/watchdog.h>
>>   
>> @@ -26,20 +29,32 @@ struct aspeed_wdt {
>>   
>>   struct aspeed_wdt_config {
>>   	u32 ext_pulse_width_mask;
>> +	u32 irq_shift;
>> +	u32 irq_mask;
>>   };
>>   
>>   static const struct aspeed_wdt_config ast2400_config = {
>>   	.ext_pulse_width_mask = 0xff,
>> +	.irq_shift = 0,
>> +	.irq_mask = 0,
>>   };
>>   
>>   static const struct aspeed_wdt_config ast2500_config = {
>>   	.ext_pulse_width_mask = 0xfffff,
>> +	.irq_shift = 12,
>> +	.irq_mask = GENMASK(31, 12),
>> +};
>> +
>> +static const struct aspeed_wdt_config ast2600_config = {
>> +	.ext_pulse_width_mask = 0xfffff,
>> +	.irq_shift = 0,
>> +	.irq_mask = GENMASK(31, 10),
>>   };
>>   
>>   static const struct of_device_id aspeed_wdt_of_table[] = {
>>   	{ .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
>>   	{ .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
>> -	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2500_config },
>> +	{ .compatible = "aspeed,ast2600-wdt", .data = &ast2600_config },
>>   	{ },
>>   };
>>   MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>> @@ -58,6 +73,7 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>>   #define   WDT_CTRL_RESET_SYSTEM		BIT(1)
>>   #define   WDT_CTRL_ENABLE		BIT(0)
>>   #define WDT_TIMEOUT_STATUS	0x10
>> +#define   WDT_TIMEOUT_STATUS_IRQ		BIT(2)
>>   #define   WDT_TIMEOUT_STATUS_BOOT_SECONDARY	BIT(1)
>>   #define WDT_CLEAR_TIMEOUT_STATUS	0x14
>>   #define   WDT_CLEAR_TIMEOUT_AND_BOOT_CODE_SELECTION	BIT(0)
>> @@ -243,6 +259,17 @@ static const struct watchdog_info aspeed_wdt_info = {
>>   	.identity	= KBUILD_MODNAME,
>>   };
>>   
>> +static irqreturn_t aspeed_wdt_irq(int irq, void *arg)
>> +{
>> +	struct aspeed_wdt *wdt = arg;
>> +	u32 status = readl(wdt->base + WDT_TIMEOUT_STATUS);
>> +
>> +	if (status & WDT_TIMEOUT_STATUS_IRQ)
>> +		panic("Watchdog pre-timeout IRQ");
>> +
>> +	return IRQ_NONE;
>> +}
>> +
>>   static int aspeed_wdt_probe(struct platform_device *pdev)
>>   {
>>   	struct device *dev = &pdev->dev;
>> @@ -253,6 +280,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>   	const char *reset_type;
>>   	u32 duration;
>>   	u32 status;
>> +	u32 timeout = 0;
>>   	int ret;
>>   
>>   	wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
>> @@ -291,6 +319,27 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>   	if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
>>   		wdt->ctrl = WDT_CTRL_1MHZ_CLK;
>>   
>> +	if (config->irq_mask) {
>> +		if (!of_property_read_u32(np, "aspeed,pre-timeout-irq-us", &timeout) && timeout) {
>> +			int irq =  platform_get_irq(pdev, 0);
>> +
>> +			if (irq < 0) {
>> +				dev_warn(dev, "Couldn't find IRQ: %d\n", irq);
>> +				timeout = 0;
>> +			} else {
>> +				ret = devm_request_irq(dev, irq, aspeed_wdt_irq, IRQF_SHARED,
>> +						       dev_name(dev), wdt);
>> +				if (ret) {
>> +					dev_warn(dev, "Couldn't request IRQ:%d\n", ret);
>> +					timeout = 0;
>> +				} else {
>> +					wdt->ctrl |= ((timeout << config->irq_shift) &
>> +						      config->irq_mask) | WDT_CTRL_WDT_INTR;
>> +				}
>> +			}
>> +		}
>> +	}
>> +
>>   	/*
>>   	 * Control reset on a per-device basis to ensure the
>>   	 * host is not affected by a BMC reboot
>> @@ -308,7 +357,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>   		else if (!strcmp(reset_type, "system"))
>>   			wdt->ctrl |= WDT_CTRL_RESET_MODE_FULL_CHIP |
>>   				     WDT_CTRL_RESET_SYSTEM;
>> -		else if (strcmp(reset_type, "none"))
>> +		else if (strcmp(reset_type, "none") && !timeout)
>>   			return -EINVAL;
>>   	}
>>   	if (of_property_read_bool(np, "aspeed,external-signal"))
>> -- 
>> 2.31.1
>>

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

* Re: [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
  2022-10-21 19:39     ` Eddie James
@ 2022-10-22  4:00       ` Guenter Roeck
  2022-11-01 20:54         ` Eddie James
  0 siblings, 1 reply; 10+ messages in thread
From: Guenter Roeck @ 2022-10-22  4:00 UTC (permalink / raw)
  To: Eddie James
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, andrew, joel,
	robh+dt, krzysztof.kozlowski+dt, devicetree

On 10/21/22 12:39, Eddie James wrote:
> 
> On 10/21/22 11:56, Guenter Roeck wrote:
>> On Fri, Oct 21, 2022 at 10:15:58AM -0500, Eddie James wrote:
>>> Enable the pre-timeout interrupt if requested by device property.
>>>
>> I am not inclined to accept this patch without detailed explanation.
>> Why would it make sense and/or be desirable to completely bypass the
>> watchdog core with this pretimeout support ?
> 
> 
> Sorry, I should add more detail.
> 
> It doesn't necessarily bypass the watchdog core. It can, if you specify reset-type="none". But if not, the watchdog will still fire at the appropriate time.
> 
> The purpose is to get a stack dump from a kernel panic rather than a hard reset from the watchdog. The interrupt will fire a certain number of microseconds (configurable by dts property) before the watchdog does. The interrupt handler then panics, and all the CPU stacks are dumped, so hopefully you can catch where another processor was stuck.
> 
> 
> I can submit v2 with this information in the commit message and/or comments.
> 

You did not answer the question why you do not use the pretimeout functionality
supported by the watchdog core.

Guenter

> Thanks,
> 
> Eddie
> 
> 
>>
>> Thanks,
>> Guenter
>>
>>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
>>> ---
>>>   drivers/watchdog/aspeed_wdt.c | 53 +++++++++++++++++++++++++++++++++--
>>>   1 file changed, 51 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
>>> index 0cff2adfbfc9..8e12181a827e 100644
>>> --- a/drivers/watchdog/aspeed_wdt.c
>>> +++ b/drivers/watchdog/aspeed_wdt.c
>>> @@ -5,11 +5,14 @@
>>>    * Joel Stanley <joel@jms.id.au>
>>>    */
>>> +#include <linux/bits.h>
>>>   #include <linux/delay.h>
>>> +#include <linux/interrupt.h>
>>>   #include <linux/io.h>
>>>   #include <linux/kernel.h>
>>>   #include <linux/module.h>
>>>   #include <linux/of.h>
>>> +#include <linux/of_irq.h>
>>>   #include <linux/platform_device.h>
>>>   #include <linux/watchdog.h>
>>> @@ -26,20 +29,32 @@ struct aspeed_wdt {
>>>   struct aspeed_wdt_config {
>>>       u32 ext_pulse_width_mask;
>>> +    u32 irq_shift;
>>> +    u32 irq_mask;
>>>   };
>>>   static const struct aspeed_wdt_config ast2400_config = {
>>>       .ext_pulse_width_mask = 0xff,
>>> +    .irq_shift = 0,
>>> +    .irq_mask = 0,
>>>   };
>>>   static const struct aspeed_wdt_config ast2500_config = {
>>>       .ext_pulse_width_mask = 0xfffff,
>>> +    .irq_shift = 12,
>>> +    .irq_mask = GENMASK(31, 12),
>>> +};
>>> +
>>> +static const struct aspeed_wdt_config ast2600_config = {
>>> +    .ext_pulse_width_mask = 0xfffff,
>>> +    .irq_shift = 0,
>>> +    .irq_mask = GENMASK(31, 10),
>>>   };
>>>   static const struct of_device_id aspeed_wdt_of_table[] = {
>>>       { .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
>>>       { .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
>>> -    { .compatible = "aspeed,ast2600-wdt", .data = &ast2500_config },
>>> +    { .compatible = "aspeed,ast2600-wdt", .data = &ast2600_config },
>>>       { },
>>>   };
>>>   MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>>> @@ -58,6 +73,7 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>>>   #define   WDT_CTRL_RESET_SYSTEM        BIT(1)
>>>   #define   WDT_CTRL_ENABLE        BIT(0)
>>>   #define WDT_TIMEOUT_STATUS    0x10
>>> +#define   WDT_TIMEOUT_STATUS_IRQ        BIT(2)
>>>   #define   WDT_TIMEOUT_STATUS_BOOT_SECONDARY    BIT(1)
>>>   #define WDT_CLEAR_TIMEOUT_STATUS    0x14
>>>   #define   WDT_CLEAR_TIMEOUT_AND_BOOT_CODE_SELECTION    BIT(0)
>>> @@ -243,6 +259,17 @@ static const struct watchdog_info aspeed_wdt_info = {
>>>       .identity    = KBUILD_MODNAME,
>>>   };
>>> +static irqreturn_t aspeed_wdt_irq(int irq, void *arg)
>>> +{
>>> +    struct aspeed_wdt *wdt = arg;
>>> +    u32 status = readl(wdt->base + WDT_TIMEOUT_STATUS);
>>> +
>>> +    if (status & WDT_TIMEOUT_STATUS_IRQ)
>>> +        panic("Watchdog pre-timeout IRQ");
>>> +
>>> +    return IRQ_NONE;
>>> +}
>>> +
>>>   static int aspeed_wdt_probe(struct platform_device *pdev)
>>>   {
>>>       struct device *dev = &pdev->dev;
>>> @@ -253,6 +280,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>>       const char *reset_type;
>>>       u32 duration;
>>>       u32 status;
>>> +    u32 timeout = 0;
>>>       int ret;
>>>       wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
>>> @@ -291,6 +319,27 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>>       if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
>>>           wdt->ctrl = WDT_CTRL_1MHZ_CLK;
>>> +    if (config->irq_mask) {
>>> +        if (!of_property_read_u32(np, "aspeed,pre-timeout-irq-us", &timeout) && timeout) {
>>> +            int irq =  platform_get_irq(pdev, 0);
>>> +
>>> +            if (irq < 0) {
>>> +                dev_warn(dev, "Couldn't find IRQ: %d\n", irq);
>>> +                timeout = 0;
>>> +            } else {
>>> +                ret = devm_request_irq(dev, irq, aspeed_wdt_irq, IRQF_SHARED,
>>> +                               dev_name(dev), wdt);
>>> +                if (ret) {
>>> +                    dev_warn(dev, "Couldn't request IRQ:%d\n", ret);
>>> +                    timeout = 0;
>>> +                } else {
>>> +                    wdt->ctrl |= ((timeout << config->irq_shift) &
>>> +                              config->irq_mask) | WDT_CTRL_WDT_INTR;
>>> +                }
>>> +            }
>>> +        }
>>> +    }
>>> +
>>>       /*
>>>        * Control reset on a per-device basis to ensure the
>>>        * host is not affected by a BMC reboot
>>> @@ -308,7 +357,7 @@ static int aspeed_wdt_probe(struct platform_device *pdev)
>>>           else if (!strcmp(reset_type, "system"))
>>>               wdt->ctrl |= WDT_CTRL_RESET_MODE_FULL_CHIP |
>>>                        WDT_CTRL_RESET_SYSTEM;
>>> -        else if (strcmp(reset_type, "none"))
>>> +        else if (strcmp(reset_type, "none") && !timeout)
>>>               return -EINVAL;
>>>       }
>>>       if (of_property_read_bool(np, "aspeed,external-signal"))
>>> -- 
>>> 2.31.1
>>>


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

* Re: [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us
  2022-10-21 15:15 ` [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us Eddie James
@ 2022-10-22 16:20   ` Krzysztof Kozlowski
  2022-10-24 18:44   ` Rob Herring
  1 sibling, 0 replies; 10+ messages in thread
From: Krzysztof Kozlowski @ 2022-10-22 16:20 UTC (permalink / raw)
  To: Eddie James, linux-watchdog
  Cc: linux-aspeed, linux-kernel, wim, linux, andrew, joel, robh+dt,
	krzysztof.kozlowski+dt, devicetree

On 21/10/2022 11:15, Eddie James wrote:
> Document this new property for the pre-timeout interrupt.

Please convert bindings to DT schema first.

Best regards,
Krzysztof


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

* Re: [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us
  2022-10-21 15:15 ` [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us Eddie James
  2022-10-22 16:20   ` Krzysztof Kozlowski
@ 2022-10-24 18:44   ` Rob Herring
  2022-10-24 19:03     ` Guenter Roeck
  1 sibling, 1 reply; 10+ messages in thread
From: Rob Herring @ 2022-10-24 18:44 UTC (permalink / raw)
  To: Eddie James
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, linux, andrew,
	joel, krzysztof.kozlowski+dt, devicetree

On Fri, Oct 21, 2022 at 10:15:59AM -0500, Eddie James wrote:
> Document this new property for the pre-timeout interrupt.
> 
> Signed-off-by: Eddie James <eajames@linux.ibm.com>
> ---
>  Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
> index a8197632d6d2..81d2c35ca7e3 100644
> --- a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
> +++ b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
> @@ -40,12 +40,17 @@ Optional properties:
>  			specified no external signal is sent.
>   - aspeed,ext-pulse-duration: External signal pulse duration in microseconds
>  
> -Optional properties for AST2500-compatible watchdogs:
> +Optional properties for AST2500 and AST2600 compatible watchdogs:
>   - aspeed,ext-push-pull: If aspeed,external-signal is present, set the pin's
>  			 drive type to push-pull. The default is open-drain.
>   - aspeed,ext-active-high: If aspeed,external-signal is present and and the pin
>  			   is configured as push-pull, then set the pulse
>  			   polarity to active-high. The default is active-low.
> + - aspeed,pre-timeout-irq-us: If aspeed,pre-timeout-irq-us is non-zero, the
> +			      pre-timeout interrupt will be enabled for the
> +			      watchdog. The interrupt will fire the specified
> +			      number of microseconds before the watchdog expires
> +			      and trigger a kernel panic.

A pre-timeout interrupt is fairly common. Come up with a common property 
please. You'll need to be clear if the time is from wdog restart or time 
before final timeout. 

Rob

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

* Re: [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us
  2022-10-24 18:44   ` Rob Herring
@ 2022-10-24 19:03     ` Guenter Roeck
  0 siblings, 0 replies; 10+ messages in thread
From: Guenter Roeck @ 2022-10-24 19:03 UTC (permalink / raw)
  To: Rob Herring, Eddie James
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, andrew, joel,
	krzysztof.kozlowski+dt, devicetree

On 10/24/22 11:44, Rob Herring wrote:
> On Fri, Oct 21, 2022 at 10:15:59AM -0500, Eddie James wrote:
>> Document this new property for the pre-timeout interrupt.
>>
>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
>> ---
>>   Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt | 7 ++++++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
>> index a8197632d6d2..81d2c35ca7e3 100644
>> --- a/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
>> +++ b/Documentation/devicetree/bindings/watchdog/aspeed-wdt.txt
>> @@ -40,12 +40,17 @@ Optional properties:
>>   			specified no external signal is sent.
>>    - aspeed,ext-pulse-duration: External signal pulse duration in microseconds
>>   
>> -Optional properties for AST2500-compatible watchdogs:
>> +Optional properties for AST2500 and AST2600 compatible watchdogs:
>>    - aspeed,ext-push-pull: If aspeed,external-signal is present, set the pin's
>>   			 drive type to push-pull. The default is open-drain.
>>    - aspeed,ext-active-high: If aspeed,external-signal is present and and the pin
>>   			   is configured as push-pull, then set the pulse
>>   			   polarity to active-high. The default is active-low.
>> + - aspeed,pre-timeout-irq-us: If aspeed,pre-timeout-irq-us is non-zero, the
>> +			      pre-timeout interrupt will be enabled for the
>> +			      watchdog. The interrupt will fire the specified
>> +			      number of microseconds before the watchdog expires
>> +			      and trigger a kernel panic.
> 
> A pre-timeout interrupt is fairly common. Come up with a common property
> please. You'll need to be clear if the time is from wdog restart or time
> before final timeout.
> 

It would be nice if it would match the semantics of the existing
pretimeout attribute in the watchdog core.

Guenter


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

* Re: [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
  2022-10-22  4:00       ` Guenter Roeck
@ 2022-11-01 20:54         ` Eddie James
  0 siblings, 0 replies; 10+ messages in thread
From: Eddie James @ 2022-11-01 20:54 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-watchdog, linux-aspeed, linux-kernel, wim, andrew, joel,
	robh+dt, krzysztof.kozlowski+dt, devicetree


On 10/21/22 23:00, Guenter Roeck wrote:
> On 10/21/22 12:39, Eddie James wrote:
>>
>> On 10/21/22 11:56, Guenter Roeck wrote:
>>> On Fri, Oct 21, 2022 at 10:15:58AM -0500, Eddie James wrote:
>>>> Enable the pre-timeout interrupt if requested by device property.
>>>>
>>> I am not inclined to accept this patch without detailed explanation.
>>> Why would it make sense and/or be desirable to completely bypass the
>>> watchdog core with this pretimeout support ?
>>
>>
>> Sorry, I should add more detail.
>>
>> It doesn't necessarily bypass the watchdog core. It can, if you 
>> specify reset-type="none". But if not, the watchdog will still fire 
>> at the appropriate time.
>>
>> The purpose is to get a stack dump from a kernel panic rather than a 
>> hard reset from the watchdog. The interrupt will fire a certain 
>> number of microseconds (configurable by dts property) before the 
>> watchdog does. The interrupt handler then panics, and all the CPU 
>> stacks are dumped, so hopefully you can catch where another processor 
>> was stuck.
>>
>>
>> I can submit v2 with this information in the commit message and/or 
>> comments.
>>
>
> You did not answer the question why you do not use the pretimeout 
> functionality
> supported by the watchdog core.


I misunderstood your question and I wasn't actually aware of the 
pretimeout support in the core. I have sent v2 using the core pretimeout.


Thanks,

Eddie


>
> Guenter
>
>> Thanks,
>>
>> Eddie
>>
>>
>>>
>>> Thanks,
>>> Guenter
>>>
>>>> Signed-off-by: Eddie James <eajames@linux.ibm.com>
>>>> ---
>>>>   drivers/watchdog/aspeed_wdt.c | 53 
>>>> +++++++++++++++++++++++++++++++++--
>>>>   1 file changed, 51 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/watchdog/aspeed_wdt.c 
>>>> b/drivers/watchdog/aspeed_wdt.c
>>>> index 0cff2adfbfc9..8e12181a827e 100644
>>>> --- a/drivers/watchdog/aspeed_wdt.c
>>>> +++ b/drivers/watchdog/aspeed_wdt.c
>>>> @@ -5,11 +5,14 @@
>>>>    * Joel Stanley <joel@jms.id.au>
>>>>    */
>>>> +#include <linux/bits.h>
>>>>   #include <linux/delay.h>
>>>> +#include <linux/interrupt.h>
>>>>   #include <linux/io.h>
>>>>   #include <linux/kernel.h>
>>>>   #include <linux/module.h>
>>>>   #include <linux/of.h>
>>>> +#include <linux/of_irq.h>
>>>>   #include <linux/platform_device.h>
>>>>   #include <linux/watchdog.h>
>>>> @@ -26,20 +29,32 @@ struct aspeed_wdt {
>>>>   struct aspeed_wdt_config {
>>>>       u32 ext_pulse_width_mask;
>>>> +    u32 irq_shift;
>>>> +    u32 irq_mask;
>>>>   };
>>>>   static const struct aspeed_wdt_config ast2400_config = {
>>>>       .ext_pulse_width_mask = 0xff,
>>>> +    .irq_shift = 0,
>>>> +    .irq_mask = 0,
>>>>   };
>>>>   static const struct aspeed_wdt_config ast2500_config = {
>>>>       .ext_pulse_width_mask = 0xfffff,
>>>> +    .irq_shift = 12,
>>>> +    .irq_mask = GENMASK(31, 12),
>>>> +};
>>>> +
>>>> +static const struct aspeed_wdt_config ast2600_config = {
>>>> +    .ext_pulse_width_mask = 0xfffff,
>>>> +    .irq_shift = 0,
>>>> +    .irq_mask = GENMASK(31, 10),
>>>>   };
>>>>   static const struct of_device_id aspeed_wdt_of_table[] = {
>>>>       { .compatible = "aspeed,ast2400-wdt", .data = &ast2400_config },
>>>>       { .compatible = "aspeed,ast2500-wdt", .data = &ast2500_config },
>>>> -    { .compatible = "aspeed,ast2600-wdt", .data = &ast2500_config },
>>>> +    { .compatible = "aspeed,ast2600-wdt", .data = &ast2600_config },
>>>>       { },
>>>>   };
>>>>   MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>>>> @@ -58,6 +73,7 @@ MODULE_DEVICE_TABLE(of, aspeed_wdt_of_table);
>>>>   #define   WDT_CTRL_RESET_SYSTEM        BIT(1)
>>>>   #define   WDT_CTRL_ENABLE        BIT(0)
>>>>   #define WDT_TIMEOUT_STATUS    0x10
>>>> +#define   WDT_TIMEOUT_STATUS_IRQ        BIT(2)
>>>>   #define   WDT_TIMEOUT_STATUS_BOOT_SECONDARY    BIT(1)
>>>>   #define WDT_CLEAR_TIMEOUT_STATUS    0x14
>>>>   #define   WDT_CLEAR_TIMEOUT_AND_BOOT_CODE_SELECTION BIT(0)
>>>> @@ -243,6 +259,17 @@ static const struct watchdog_info 
>>>> aspeed_wdt_info = {
>>>>       .identity    = KBUILD_MODNAME,
>>>>   };
>>>> +static irqreturn_t aspeed_wdt_irq(int irq, void *arg)
>>>> +{
>>>> +    struct aspeed_wdt *wdt = arg;
>>>> +    u32 status = readl(wdt->base + WDT_TIMEOUT_STATUS);
>>>> +
>>>> +    if (status & WDT_TIMEOUT_STATUS_IRQ)
>>>> +        panic("Watchdog pre-timeout IRQ");
>>>> +
>>>> +    return IRQ_NONE;
>>>> +}
>>>> +
>>>>   static int aspeed_wdt_probe(struct platform_device *pdev)
>>>>   {
>>>>       struct device *dev = &pdev->dev;
>>>> @@ -253,6 +280,7 @@ static int aspeed_wdt_probe(struct 
>>>> platform_device *pdev)
>>>>       const char *reset_type;
>>>>       u32 duration;
>>>>       u32 status;
>>>> +    u32 timeout = 0;
>>>>       int ret;
>>>>       wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
>>>> @@ -291,6 +319,27 @@ static int aspeed_wdt_probe(struct 
>>>> platform_device *pdev)
>>>>       if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
>>>>           wdt->ctrl = WDT_CTRL_1MHZ_CLK;
>>>> +    if (config->irq_mask) {
>>>> +        if (!of_property_read_u32(np, "aspeed,pre-timeout-irq-us", 
>>>> &timeout) && timeout) {
>>>> +            int irq =  platform_get_irq(pdev, 0);
>>>> +
>>>> +            if (irq < 0) {
>>>> +                dev_warn(dev, "Couldn't find IRQ: %d\n", irq);
>>>> +                timeout = 0;
>>>> +            } else {
>>>> +                ret = devm_request_irq(dev, irq, aspeed_wdt_irq, 
>>>> IRQF_SHARED,
>>>> +                               dev_name(dev), wdt);
>>>> +                if (ret) {
>>>> +                    dev_warn(dev, "Couldn't request IRQ:%d\n", ret);
>>>> +                    timeout = 0;
>>>> +                } else {
>>>> +                    wdt->ctrl |= ((timeout << config->irq_shift) &
>>>> +                              config->irq_mask) | WDT_CTRL_WDT_INTR;
>>>> +                }
>>>> +            }
>>>> +        }
>>>> +    }
>>>> +
>>>>       /*
>>>>        * Control reset on a per-device basis to ensure the
>>>>        * host is not affected by a BMC reboot
>>>> @@ -308,7 +357,7 @@ static int aspeed_wdt_probe(struct 
>>>> platform_device *pdev)
>>>>           else if (!strcmp(reset_type, "system"))
>>>>               wdt->ctrl |= WDT_CTRL_RESET_MODE_FULL_CHIP |
>>>>                        WDT_CTRL_RESET_SYSTEM;
>>>> -        else if (strcmp(reset_type, "none"))
>>>> +        else if (strcmp(reset_type, "none") && !timeout)
>>>>               return -EINVAL;
>>>>       }
>>>>       if (of_property_read_bool(np, "aspeed,external-signal"))
>>>> -- 
>>>> 2.31.1
>>>>
>

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

end of thread, other threads:[~2022-11-01 20:55 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-21 15:15 [PATCH 0/2] watchdog: aspeed: Add pre-timeout interrupt support Eddie James
2022-10-21 15:15 ` [PATCH 1/2] " Eddie James
2022-10-21 16:56   ` Guenter Roeck
2022-10-21 19:39     ` Eddie James
2022-10-22  4:00       ` Guenter Roeck
2022-11-01 20:54         ` Eddie James
2022-10-21 15:15 ` [PATCH 2/2] dt-bindings: watchdog: aspeed: Document aspeed,pre-timeout-irq-us Eddie James
2022-10-22 16:20   ` Krzysztof Kozlowski
2022-10-24 18:44   ` Rob Herring
2022-10-24 19:03     ` Guenter Roeck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.