Message ID | 20210527220017.1266765-11-rasmus.villemoes@prevas.dk |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | handling all DM watchdogs in watchdog_reset() | expand |
On Thu, 27 May 2021 at 16:00, Rasmus Villemoes <rasmus.villemoes@prevas.dk> 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> > --- > arch/sandbox/dts/test.dts | 2 ++ > test/dm/wdt.c | 54 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 56 insertions(+) Reviewed-by: Simon Glass <sjg@chromium.org> I'd prefer to advance time though, rather than using mdelay().
On 22/06/2021 15.31, Simon Glass wrote: > On Thu, 27 May 2021 at 16:00, Rasmus Villemoes > <rasmus.villemoes@prevas.dk> 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> >> --- >> arch/sandbox/dts/test.dts | 2 ++ >> test/dm/wdt.c | 54 +++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 56 insertions(+) > > Reviewed-by: Simon Glass <sjg@chromium.org> > > I'd prefer to advance time though, rather than using mdelay(). > Cool, I didn't know we could do that in sandbox. Have a pointer? Thanks, Rasmus
Hi Rasmus, On Tue, 22 Jun 2021 at 14:29, Rasmus Villemoes <rasmus.villemoes@prevas.dk> wrote: > > On 22/06/2021 15.31, Simon Glass wrote: > > On Thu, 27 May 2021 at 16:00, Rasmus Villemoes > > <rasmus.villemoes@prevas.dk> 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> > >> --- > >> arch/sandbox/dts/test.dts | 2 ++ > >> test/dm/wdt.c | 54 +++++++++++++++++++++++++++++++++++++++ > >> 2 files changed, 56 insertions(+) > > > > Reviewed-by: Simon Glass <sjg@chromium.org> > > > > I'd prefer to advance time though, rather than using mdelay(). > > > > Cool, I didn't know we could do that in sandbox. Have a pointer? > You can do anything in sandbox. It is just software :-) See timer_test_add_offset() Regards, Simon
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"; > + hw_margin_ms = <100>; > always-running; > }; > > @@ -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
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"; + hw_margin_ms = <100>; always-running; }; @@ -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);
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> --- arch/sandbox/dts/test.dts | 2 ++ test/dm/wdt.c | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+)