9 #include "sw/device/lib/runtime/irq.h"
11 #include "sw/device/lib/testing/aon_timer_testutils.h"
12 #include "sw/device/lib/testing/pwrmgr_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
16 OTTF_DEFINE_TEST_CONFIG();
18 static_assert(kDtPwrmgrCount == 1,
"this test expects exactly one pwrmgr");
19 static const dt_pwrmgr_t kPwrmgrDt = 0;
20 static_assert(kDtRvPlicCount == 1,
"this test expects exactly one rv_plic");
21 static const dt_rv_plic_t kRvPlicDt = 0;
22 static_assert(kDtAonTimerCount >= 1,
23 "this test expects at least one aon_timer");
24 static const dt_aon_timer_t kAonTimerDt = 0;
26 static const uint32_t kPlicTarget = 0;
27 static const uint32_t kSourcePriority = 1;
28 static dif_aon_timer_t aon_timer;
29 static dif_rv_plic_t plic;
32 static volatile dif_aon_timer_irq_t irq;
33 static volatile bool interrupt_serviced =
false;
35 static bool is_pwrmgr_irq_pending(
void) {
38 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
46 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
48 if (devid == dt_aon_timer_instance_id(kAonTimerDt) &&
49 irq_id == dt_aon_timer_irq_to_plic_id(kAonTimerDt,
50 kDtAonTimerIrqWkupTimerExpired)) {
52 CHECK_DIF_OK(dif_aon_timer_irq_acknowledge(&aon_timer, irq));
53 interrupt_serviced =
true;
67 uint64_t wakeup_cycles = 0;
68 uint32_t wakeup_time_micros = 200;
69 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_64_from_us(
70 wakeup_time_micros, &wakeup_cycles));
76 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
77 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
78 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
82 kDtAonTimerWakeupWkupReq, &wakeup_sources));
86 if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0)) ==
true) {
96 kAonTimerDt, kDtAonTimerIrqWkupTimerExpired);
99 LOG_INFO(
"Enabled aon wakeup interrupt");
101 LOG_INFO(
"Set aon wakeup interrupt priority");
105 CHECK_DIF_OK(dif_pwrmgr_irq_set_enabled(&pwrmgr, kDifPwrmgrIrqWakeup,
107 plic_id = dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
110 LOG_INFO(
"Enabled pwrmgr wakeup interrupt");
112 LOG_INFO(
"Set pwrmgr wakeup interrupt priority");
115 LOG_INFO(
"Issue WFI without sleep");
120 aon_timer_testutils_wakeup_config(&aon_timer, wakeup_cycles));
121 irq_global_ctrl(
true);
122 irq_external_ctrl(
true);
123 ATOMIC_WAIT_FOR_INTERRUPT(interrupt_serviced);
125 LOG_INFO(
"The interrupt was processed");
127 CHECK(!is_pwrmgr_irq_pending());
130 }
else if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(
131 &pwrmgr, wakeup_sources)) ==
true) {