mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Eddie James <eajames@linux.ibm.com>
To: Guenter Roeck <linux@roeck-us.net>
Cc: linux-watchdog@vger.kernel.org, linux-aspeed@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, wim@linux-watchdog.org,
	andrew@aj.id.au, joel@jms.id.au, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, devicetree@vger.kernel.org
Subject: Re: [PATCH 1/2] watchdog: aspeed: Add pre-timeout interrupt support
Date: Fri, 21 Oct 2022 14:39:10 -0500	[thread overview]
Message-ID: <56929483-56d1-f2b8-9b7e-3fd6388e5f87@linux.ibm.com> (raw)
In-Reply-To: <20221021165650.GA1888515@roeck-us.net>


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
>>

  reply	other threads:[~2022-10-21 19:39 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-21 15:15 [PATCH 0/2] " 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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56929483-56d1-f2b8-9b7e-3fd6388e5f87@linux.ibm.com \
    --to=eajames@linux.ibm.com \
    --cc=andrew@aj.id.au \
    --cc=devicetree@vger.kernel.org \
    --cc=joel@jms.id.au \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-watchdog@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=robh+dt@kernel.org \
    --cc=wim@linux-watchdog.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®