[PATCH] watchdog: rti: support SPL (or re-start)

Sverdlin, Alexander alexander.sverdlin at siemens.com
Tue Dec 10 13:45:09 CET 2024


Hi Stefan!

On Fri, 2024-11-08 at 22:15 +0100, A. Sverdlin wrote:
> From: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> 
> If the RTI watchdog has been enabled in SPL, enabling it in U-Boot proper
> fails because it can only be enabled once in HW and never stopped. This
> however leads to a situation that wdt_cyclic() watchdog trigger is not
> being started any longer and the WDT fires at some point.
> 
> Allow for WDT re-start by not bailing out if the [previously] configured
> period matches the one to be configured.
> 
> Enabling in [A53] SPL has been tested on AM62x-based HW (where [A53] SPL is
> responsible for loading R5 DM firmware and not this driver).
> 
> Signed-off-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>

I saw that this patch has been set to "Superseded" in the patchwork [1],
but I'm not sure by which patch. Could it be that it happened by mistake?

My other patch for the rti watchdog [2] is addressing some unrelated issue...

1.
https://patchwork.ozlabs.org/project/uboot/patch/20241108211506.1348528-1-alexander.sverdlin@siemens.com/

2.
https://patchwork.ozlabs.org/project/uboot/patch/20241120222412.1873381-1-alexander.sverdlin@siemens.com/
https://patchwork.ozlabs.org/project/uboot/patch/20241121080326.1913067-1-alexander.sverdlin@siemens.com/

> ---
>  drivers/watchdog/rti_wdt.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
> index 99168d0cad03..320c5ca19e0a 100644
> --- a/drivers/watchdog/rti_wdt.c
> +++ b/drivers/watchdog/rti_wdt.c
> @@ -131,18 +131,19 @@ static int rti_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
>  	u32 timer_margin;
>  	int ret;
>  
> -	if (readl(priv->regs + RTIDWDCTRL) == WDENABLE_KEY)
> +	timer_margin = timeout_ms * priv->clk_hz / 1000;
> +	timer_margin >>= WDT_PRELOAD_SHIFT;
> +	if (timer_margin > WDT_PRELOAD_MAX)
> +		timer_margin = WDT_PRELOAD_MAX;
> +
> +	if (readl(priv->regs + RTIDWDCTRL) == WDENABLE_KEY &&
> +	    readl(priv->regs + RTIDWDPRLD) != timer_margin)
>  		return -EBUSY;
>  
>  	ret = rti_wdt_load_fw(dev);
>  	if (ret < 0)
>  		return ret;
>  
> -	timer_margin = timeout_ms * priv->clk_hz / 1000;
> -	timer_margin >>= WDT_PRELOAD_SHIFT;
> -	if (timer_margin > WDT_PRELOAD_MAX)
> -		timer_margin = WDT_PRELOAD_MAX;
> -
>  	writel(timer_margin, priv->regs + RTIDWDPRLD);
>  	writel(RTIWWDRX_NMI, priv->regs + RTIWWDRXCTRL);
>  	writel(RTIWWDSIZE_50P, priv->regs + RTIWWDSIZECTRL);

-- 
Alexander Sverdlin
Siemens AG
www.siemens.com


More information about the U-Boot mailing list