Hi,

Just pinging whether this patch is all good or if something else is needed to 
be merged.

Thanks,
Juuso
________________________________
From: Stefan Roese <[email protected]>
Sent: Friday, 8 May 2026 14.49
To: Juuso Rinta (Nokia) <[email protected]>; [email protected] 
<[email protected]>
Cc: Peng Fan <[email protected]>; Tom Rini <[email protected]>; Patrice Chotard 
<[email protected]>; Yao Zi <[email protected]>
Subject: Re: [PATCH RESEND] watchdog: sbsa_gwdt: clamp WOR value to hw max

[You don't often get email from [email protected]. Learn why this is 
important at https://aka.ms/LearnAboutSenderIdentification ]

CAUTION: This is an external email. Please be very careful when clicking links 
or opening attachments. See the URL nok.it/ext for additional information.



On 5/4/26 11:34, Juuso Rinta wrote:
> The WOR register is 32 bits, so any tick count exceeding U32_MAX is
> truncated by writel(). A large requested timeout can wrap to a small
> value causing the watchdog to fire sooner than requested.
>
> Clamp the calculated value to U32_MAX prior to writing the register so
> over-large requests will be set to the maximum timeout value.
>
> Found by code review.
>
> Signed-off-by: Juuso Rinta <[email protected]>

Reviewed-by: Stefan Roese <[email protected]>

Thanks,
Stefan


> ---
>   drivers/watchdog/sbsa_gwdt.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
> index 807884c5bc7..3a924cb2b9a 100644
> --- a/drivers/watchdog/sbsa_gwdt.c
> +++ b/drivers/watchdog/sbsa_gwdt.c
> @@ -50,6 +50,7 @@ static int sbsa_gwdt_start(struct udevice *dev, u64 
> timeout, ulong flags)
>   {
>       struct sbsa_gwdt_priv *priv = dev_get_priv(dev);
>       u32 clk;
> +     u64 tout_wdog;
>
>       /*
>        * it work in the single stage mode in u-boot,
> @@ -58,8 +59,13 @@ static int sbsa_gwdt_start(struct udevice *dev, u64 
> timeout, ulong flags)
>        * to half value of timeout.
>        */
>       clk = get_tbclk();
> -     writel(clk / (2 * 1000) * timeout,
> -            priv->reg_control + SBSA_GWDT_WOR);
> +
> +     /* if requested timeout overflows, clamp it to u32_max */
> +     tout_wdog = ((u64)clk * timeout) / (2 * 1000);
> +     if (tout_wdog > U32_MAX)
> +             tout_wdog = U32_MAX;
> +
> +     writel(tout_wdog, priv->reg_control + SBSA_GWDT_WOR);
>
>       /* writing WCS will cause an explicit watchdog refresh */
>       writel(SBSA_GWDT_WCS_EN, priv->reg_control + SBSA_GWDT_WCS);
>
> ---
> base-commit: 4433253ecf2041f9362a763bb6cb79960921ac7e
> change-id: 20260428-fix-sbsa-timeout-overflow-20cf84fa8a6b
>
> Best regards,
> --
> Juuso Rinta <[email protected]>

Reply via email to