[PATCH v2 10/10] sandbox: add test of wdt-uclass' watchdog_reset()
Stefan Roese
sr at denx.de
Tue Jun 29 08:08:55 CEST 2021
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 at prevas.dk>
Reviewed-by: Stefan Roese <sr at 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 at 0 {
> compatible = "sandbox,wdt";
> + hw_margin_ms = <200>;
> };
>
> axi: axi at 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
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list