19 #include "sw/device/lib/testing/aon_timer_testutils.h"
20 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
21 #include "sw/device/lib/testing/nv_counter_testutils.h"
22 #include "sw/device/lib/testing/pwrmgr_testutils.h"
23 #include "sw/device/lib/testing/rstmgr_testutils.h"
24 #include "sw/device/lib/testing/test_framework/check.h"
29 OTTF_DEFINE_TEST_CONFIG();
30 static volatile const uint8_t RST_IDX[5] = {3, 30, 130, 5, 50};
36 static void config_sysrst(
const dif_pwrmgr_t *pwrmgr,
37 const dif_sysrst_ctrl_t *sysrst_ctrl_aon) {
44 dt_sysrst_ctrl_instance_id(kDtSysrstCtrlAon), kDtSysrstCtrlResetReqRstReq,
48 LOG_INFO(
"Reset Request SourceOne is set");
56 .detection_time_threshold = 10,
58 .embedded_controller_reset_duration = 10};
69 CHECK_DIF_OK(dif_pinmux_init(
73 sysrst_ctrl_aon, sysrst_ctrl_input_change_config));
82 CHECK(
false,
"Timeout waiting for sysrst reset!");
88 static void config_wdog(
const dif_aon_timer_t *aon_timer,
89 const dif_pwrmgr_t *pwrmgr, uint64_t bark_time_us,
90 uint64_t bite_time_us) {
91 uint32_t bark_cycles = 0;
92 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bark_time_us,
94 uint32_t bite_cycles = 0;
95 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bite_time_us,
98 LOG_INFO(
"Wdog will bark after %u us and bite after %u us",
99 (uint32_t)bark_time_us, (uint32_t)bite_time_us);
105 kDtAonTimerResetReqAonTimer, &reset_sources));
110 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
111 bite_cycles,
false));
117 static void wdog_bite_test(
const dif_aon_timer_t *aon_timer,
118 const dif_pwrmgr_t *pwrmgr, uint64_t bark_time_us) {
119 uint64_t bite_time_us = bark_time_us * 2;
120 config_wdog(aon_timer, pwrmgr, bark_time_us, bite_time_us);
124 uint64_t wait_us_u64 =
127 CHECK(wait_us_u64 <= UINT32_MAX,
"wait_us_u64 must fit in uint32_t");
128 uint32_t wait_us = (uint32_t)wait_us_u64;
132 bool is_pending =
false;
133 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(
134 aon_timer, kDifAonTimerIrqWdogTimerBark, &is_pending));
135 CHECK(is_pending,
"Wdog bark irq did not rise after %u microseconds",
141 CHECK(
false,
"Timeout waiting for Wdog bite reset!");
147 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kDtPwrmgrAon, &pwrmgr));
150 dif_sysrst_ctrl_t sysrst_ctrl_aon;
151 CHECK_DIF_OK(dif_sysrst_ctrl_init(
157 CHECK_DIF_OK(dif_rstmgr_init(
161 dif_aon_timer_t aon_timer;
162 CHECK_DIF_OK(dif_aon_timer_init(
172 flash_ctrl_testutils_default_region_access(&flash_ctrl,
181 uint32_t event_idx = 0;
182 CHECK_STATUS_OK(flash_ctrl_testutils_counter_get(0, &event_idx));
185 CHECK_STATUS_OK(flash_ctrl_testutils_counter_increment(&flash_ctrl, 0));
187 LOG_INFO(
"Test round %d", event_idx);
188 LOG_INFO(
"RST_IDX[%d] = %d", event_idx, RST_IDX[event_idx]);
192 rst_info = rstmgr_testutils_reason_get();
193 rstmgr_testutils_reason_clear();
196 rst_info == kDifRstmgrResetInfoWatchdog ||
197 rst_info == kDifRstmgrResetInfoSysRstCtrl,
198 "Wrong reset reason %02X", rst_info);
201 LOG_INFO(
"Booting for the first time, setting sysrst");
202 config_sysrst(&pwrmgr, &sysrst_ctrl_aon);
203 }
else if (rst_info == kDifRstmgrResetInfoSysRstCtrl) {
204 LOG_INFO(
"Booting for the second time due to system reset control reset");
206 wdog_bite_test(&aon_timer, &pwrmgr, 200);
207 }
else if (rst_info == kDifRstmgrResetInfoWatchdog) {
208 LOG_INFO(
"Booting for the third time due to wdog bite reset");