16 #include "sw/device/lib/runtime/irq.h"
18 #include "sw/device/lib/testing/ret_sram_testutils.h"
19 #include "sw/device/lib/testing/rstmgr_testutils.h"
20 #include "sw/device/lib/testing/rv_plic_testutils.h"
21 #include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
22 #include "sw/device/lib/testing/test_framework/check.h"
24 #include "sw/device/tests/pwrmgr_sleep_resets_lib.h"
28 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control =
true);
34 irq_global_ctrl(
true);
35 irq_external_ctrl(
true);
39 ret_sram_testutils_init();
42 rv_plic_testutils_irq_range_enable(plic, kPlicTarget,
46 config_alert_handler();
50 rst_info = rstmgr_testutils_reason_get();
51 rstmgr_testutils_reason_clear();
53 enum { kCounterResets = 0 };
55 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(kCounterResets));
57 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(rstmgr));
59 rst_info == kDifRstmgrResetInfoSysRstCtrl ||
60 rst_info == kDifRstmgrResetInfoWatchdog ||
63 rst_info == (kDifRstmgrResetInfoSysRstCtrl |
67 rst_info == (kDifRstmgrResetInfoWatchdog |
72 "Wrong reset reason %02X", rst_info);
74 uint32_t event_idx = 0;
75 CHECK_STATUS_OK(ret_sram_testutils_counter_get(kCounterResets, &event_idx));
76 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(kCounterResets));
78 int reset_case = event_idx / 2;
79 bool deep_sleep = event_idx % 2 == 0;
80 const char *sleep_mode = deep_sleep ?
"deep" :
"normal";
81 pwrmgr_sleep_resets_lib_modes_t mode =
82 deep_sleep ? kPwrmgrSleepResetsLibModesDeepSleep
83 : kPwrmgrSleepResetsLibModesNormalSleep;
85 LOG_INFO(
" case %d, %s mode", reset_case, sleep_mode);
91 prepare_for_sysrst(mode);
94 LOG_INFO(
"Watchdog reset in %s sleep mode", sleep_mode);
96 config_wdog(200, 2 * 200);
97 prepare_for_wdog(mode);
100 LOG_INFO(
"Rstmgr software reset in %s sleep mode", sleep_mode);
101 LOG_INFO(
"Let SV wait timer reset");
106 config_wdog(200, 2 * 200);
109 prepare_for_wdog(mode);
112 LOG_INFO(
"Escalation reset in %s sleep mode", sleep_mode);
113 LOG_INFO(
"Let SV wait timer reset");
114 trigger_escalation();
120 LOG_INFO(
"Booting for undefined case %d, reset_info 0x%x", reset_case,