10 #include "sw/device/lib/runtime/irq.h"
12 #include "sw/device/lib/testing/aon_timer_testutils.h"
13 #include "sw/device/lib/testing/pwrmgr_testutils.h"
14 #include "sw/device/lib/testing/rstmgr_testutils.h"
15 #include "sw/device/lib/testing/rv_plic_testutils.h"
16 #include "sw/device/lib/testing/test_framework/check.h"
18 #include "sw/device/lib/testing/test_framework/ottf_utils.h"
19 #include "sw/device/lib/testing/test_framework/status.h"
21 #include "pwrmgr_regs.h"
27 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control =
true);
30 kSoftwareBarrierTimeoutUsec = 1000000,
36 static volatile const uint8_t kSoftwareBarrierDv = 0;
40 static volatile const uint8_t kSoftwareBarrierHost = 0;
42 static_assert(kDtPwrmgrCount == 1, "this
test expects exactly one pwrmgr");
43 static const dt_pwrmgr_t kPwrmgrDt = 0;
44 static_assert(kDtRvPlicCount == 1, "this
test expects exactly one rv_plic");
45 static const dt_rv_plic_t kRvPlicDt = 0;
46 static_assert(kDtSysrstCtrlCount >= 1,
47 "this
test expects at least one sysrst_ctrl");
48 static const dt_sysrst_ctrl_t kSysrtCtrlDt = 0;
49 static_assert(kDtPinmuxCount == 1, "this
test expects exactly one pinmux");
50 static const dt_pinmux_t kPinmuxDt = 0;
53 dif_rv_plic_t rv_plic;
60 void ottf_external_isr(uint32_t *exc_info) {
71 static void put_to_sleep(dif_pwrmgr_t *pwrmgr,
bool deep_sleep) {
75 cfg &= ~kDifPwrmgrDomainOptionMainPowerInLowPower;
77 cfg |= kDifPwrmgrDomainOptionMainPowerInLowPower;
83 kDtSysrstCtrlWakeupWkupReq, &wakeup_sources));
85 pwrmgr_testutils_enable_low_power(pwrmgr, wakeup_sources, cfg));
87 deep_sleep ?
"Entering deep sleep." :
"Entering normal sleep.");
93 irq_global_ctrl(
true);
94 irq_external_ctrl(
true);
98 dif_sysrst_ctrl_t sysrst_ctrl;
100 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
101 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
102 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
103 CHECK_DIF_OK(dif_sysrst_ctrl_init_from_dt(kSysrtCtrlDt, &sysrst_ctrl));
106 ? &kSoftwareBarrierDv
107 : &kSoftwareBarrierHost;
109 switch (rstmgr_testutils_reason_get()) {
113 OTTF_WAIT_FOR(*software_barrier == 1, kSoftwareBarrierTimeoutUsec);
117 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
118 rv_plic_testutils_irq_range_enable(&rv_plic, kPlicTarget, plic_id,
122 CHECK_DIF_OK(dif_pwrmgr_irq_set_enabled(&pwrmgr, kDifPwrmgrIrqWakeup,
128 .debounce_time_threshold = 1,
134 dt_sysrst_ctrl_periph_io(kSysrtCtrlDt, kDtSysrstCtrlPeriphIoPwrbIn),
138 put_to_sleep(&pwrmgr,
false);
139 LOG_INFO(
"Waking up from normal sleep.");
145 OTTF_WAIT_FOR(*software_barrier == 2, kSoftwareBarrierTimeoutUsec);
148 put_to_sleep(&pwrmgr,
true);
152 LOG_INFO(
"Waking up from deep sleep.");
155 OTTF_WAIT_FOR(*software_barrier == 3, kSoftwareBarrierTimeoutUsec);
159 LOG_ERROR(
"Device was reset by an unexpected source.");