10 #include "dt/dt_adc_ctrl.h"
23 #include "sw/device/lib/runtime/irq.h"
25 #include "sw/device/lib/testing/alert_handler_testutils.h"
26 #include "sw/device/lib/testing/aon_timer_testutils.h"
27 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
28 #include "sw/device/lib/testing/nv_counter_testutils.h"
29 #include "sw/device/lib/testing/pwrmgr_testutils.h"
30 #include "sw/device/lib/testing/rstmgr_testutils.h"
31 #include "sw/device/lib/testing/rv_plic_testutils.h"
32 #include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
33 #include "sw/device/lib/testing/test_framework/check.h"
38 OTTF_DEFINE_TEST_CONFIG();
39 static volatile const uint8_t RST_IDX[12] = {0, 1, 2, 3, 4, 5,
47 static dif_rv_plic_t plic;
48 static dif_alert_handler_t alert_handler;
49 static dif_aon_timer_t aon_timer;
50 static dif_pwrmgr_t pwrmgr;
51 static dif_rstmgr_t rstmgr;
53 static const dt_adc_ctrl_t kAdcCtrlDt = 0;
54 static_assert(kDtAdcCtrlCount == 1,
"this test expects an adc_ctrl");
55 static const dt_rstmgr_t kRstmgrDt = 0;
56 static_assert(kDtRstmgrCount == 1,
"this test expects a rstmgr");
57 static const dt_pwrmgr_t kPwrmgrDt = 0;
58 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
59 static const dt_aon_timer_t kAonTimerDt = 0;
60 static_assert(kDtAonTimerCount == 1,
"this test expects an aon_timer");
61 static const dt_rv_plic_t kRvPlicDt = 0;
62 static_assert(kDtRvPlicCount >= 1,
"this test expects at least one rv_plic");
63 static const dt_flash_ctrl_t kFlashCtrlDt = 0;
64 static_assert(kDtFlashCtrlCount >= 1,
65 "this test expects at least one flash_ctrl");
66 static const dt_alert_handler_t kAlertHandlerDt = 0;
67 static_assert(kDtAlertHandlerCount == 1,
68 "this library expects exactly one alert_handler");
81 kWdogBarkMicros = 3 * 100,
82 kWdogBiteMicros = 4 * 100,
83 kEscalationPhase0Micros = 1 * 100,
88 kEscalationPhase0MicrosCpu = kEscalationPhase0Micros + 20,
89 kEscalationPhase1Micros = 5 * 100,
90 kEscalationPhase2Micros = 50,
94 kWdogBarkMicros < kWdogBiteMicros &&
95 kWdogBarkMicros > kEscalationPhase0Micros &&
96 kWdogBarkMicros < (kEscalationPhase0Micros + kEscalationPhase1Micros) &&
97 kWdogBiteMicros < (kEscalationPhase0Micros + kEscalationPhase1Micros),
98 "The wdog bark and bite shall happens during the escalation phase 1");
107 void ottf_external_isr(uint32_t *exc_info) {
120 (dif_aon_timer_irq_t)(irq_id -
126 kDifAlertHandlerClassA));
127 CHECK_DIF_OK(dif_aon_timer_irq_acknowledge(&aon_timer, irq));
130 "AON Timer Wdog should not bark");
141 &alert_handler, kDifAlertHandlerClassA, &state));
145 CHECK_DIF_OK(dif_alert_handler_irq_acknowledge(&alert_handler, irq));
156 void init_peripherals(
void) {
158 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
161 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
164 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
167 kDtAonTimerWakeupWkupReq, &aon_timer_wakeup_sources));
173 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
175 rv_plic_testutils_irq_range_enable(
180 CHECK_DIF_OK(dif_alert_handler_init_from_dt(kAlertHandlerDt, &alert_handler));
185 kDtAdcCtrlWakeupWkupReq, &adc_ctrl_wakeup_sources));
188 kDtAonTimerResetReqAonTimer, &wdog_reset_sources));
198 static void alert_handler_config(
void) {
202 uint32_t cycles[3] = {0};
203 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
204 kEscalationPhase0Micros, &cycles[0]));
205 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
206 kEscalationPhase1Micros, &cycles[1]));
207 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
208 kEscalationPhase2Micros, &cycles[2]));
214 cycles[0] * alert_handler_testutils_cycle_rescaling_factor()},
218 cycles[1] * alert_handler_testutils_cycle_rescaling_factor()},
222 cycles[2] * alert_handler_testutils_cycle_rescaling_factor()}};
226 .accumulator_threshold = 0,
227 .irq_deadline_cycles =
228 cycles[0] * alert_handler_testutils_cycle_rescaling_factor(),
229 .escalation_phases = esc_phases,
230 .escalation_phases_len =
ARRAYSIZE(esc_phases),
237 .alert_classes = alert_classes,
240 .class_configs = class_config,
242 .ping_timeout = kAlertHandlerTestutilsDefaultPingTimeout,
245 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
248 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
255 static void config_escalate(dif_aon_timer_t *aon_timer,
256 const dif_pwrmgr_t *pwrmgr) {
257 uint32_t bark_cycles = 0;
258 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBarkMicros,
260 bark_cycles *= alert_handler_testutils_cycle_rescaling_factor();
261 uint32_t bite_cycles = 0;
262 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBiteMicros,
264 bite_cycles *= alert_handler_testutils_cycle_rescaling_factor();
267 "Wdog will bark after %u/%u us/cycles and bite after %u/%u us/cycles",
268 (uint32_t)kWdogBarkMicros, (uint32_t)bark_cycles,
269 (uint32_t)kWdogBiteMicros, (uint32_t)bite_cycles);
272 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
273 bite_cycles,
false));
276 dif_pwrmgr_alert_t alert = kDifPwrmgrAlertFatalFault;
277 CHECK_DIF_OK(dif_pwrmgr_alert_force(pwrmgr, alert));
280 static void low_power_glitch_reset(
const dif_pwrmgr_t *pwrmgr) {
283 pwrmgr_testutils_enable_low_power(pwrmgr, aon_timer_wakeup_sources, 0));
288 static void normal_sleep_glitch_reset(
const dif_pwrmgr_t *pwrmgr) {
291 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
294 kDifPwrmgrDomainOptionMainPowerInLowPower;
295 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
296 pwrmgr, aon_timer_wakeup_sources, config));
301 static void timer_on(uint32_t usec) {
304 CHECK(
false,
"Timeout waiting for reset!");
310 static void config_wdog(
const dif_aon_timer_t *aon_timer,
311 const dif_pwrmgr_t *pwrmgr, uint64_t bark_time_us,
312 uint64_t bite_time_us) {
313 uint32_t bark_cycles = 0;
314 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bark_time_us,
316 uint32_t bite_cycles = 0;
317 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bite_time_us,
320 LOG_INFO(
"Wdog will bark after %u us and bite after %u us",
321 (uint32_t)bark_time_us, (uint32_t)bite_time_us);
324 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
325 bite_cycles,
false));
334 static void sleep_wdog_bite_test(
const dif_aon_timer_t *aon_timer,
335 const dif_pwrmgr_t *pwrmgr,
336 uint64_t bark_time_us) {
337 uint64_t bite_time_us = bark_time_us * 2;
338 config_wdog(aon_timer, pwrmgr, bark_time_us, bite_time_us);
341 static void low_power_wdog(
const dif_pwrmgr_t *pwrmgr) {
345 pwrmgr_testutils_enable_low_power(pwrmgr, adc_ctrl_wakeup_sources, 0));
346 LOG_INFO(
"Low power set for watch dog");
349 CHECK(
false,
"Fail to enter in low power mode!");
352 static void normal_sleep_wdog(
const dif_pwrmgr_t *pwrmgr) {
355 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
358 kDifPwrmgrDomainOptionMainPowerInLowPower;
361 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
362 pwrmgr, adc_ctrl_wakeup_sources, config));
363 LOG_INFO(
"Normal sleep set for watchdog");
367 static void low_power_por(
const dif_pwrmgr_t *pwrmgr) {
374 pwrmgr_testutils_enable_low_power(pwrmgr, all_wakeup_sources, 0));
378 CHECK(
false,
"Fail to enter in low power mode!");
381 static void normal_sleep_por(
const dif_pwrmgr_t *pwrmgr) {
388 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
391 kDifPwrmgrDomainOptionMainPowerInLowPower;
395 pwrmgr_testutils_enable_low_power(pwrmgr, all_wakeup_sources, config));
402 irq_global_ctrl(
true);
403 irq_external_ctrl(
true);
408 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget,
412 alert_handler_config();
415 uint32_t event_idx = 0;
416 CHECK_STATUS_OK(flash_ctrl_testutils_counter_get(0, &event_idx));
420 flash_ctrl_testutils_default_region_access(&flash_ctrl,
429 CHECK_STATUS_OK(flash_ctrl_testutils_counter_increment(&flash_ctrl, 0));
431 LOG_INFO(
"Test round %d", event_idx);
432 LOG_INFO(
"RST_IDX[%d] = %d", event_idx, RST_IDX[event_idx]);
436 rst_info = rstmgr_testutils_reason_get();
437 rstmgr_testutils_reason_clear();
438 LOG_INFO(
"reset info = %02X", rst_info);
441 rst_info == kDifRstmgrResetInfoSysRstCtrl ||
442 rst_info == kDifRstmgrResetInfoWatchdog ||
445 rst_info == (kDifRstmgrResetInfoSysRstCtrl |
450 kDifRstmgrResetInfoWatchdog |
453 kDifRstmgrResetInfoWatchdog) ||
457 rst_info == (kDifRstmgrResetInfoWatchdog |
462 "Wrong reset reason %02X", rst_info);
464 switch (RST_IDX[event_idx] / 2) {
466 if (RST_IDX[event_idx] % 2) {
467 LOG_INFO(
"Booting and setting normal sleep followed by glitch reset");
468 LOG_INFO(
"Let SV wait timer reset");
469 normal_sleep_glitch_reset(&pwrmgr);
470 timer_on(kWdogBiteMicros);
472 LOG_INFO(
"Booting and setting deep sleep followed by glitch reset");
473 LOG_INFO(
"Let SV wait timer reset");
474 low_power_glitch_reset(&pwrmgr);
478 if (RST_IDX[event_idx] % 2) {
479 LOG_INFO(
"Booting and setting normal sleep followed by hw por");
480 LOG_INFO(
"Let SV wait timer reset");
481 normal_sleep_por(&pwrmgr);
482 timer_on(kWdogBiteMicros);
484 LOG_INFO(
"Booting and setting deep sleep followed by hw por");
485 LOG_INFO(
"Let SV wait timer reset");
486 low_power_por(&pwrmgr);
490 if (RST_IDX[event_idx] % 2) {
492 "Booting and setting normal sleep mode followed for low_power "
494 LOG_INFO(
"Let SV wait timer reset");
496 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
497 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
498 normal_sleep_wdog(&pwrmgr);
499 timer_on(kEscalationPhase0MicrosCpu);
502 "Booting and setting deep sleep mode followed for low_power entry "
504 LOG_INFO(
"Let SV wait timer reset");
507 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
508 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
509 low_power_wdog(&pwrmgr);
514 if (RST_IDX[event_idx] % 2) {
516 "Booting and setting normal sleep followed by watchdog reset "
519 LOG_INFO(
"Let SV wait timer reset");
521 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
524 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
525 normal_sleep_wdog(&pwrmgr);
526 timer_on(kEscalationPhase0MicrosCpu);
529 "Booting and setting deep sleep followed by watchdog reset "
532 LOG_INFO(
"Let SV wait timer reset");
534 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
537 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
538 low_power_wdog(&pwrmgr);
542 if (RST_IDX[event_idx] % 2) {
543 LOG_INFO(
"Booting and setting normal sleep followed by watchdog reset");
544 LOG_INFO(
"Let SV wait timer reset");
546 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
547 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
548 normal_sleep_wdog(&pwrmgr);
549 timer_on(kEscalationPhase0MicrosCpu);
551 LOG_INFO(
"Booting and setting deep sleep followed by watchdog reset");
552 LOG_INFO(
"Let SV wait timer reset");
554 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
555 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
556 low_power_wdog(&pwrmgr);
560 if (RST_IDX[event_idx] % 2) {
566 "Booting and running normal sleep followed by escalation reset");
567 config_escalate(&aon_timer, &pwrmgr);
568 timer_on(kEscalationPhase0MicrosCpu);
572 LOG_INFO(
"Booting for undefined case");