9 #include "sw/device/lib/runtime/irq.h"
11 #include "sw/device/lib/testing/pwrmgr_testutils.h"
12 #include "sw/device/lib/testing/rv_plic_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
17 dif_rv_plic_t rv_plic;
18 dif_sensor_ctrl_t sensor_ctrl;
24 static const dt_pwrmgr_t kPwrmgrDt = 0;
25 static_assert(kDtPwrmgrCount == 1,
"this library expects exactly one pwrmgr");
26 static const dt_rv_plic_t kRvPlicDt = 0;
27 static_assert(kDtRvPlicCount == 1,
"this library expects exactly one rv_plic");
28 static const dt_sensor_ctrl_t kSensorCtrlDt = 0;
29 static_assert(kDtSensorCtrlCount == 1,
30 "this library expects exactly one sensor_ctrl");
39 OTTF_DEFINE_TEST_CONFIG();
44 static bool pwrmgr_wake_status_is_clear(
void) {
51 static status_t wait_for_pwrmgr_wake_status_is_clear(
void) {
59 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
61 if (devid == dt_pwrmgr_instance_id(kPwrmgrDt) &&
62 irq_id == dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup)) {
63 CHECK_DIF_OK(dif_pwrmgr_irq_acknowledge(&pwrmgr, kDtPwrmgrIrqWakeup));
72 irq_global_ctrl(
true);
73 irq_external_ctrl(
true);
75 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
76 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
77 CHECK_DIF_OK(dif_sensor_ctrl_init_from_dt(kSensorCtrlDt, &sensor_ctrl));
80 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
81 rv_plic_testutils_irq_range_enable(&rv_plic, kPlicTarget, irq_id, irq_id);
95 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
96 &pwrmgr, kDifPwrmgrWakeupRequestSourceSix, 0));
97 LOG_INFO(
"Issue WFI to enter sensor_ctrl sleep");
103 LOG_ERROR(
"Unexpected wakeup_reason.types 0x%x", wakeup_reason.
types);
109 CHECK(!pwrmgr_wake_status_is_clear(),
"Expected wake_status to be set");
111 CHECK(events == 1,
"Expected bit 0 to be set");
114 CHECK(events == 0,
"Expected recoverable events to clear");
115 CHECK_STATUS_OK(wait_for_pwrmgr_wake_status_is_clear(), 20);