18 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
21 #include "sw/device/lib/runtime/irq.h"
23 #include "sw/device/lib/testing/alert_handler_testutils.h"
24 #include "sw/device/lib/testing/aon_timer_testutils.h"
25 #include "sw/device/lib/testing/pwrmgr_testutils.h"
26 #include "sw/device/lib/testing/test_framework/check.h"
27 #include "sw/device/lib/testing/test_framework/ottf_isrs.h"
30 #include "alert_handler_regs.h"
31 #include "aon_timer_regs.h"
35 typedef void (*isr_handler)(void);
36 static volatile isr_handler expected_isr_handler;
38 static volatile bool nmi_fired =
false;
39 static volatile bool ext_irq_fired =
false;
40 static volatile bool irq_is_pending =
false;
42 static dif_aon_timer_t aon_timer;
43 static dif_rv_core_ibex_t rv_core_ibex;
44 static dif_rv_plic_t rv_plic;
45 static dif_pwrmgr_t pwrmgr;
46 static dif_rv_timer_t rv_timer;
47 static dif_alert_handler_t alert_handler;
49 static dif_pinmux_t pinmux;
50 static dif_otp_ctrl_t otp_ctrl;
51 static dif_gpio_t gpio;
52 static dif_adc_ctrl_t adc_ctrl;
54 static volatile const bool kCoreClkOff =
false;
55 static volatile const bool kIoClkOff =
false;
56 static volatile const bool kUsbSlpOff =
false;
57 static volatile const bool kUsbActOff =
false;
58 static volatile const bool kDeepSleep =
false;
62 OTTF_DEFINE_TEST_CONFIG();
64 void ottf_external_isr(uint32_t *exc_info) {
69 void ottf_external_nmi_handler(uint32_t *exc_info) {
72 expected_isr_handler();
74 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
76 CHECK_DIF_OK(dif_rv_core_ibex_clear_nmi_state(&rv_core_ibex,
77 kDifRvCoreIbexNmiSourceAll));
81 static void wdog_irq_handler(
void) {
84 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(
85 &aon_timer, kDifAonTimerIrqWdogTimerBark, &is_pending));
86 irq_is_pending = is_pending;
92 dif_aon_timer_irq_acknowledge(&aon_timer, kDifAonTimerIrqWdogTimerBark));
95 dif_rv_plic_t rv_plic_isr;
98 CHECK_DIF_OK(dif_rv_plic_init(plic_base_addr, &rv_plic_isr));
102 static void prepare_to_exit(
void) {
110 CHECK(ext_irq_fired ==
false,
"Unexpected external interrupt triggered.");
112 CHECK_STATUS_OK(aon_timer_testutils_shutdown(&aon_timer));
115 test_status_set(kTestStatusInTest);
120 CHECK_DIF_OK(dif_aon_timer_init(
122 CHECK_DIF_OK(dif_rv_core_ibex_init(
125 CHECK_DIF_OK(dif_pwrmgr_init(
127 CHECK_DIF_OK(dif_rv_timer_init(
129 CHECK_DIF_OK(dif_alert_handler_init(
132 CHECK_DIF_OK(dif_pwm_init(
134 CHECK_DIF_OK(dif_pinmux_init(
136 CHECK_DIF_OK(dif_otp_ctrl_init(
140 CHECK_DIF_OK(dif_adc_ctrl_init(
143 LOG_INFO(
"Running CHIP Power Sleep Load test");
148 const uint32_t kGpioMask = 0x00000004;
167 LOG_INFO(
"wakeup type:%d. wakeup reason: 0x%02X", wakeup_reason.
types,
170 if (wakeup_reason.
types == 0) {
175 kDifPwrmgrWakeupRequestSourceFive)) {
180 LOG_ERROR(
"unexpected wakeup reason! type=0x%x, source=0x%x",
189 kTickFreqHz = 1000000,
190 kDeadline = UINT32_MAX,
202 uint64_t current_time;
205 (current_time + kDeadline)));
216 for (
size_t i = 0; i < ALERT_HANDLER_PARAM_N_ALERTS; ++i) {
218 alert_classes[i] = kDifAlertHandlerClassA;
223 kDifAlertHandlerLocalAlertAlertPingFail};
230 .duration_cycles = 2000}};
234 .accumulator_threshold = UINT16_MAX,
235 .irq_deadline_cycles = UINT32_MAX,
236 .escalation_phases = esc_phases,
237 .escalation_phases_len =
ARRAYSIZE(esc_phases),
243 kDifAlertHandlerClassB};
248 .alert_classes = alert_classes,
250 .local_alerts = loc_alerts,
251 .local_alert_classes = loc_alert_classes,
252 .local_alerts_len =
ARRAYSIZE(loc_alerts),
254 .class_configs = class_configs,
256 .ping_timeout = UINT16_MAX,
260 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
267 CHECK(is_locked,
"Expected alerts to be locked");
275 .beats_per_pulse_cycle = 32,
285 .blink_parameter_x = 0,
286 .blink_parameter_y = 0,
289 kDifPwmChannel0, kDifPwmChannel1, kDifPwmChannel2,
290 kDifPwmChannel3, kDifPwmChannel4, kDifPwmChannel5,
293 const uint16_t kPwmDutycycle[PWM_PARAM_N_OUTPUTS] = {
312 for (
size_t i = 0; i < PWM_PARAM_N_OUTPUTS; ++i) {
326 for (
size_t i = 0; i < PWM_PARAM_N_OUTPUTS; ++i) {
342 .integrity_period_mask = 0x1,
343 .consistency_period_mask = 0x1,
348 LOG_INFO(
"OTP periodic checks active");
350 LOG_INFO(
"Skipping OTP periodic checks due to ROM_EXT ePMP configuration");
354 const uint64_t kTimeTillBark = 1000;
358 expected_isr_handler = wdog_irq_handler;
362 dif_rv_core_ibex_enable_nmi(&rv_core_ibex, kDifRvCoreIbexNmiSourceWdog));
363 uint32_t count_cycles = 0;
364 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kTimeTillBark,
370 aon_timer_testutils_wakeup_config(&aon_timer, kTimeTillBark));
374 irq_software_ctrl(
true);
377 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(
378 &aon_timer, count_cycles, UINT32_MAX,
false));
384 kNumLowPowerSamples = 2,
385 kNumNormalPowerSamples = 1,
389 uint32_t power_up_time_aon_cycles = 0;
390 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
391 kPowerUpTime, &power_up_time_aon_cycles));
392 uint32_t wake_up_time_aon_cycles = 0;
393 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
394 kWakeUpTime, &wake_up_time_aon_cycles));
399 CHECK(power_up_time_aon_cycles < UINT8_MAX,
400 "power_up_time_aon_cycles must fit into uint8_t");
405 .num_low_power_samples = kNumLowPowerSamples,
406 .num_normal_power_samples = kNumNormalPowerSamples,
407 .power_up_time_aon_cycles = (uint8_t)power_up_time_aon_cycles + 1,
408 .wake_up_time_aon_cycles = wake_up_time_aon_cycles}));
419 (kDifPwrmgrWakeupRequestSourceOne | kDifPwrmgrWakeupRequestSourceTwo |
420 kDifPwrmgrWakeupRequestSourceThree | kDifPwrmgrWakeupRequestSourceFour |
421 kDifPwrmgrWakeupRequestSourceFive | kDifPwrmgrWakeupRequestSourceSix);
426 (kUsbSlpOff ? 0 : kDifPwrmgrDomainOptionUsbClockInLowPower) |
427 (kUsbActOff ? 0 : kDifPwrmgrDomainOptionUsbClockInActivePower) |
428 (kDeepSleep ? 0 : kDifPwrmgrDomainOptionMainPowerInLowPower));
430 pwrmgr_testutils_enable_low_power(&pwrmgr, pwrmgr_wakeups, pwrmgr_cfg));
431 LOG_INFO(
"Power Manage configured");
435 test_status_set(0xff20);
442 CHECK_DIF_OK(dif_rv_plic_init(plic_base_addr, &rv_plic));
443 bool software_irq_pending;
445 &software_irq_pending));
446 CHECK(software_irq_pending,
447 "Software IRQ unexpectedly not pending after WFI");
451 CHECK(irq_is_pending,
"Expected watchdog bark interrupt to be pending");
455 "WDOG NMI state check1 not expected! wdog_enable:%x, wdog_raised:%x",
458 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
462 "WDOG NMI state check2 not expected! wdog_enable:%x wdog_raised:%x",