
On 28.05.21 00:00, Rasmus Villemoes wrote:
Check that the watchdog_reset() implementation in wdt-uclass behaves as expected:
- resets all activated watchdog devices
- leaves unactivated/stopped devices alone
- that the rate-limiting works, with a per-device threshold
Signed-off-by: Rasmus Villemoes rasmus.villemoes@prevas.dk
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
arch/sandbox/dts/test.dts | 2 ++ test/dm/wdt.c | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+)
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index cee5b14ecb..1853b5f29a 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -758,6 +758,7 @@ gpio-wdt { gpios = <&gpio_a 7 0>; compatible = "linux,wdt-gpio";
always-running; };hw_margin_ms = <100>;
@@ -1239,6 +1240,7 @@
wdt0: wdt@0 { compatible = "sandbox,wdt";
hw_margin_ms = <200>;
};
axi: axi@0 {
diff --git a/test/dm/wdt.c b/test/dm/wdt.c index abff853a02..8997aaebc8 100644 --- a/test/dm/wdt.c +++ b/test/dm/wdt.c @@ -12,6 +12,8 @@ #include <dm/test.h> #include <test/test.h> #include <test/ut.h> +#include <linux/delay.h> +#include <watchdog.h>
/* Test that watchdog driver functions are called */ static int dm_test_wdt_base(struct unit_test_state *uts) @@ -73,3 +75,55 @@ static int dm_test_wdt_gpio(struct unit_test_state *uts) return 0; } DM_TEST(dm_test_wdt_gpio, UT_TESTF_SCAN_FDT);
+static int dm_test_wdt_watchdog_reset(struct unit_test_state *uts) +{
- struct sandbox_state *state = state_get_current();
- struct udevice *gpio_wdt, *sandbox_wdt;
- struct udevice *gpio;
- const u64 timeout = 42;
- const int offset = 7;
- uint reset_count;
- int val;
- ut_assertok(uclass_get_device_by_driver(UCLASS_WDT,
DM_DRIVER_GET(wdt_gpio), &gpio_wdt));
- ut_assertnonnull(gpio_wdt);
- ut_assertok(uclass_get_device_by_driver(UCLASS_WDT,
DM_DRIVER_GET(wdt_sandbox), &sandbox_wdt));
- ut_assertnonnull(sandbox_wdt);
- ut_assertok(uclass_get_device_by_name(UCLASS_GPIO, "base-gpios", &gpio));
- ut_assertnonnull(gpio);
- /* Neither device should be "started", so watchdog_reset() should be a no-op. */
- reset_count = state->wdt.reset_count;
- val = sandbox_gpio_get_value(gpio, offset);
- watchdog_reset();
- ut_asserteq(reset_count, state->wdt.reset_count);
- ut_asserteq(val, sandbox_gpio_get_value(gpio, offset));
- /* Start both devices. */
- ut_assertok(wdt_start(gpio_wdt, timeout, 0));
- ut_assertok(wdt_start(sandbox_wdt, timeout, 0));
- /* Make sure both devices have just been pinged. */
- mdelay(100);
- watchdog_reset();
- reset_count = state->wdt.reset_count;
- val = sandbox_gpio_get_value(gpio, offset);
- /* The gpio watchdog should be pinged, the sandbox one not. */
- mdelay(30);
- watchdog_reset();
- ut_asserteq(reset_count, state->wdt.reset_count);
- ut_asserteq(!val, sandbox_gpio_get_value(gpio, offset));
- /* After another ~30ms, both devices should get pinged. */
- mdelay(30);
- watchdog_reset();
- ut_asserteq(reset_count + 1, state->wdt.reset_count);
- ut_asserteq(val, sandbox_gpio_get_value(gpio, offset));
- return 0;
+} +DM_TEST(dm_test_wdt_watchdog_reset, UT_TESTF_SCAN_FDT);
Viele Grüße, Stefan