22 #include "sw/device/lib/runtime/irq.h"
24 #include "sw/device/lib/testing/alert_handler_testutils.h"
25 #include "sw/device/lib/testing/aon_timer_testutils.h"
26 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
27 #include "sw/device/lib/testing/nv_counter_testutils.h"
28 #include "sw/device/lib/testing/pwrmgr_testutils.h"
29 #include "sw/device/lib/testing/rstmgr_testutils.h"
30 #include "sw/device/lib/testing/rv_plic_testutils.h"
31 #include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
32 #include "sw/device/lib/testing/test_framework/check.h"
37 OTTF_DEFINE_TEST_CONFIG();
38 static volatile const uint8_t RST_IDX[12] = {0, 1, 2, 3, 4, 5,
46 static dif_rv_plic_t plic;
47 static dif_alert_handler_t alert_handler;
48 static dif_aon_timer_t aon_timer;
49 static dif_pwrmgr_t pwrmgr;
50 static dif_rstmgr_t rstmgr;
58 kWdogBarkMicros = 3 * 100,
59 kWdogBiteMicros = 4 * 100,
60 kEscalationPhase0Micros = 1 * 100,
65 kEscalationPhase0MicrosCpu = kEscalationPhase0Micros + 20,
66 kEscalationPhase1Micros = 5 * 100,
67 kEscalationPhase2Micros = 50,
71 kWdogBarkMicros < kWdogBiteMicros &&
72 kWdogBarkMicros > kEscalationPhase0Micros &&
73 kWdogBarkMicros < (kEscalationPhase0Micros + kEscalationPhase1Micros) &&
74 kWdogBiteMicros < (kEscalationPhase0Micros + kEscalationPhase1Micros),
75 "The wdog bark and bite shall happens during the escalation phase 1");
84 void ottf_external_isr(uint32_t *exc_info) {
97 (dif_aon_timer_irq_t)(irq_id -
103 kDifAlertHandlerClassA));
104 CHECK_DIF_OK(dif_aon_timer_irq_acknowledge(&aon_timer, irq));
107 "AON Timer Wdog should not bark");
118 &alert_handler, kDifAlertHandlerClassA, &state));
122 CHECK_DIF_OK(dif_alert_handler_irq_acknowledge(&alert_handler, irq));
133 void init_peripherals(
void) {
135 CHECK_DIF_OK(dif_pwrmgr_init(
139 CHECK_DIF_OK(dif_rstmgr_init(
143 CHECK_DIF_OK(dif_aon_timer_init(
152 CHECK_DIF_OK(dif_rv_plic_init(
155 rv_plic_testutils_irq_range_enable(
160 CHECK_DIF_OK(dif_alert_handler_init(
170 static void alert_handler_config(
void) {
174 uint32_t cycles[3] = {0};
175 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
176 kEscalationPhase0Micros, &cycles[0]));
177 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
178 kEscalationPhase1Micros, &cycles[1]));
179 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
180 kEscalationPhase2Micros, &cycles[2]));
186 cycles[0] * alert_handler_testutils_cycle_rescaling_factor()},
190 cycles[1] * alert_handler_testutils_cycle_rescaling_factor()},
194 cycles[2] * alert_handler_testutils_cycle_rescaling_factor()}};
198 .accumulator_threshold = 0,
199 .irq_deadline_cycles =
200 cycles[0] * alert_handler_testutils_cycle_rescaling_factor(),
201 .escalation_phases = esc_phases,
202 .escalation_phases_len =
ARRAYSIZE(esc_phases),
209 .alert_classes = alert_classes,
212 .class_configs = class_config,
214 .ping_timeout = kAlertHandlerTestutilsDefaultPingTimeout,
217 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
220 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
227 static void config_escalate(dif_aon_timer_t *aon_timer,
228 const dif_pwrmgr_t *pwrmgr) {
229 uint32_t bark_cycles = 0;
230 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBarkMicros,
232 bark_cycles *= alert_handler_testutils_cycle_rescaling_factor();
233 uint32_t bite_cycles = 0;
234 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBiteMicros,
236 bite_cycles *= alert_handler_testutils_cycle_rescaling_factor();
239 "Wdog will bark after %u/%u us/cycles and bite after %u/%u us/cycles",
240 (uint32_t)kWdogBarkMicros, (uint32_t)bark_cycles,
241 (uint32_t)kWdogBiteMicros, (uint32_t)bite_cycles);
244 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
245 bite_cycles,
false));
248 dif_pwrmgr_alert_t alert = kDifPwrmgrAlertFatalFault;
249 CHECK_DIF_OK(dif_pwrmgr_alert_force(pwrmgr, alert));
252 static void low_power_glitch_reset(
const dif_pwrmgr_t *pwrmgr) {
254 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
255 pwrmgr, kDifPwrmgrWakeupRequestSourceFive, 0));
260 static void normal_sleep_glitch_reset(
const dif_pwrmgr_t *pwrmgr) {
263 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
266 kDifPwrmgrDomainOptionMainPowerInLowPower;
267 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
268 pwrmgr, kDifPwrmgrWakeupRequestSourceFive, config));
273 static void timer_on(uint32_t usec) {
276 CHECK(
false,
"Timeout waiting for reset!");
282 static void config_wdog(
const dif_aon_timer_t *aon_timer,
283 const dif_pwrmgr_t *pwrmgr, uint64_t bark_time_us,
284 uint64_t bite_time_us) {
285 uint32_t bark_cycles = 0;
286 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bark_time_us,
288 uint32_t bite_cycles = 0;
289 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(bite_time_us,
292 LOG_INFO(
"Wdog will bark after %u us and bite after %u us",
293 (uint32_t)bark_time_us, (uint32_t)bite_time_us);
296 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(aon_timer, bark_cycles,
297 bite_cycles,
false));
300 kDifPwrmgrResetRequestSourceTwo,
307 static void sleep_wdog_bite_test(
const dif_aon_timer_t *aon_timer,
308 const dif_pwrmgr_t *pwrmgr,
309 uint64_t bark_time_us) {
310 uint64_t bite_time_us = bark_time_us * 2;
311 config_wdog(aon_timer, pwrmgr, bark_time_us, bite_time_us);
314 static void low_power_wdog(
const dif_pwrmgr_t *pwrmgr) {
317 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
318 pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, 0));
319 LOG_INFO(
"Low power set for watch dog");
322 CHECK(
false,
"Fail to enter in low power mode!");
325 static void normal_sleep_wdog(
const dif_pwrmgr_t *pwrmgr) {
328 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
331 kDifPwrmgrDomainOptionMainPowerInLowPower;
334 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
335 pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, config));
336 LOG_INFO(
"Normal sleep set for watchdog");
340 static void low_power_por(
const dif_pwrmgr_t *pwrmgr) {
343 kDifPwrmgrResetRequestSourceTwo,
347 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
349 (kDifPwrmgrWakeupRequestSourceOne | kDifPwrmgrWakeupRequestSourceTwo |
350 kDifPwrmgrWakeupRequestSourceThree | kDifPwrmgrWakeupRequestSourceFour |
351 kDifPwrmgrWakeupRequestSourceFive | kDifPwrmgrWakeupRequestSourceSix),
356 CHECK(
false,
"Fail to enter in low power mode!");
359 static void normal_sleep_por(
const dif_pwrmgr_t *pwrmgr) {
362 kDifPwrmgrResetRequestSourceTwo,
367 config = kDifPwrmgrDomainOptionUsbClockInLowPower |
370 kDifPwrmgrDomainOptionMainPowerInLowPower;
373 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
375 (kDifPwrmgrWakeupRequestSourceOne | kDifPwrmgrWakeupRequestSourceTwo |
376 kDifPwrmgrWakeupRequestSourceThree | kDifPwrmgrWakeupRequestSourceFour |
377 kDifPwrmgrWakeupRequestSourceFive | kDifPwrmgrWakeupRequestSourceSix),
385 irq_global_ctrl(
true);
386 irq_external_ctrl(
true);
391 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget,
395 alert_handler_config();
398 uint32_t event_idx = 0;
399 CHECK_STATUS_OK(flash_ctrl_testutils_counter_get(0, &event_idx));
403 flash_ctrl_testutils_default_region_access(&flash_ctrl,
412 CHECK_STATUS_OK(flash_ctrl_testutils_counter_increment(&flash_ctrl, 0));
414 LOG_INFO(
"Test round %d", event_idx);
415 LOG_INFO(
"RST_IDX[%d] = %d", event_idx, RST_IDX[event_idx]);
419 rst_info = rstmgr_testutils_reason_get();
420 rstmgr_testutils_reason_clear();
421 LOG_INFO(
"reset info = %02X", rst_info);
424 rst_info == kDifRstmgrResetInfoSysRstCtrl ||
425 rst_info == kDifRstmgrResetInfoWatchdog ||
428 rst_info == (kDifRstmgrResetInfoSysRstCtrl |
433 kDifRstmgrResetInfoWatchdog |
436 kDifRstmgrResetInfoWatchdog) ||
440 rst_info == (kDifRstmgrResetInfoWatchdog |
445 "Wrong reset reason %02X", rst_info);
447 switch (RST_IDX[event_idx] / 2) {
449 if (RST_IDX[event_idx] % 2) {
450 LOG_INFO(
"Booting and setting normal sleep followed by glitch reset");
451 LOG_INFO(
"Let SV wait timer reset");
452 normal_sleep_glitch_reset(&pwrmgr);
453 timer_on(kWdogBiteMicros);
455 LOG_INFO(
"Booting and setting deep sleep followed by glitch reset");
456 LOG_INFO(
"Let SV wait timer reset");
457 low_power_glitch_reset(&pwrmgr);
461 if (RST_IDX[event_idx] % 2) {
462 LOG_INFO(
"Booting and setting normal sleep followed by hw por");
463 LOG_INFO(
"Let SV wait timer reset");
464 normal_sleep_por(&pwrmgr);
465 timer_on(kWdogBiteMicros);
467 LOG_INFO(
"Booting and setting deep sleep followed by hw por");
468 LOG_INFO(
"Let SV wait timer reset");
469 low_power_por(&pwrmgr);
473 if (RST_IDX[event_idx] % 2) {
475 "Booting and setting normal sleep mode followed for low_power "
477 LOG_INFO(
"Let SV wait timer reset");
479 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
480 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
481 normal_sleep_wdog(&pwrmgr);
482 timer_on(kEscalationPhase0MicrosCpu);
485 "Booting and setting deep sleep mode followed for low_power entry "
487 LOG_INFO(
"Let SV wait timer reset");
490 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
491 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
492 low_power_wdog(&pwrmgr);
497 if (RST_IDX[event_idx] % 2) {
499 "Booting and setting normal sleep followed by watchdog reset "
502 LOG_INFO(
"Let SV wait timer reset");
504 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
507 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
508 normal_sleep_wdog(&pwrmgr);
509 timer_on(kEscalationPhase0MicrosCpu);
512 "Booting and setting deep sleep followed by watchdog reset "
515 LOG_INFO(
"Let SV wait timer reset");
517 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
520 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
521 low_power_wdog(&pwrmgr);
525 if (RST_IDX[event_idx] % 2) {
526 LOG_INFO(
"Booting and setting normal sleep followed by watchdog reset");
527 LOG_INFO(
"Let SV wait timer reset");
529 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
530 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
531 normal_sleep_wdog(&pwrmgr);
532 timer_on(kEscalationPhase0MicrosCpu);
534 LOG_INFO(
"Booting and setting deep sleep followed by watchdog reset");
535 LOG_INFO(
"Let SV wait timer reset");
537 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
538 sleep_wdog_bite_test(&aon_timer, &pwrmgr, 200);
539 low_power_wdog(&pwrmgr);
543 if (RST_IDX[event_idx] % 2) {
549 "Booting and running normal sleep followed by escalation reset");
550 config_escalate(&aon_timer, &pwrmgr);
551 timer_on(kEscalationPhase0MicrosCpu);
555 LOG_INFO(
"Booting for undefined case");