[PATCH RESEND] watchdog: sbsa_gwdt: clamp WOR value to hw max

Juuso Rinta (Nokia) juuso.rinta at nokia.com
Thu Jun 4 13:27:54 CEST 2026


Hi,

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

Thanks,
Juuso
________________________________
From: Stefan Roese <stefan.roese at mailbox.org>
Sent: Friday, 8 May 2026 14.49
To: Juuso Rinta (Nokia) <juuso.rinta at nokia.com>; u-boot at lists.denx.de <u-boot at lists.denx.de>
Cc: Peng Fan <peng.fan at nxp.com>; Tom Rini <trini at konsulko.com>; Patrice Chotard <patrice.chotard at foss.st.com>; Yao Zi <me at ziyao.cc>
Subject: Re: [PATCH RESEND] watchdog: sbsa_gwdt: clamp WOR value to hw max

[You don't often get email from stefan.roese at mailbox.org. 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 <juuso.rinta at nokia.com>

Reviewed-by: Stefan Roese <stefan.roese at mailbox.org>

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 <juuso.rinta at nokia.com>



More information about the U-Boot mailing list