15 #include "sw/device/lib/testing/aon_timer_testutils.h"
16 #include "sw/device/lib/testing/pwrmgr_testutils.h"
17 #include "sw/device/lib/testing/rstmgr_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
21 static_assert(kDtPwrmgrCount == 1,
"this test expects exactly one pwrmgr");
22 static const dt_pwrmgr_t kPwrmgrDt = 0;
23 static_assert(kDtRstmgrCount == 1,
"this test expects exactly one rstmgr");
24 static const dt_rstmgr_t kRstmgrDt = 0;
25 static_assert(kDtAonTimerCount >= 1,
26 "this test expects at least one aon_timer");
27 static const dt_aon_timer_t kAonTimerDt = 0;
29 OTTF_DEFINE_TEST_CONFIG();
34 static void config_wdog(
const dif_aon_timer_t *aon_timer,
35 const dif_pwrmgr_t *pwrmgr, uint64_t bark_time_us,
36 uint64_t bite_time_us) {
37 uint32_t bark_cycles = 0;
38 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bark_time_us,
40 uint32_t bite_cycles = 0;
41 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bite_time_us,
44 LOG_INFO(
"Wdog will bark after %u us and bite after %u us",
45 (uint32_t)bark_time_us, (uint32_t)bite_time_us);
51 kDtAonTimerResetReqAonTimer, &reset_sources));
56 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
63 static void wdog_bite_test(
const dif_aon_timer_t *aon_timer,
64 const dif_pwrmgr_t *pwrmgr, uint32_t bark_time_us) {
65 uint64_t bite_time_us = bark_time_us * 2;
66 config_wdog(aon_timer, pwrmgr, bark_time_us, bite_time_us);
70 uint64_t aon_timer_clock_freq_hz = dt_clock_frequency(
71 dt_aon_timer_clock(kDtAonTimerAon, kDtAonTimerClockAon));
73 (uint32_t)bark_time_us +
74 (uint32_t)
udiv64_slow(5 * 1000000 + aon_timer_clock_freq_hz - 1,
75 aon_timer_clock_freq_hz, NULL);
79 bool is_pending =
false;
80 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(
81 aon_timer, kDifAonTimerIrqWdogTimerBark, &is_pending));
82 CHECK(is_pending,
"Wdog bark irq did not rise after %u microseconds",
88 CHECK(
false,
"Timeout waiting for Wdog bite reset!");
94 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
98 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
101 dif_aon_timer_t aon_timer;
102 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
106 rst_info = rstmgr_testutils_reason_get();
107 rstmgr_testutils_reason_clear();
110 rst_info == kDifRstmgrResetInfoWatchdog,
111 "Wrong reset reason %02X", rst_info);
114 LOG_INFO(
"Booting for the first time, setting wdog");
116 wdog_bite_test(&aon_timer, &pwrmgr, 200);
117 }
else if (rst_info == kDifRstmgrResetInfoWatchdog) {
118 LOG_INFO(
"Booting for the second time due to wdog bite reset");
122 LOG_ERROR(
"Got unexpected reset info 0x%x", rst_info);