[PATCH] watchdog: imx2_wdg: Save the actual timeout value

Guenter Roeck linux at roeck-us.net
Sat Jun 15 09:21:52 PDT 2024


On 6/15/24 08:51, L.Q wrote:
> Step 1:
> Call imx2_wdt_set_timeout with a timeout value greater than 128
> This illegal value will be stored in wdog->timeout

This is not an illegal value because the driver sets max_hw_heartbeat_ms
which lets the watchdog core handle timeout values exceeding the maximum
timeout supported by the chip.

[ ... ]

> static inline void imx2_wdt_setup(struct watchdog_device *wdog)
> {
>   struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
>   u32 val;
>   regmap_read(wdev->regmap, IMX2_WDT_WCR, &val);
>   /* Suspend timer in low power mode, write once-only */
>   val |= IMX2_WDT_WCR_WDZST;
>   /* Strip the old watchdog Time-Out value */
>   val &= ~IMX2_WDT_WCR_WT;
>   /* Generate internal chip-level reset if WDOG times out */
>   if (!wdev->ext_reset)
>    val &= ~IMX2_WDT_WCR_WRE;
>   /* Or if external-reset assert WDOG_B reset only on time-out */
>   else
>    val |= IMX2_WDT_WCR_WRE;
>   /* Keep Watchdog Disabled */
>   val &= ~IMX2_WDT_WCR_WDE;
>   /* Set the watchdog's Time-Out value */
>   val |= WDOG_SEC_TO_COUNT(wdog->timeout);
>      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

That is the bug. It needs to be
	val |= WDOG_SEC_TO_COUNT(min(wdog->timeout, IMX2_WDT_MAX_TIME));

Guenter




More information about the linux-arm-kernel mailing list