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 const dt_pwrmgr_t kPwrmgrDt = 0;
43 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
44 static const dt_aon_timer_t kAonTimerDt = 0;
45 static_assert(kDtAonTimerCount == 1,
"this test expects an aon_timer");
47 static dif_aon_timer_t aon_timer;
48 static dif_rv_core_ibex_t rv_core_ibex;
49 static dif_rv_plic_t rv_plic;
50 static dif_pwrmgr_t pwrmgr;
51 static dif_rv_timer_t rv_timer;
52 static dif_alert_handler_t alert_handler;
54 static dif_pinmux_t pinmux;
55 static dif_otp_ctrl_t otp_ctrl;
56 static dif_gpio_t gpio;
57 static dif_adc_ctrl_t adc_ctrl;
59 static volatile const bool kCoreClkOff =
false;
60 static volatile const bool kIoClkOff =
false;
61 static volatile const bool kUsbSlpOff =
false;
62 static volatile const bool kUsbActOff =
false;
63 static volatile const bool kDeepSleep =
false;
67 OTTF_DEFINE_TEST_CONFIG();
69 void ottf_external_isr(uint32_t *exc_info) {
74 void ottf_external_nmi_handler(uint32_t *exc_info) {
77 expected_isr_handler();
79 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
81 CHECK_DIF_OK(dif_rv_core_ibex_clear_nmi_state(&rv_core_ibex,
82 kDifRvCoreIbexNmiSourceAll));
86 static void wdog_irq_handler(
void) {
89 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(
90 &aon_timer, kDifAonTimerIrqWdogTimerBark, &is_pending));
91 irq_is_pending = is_pending;
97 dif_aon_timer_irq_acknowledge(&aon_timer, kDifAonTimerIrqWdogTimerBark));
100 dif_rv_plic_t rv_plic_isr;
103 CHECK_DIF_OK(dif_rv_plic_init(plic_base_addr, &rv_plic_isr));
107 static void prepare_to_exit(
void) {
115 CHECK(ext_irq_fired ==
false,
"Unexpected external interrupt triggered.");
117 CHECK_STATUS_OK(aon_timer_testutils_shutdown(&aon_timer));
120 test_status_set(kTestStatusInTest);
125 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
126 CHECK_DIF_OK(dif_rv_core_ibex_init(
129 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
130 CHECK_DIF_OK(dif_rv_timer_init(
132 CHECK_DIF_OK(dif_alert_handler_init(
135 CHECK_DIF_OK(dif_pwm_init(
137 CHECK_DIF_OK(dif_pinmux_init(
139 CHECK_DIF_OK(dif_otp_ctrl_init(
143 CHECK_DIF_OK(dif_adc_ctrl_init(
146 LOG_INFO(
"Running CHIP Power Sleep Load test");
151 const uint32_t kGpioMask = 0x00000004;
170 LOG_INFO(
"wakeup type:%d. wakeup reason: 0x%02X", wakeup_reason.
types,
176 kDtAonTimerWakeupWkupReq, &pwrmgr_aon_timer_wakeups));
178 if (wakeup_reason.
types == 0) {
187 LOG_ERROR(
"unexpected wakeup reason! type=0x%x, source=0x%x",
196 kTickFreqHz = 1000000,
197 kDeadline = UINT32_MAX,
209 uint64_t current_time;
212 (current_time + kDeadline)));
223 for (
size_t i = 0; i < ALERT_HANDLER_PARAM_N_ALERTS; ++i) {
225 alert_classes[i] = kDifAlertHandlerClassA;
230 kDifAlertHandlerLocalAlertAlertPingFail};
237 .duration_cycles = 2000}};
241 .accumulator_threshold = UINT16_MAX,
242 .irq_deadline_cycles = UINT32_MAX,
243 .escalation_phases = esc_phases,
244 .escalation_phases_len =
ARRAYSIZE(esc_phases),
250 kDifAlertHandlerClassB};
255 .alert_classes = alert_classes,
257 .local_alerts = loc_alerts,
258 .local_alert_classes = loc_alert_classes,
259 .local_alerts_len =
ARRAYSIZE(loc_alerts),
261 .class_configs = class_configs,
263 .ping_timeout = UINT16_MAX,
267 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
274 CHECK(is_locked,
"Expected alerts to be locked");
282 .beats_per_pulse_cycle = 32,
292 .blink_parameter_x = 0,
293 .blink_parameter_y = 0,
296 kDifPwmChannel0, kDifPwmChannel1, kDifPwmChannel2,
297 kDifPwmChannel3, kDifPwmChannel4, kDifPwmChannel5,
300 const uint16_t kPwmDutycycle[PWM_PARAM_N_OUTPUTS] = {
319 for (
size_t i = 0; i < PWM_PARAM_N_OUTPUTS; ++i) {
333 for (
size_t i = 0; i < PWM_PARAM_N_OUTPUTS; ++i) {
349 .integrity_period_mask = 0x1,
350 .consistency_period_mask = 0x1,
355 LOG_INFO(
"OTP periodic checks active");
357 LOG_INFO(
"Skipping OTP periodic checks due to ROM_EXT ePMP configuration");
361 const uint64_t kTimeTillBark = 1000;
365 expected_isr_handler = wdog_irq_handler;
369 dif_rv_core_ibex_enable_nmi(&rv_core_ibex, kDifRvCoreIbexNmiSourceWdog));
370 uint32_t count_cycles = 0;
371 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kTimeTillBark,
377 aon_timer_testutils_wakeup_config(&aon_timer, kTimeTillBark));
381 irq_software_ctrl(
true);
384 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(
385 &aon_timer, count_cycles, UINT32_MAX,
false));
391 kNumLowPowerSamples = 2,
392 kNumNormalPowerSamples = 1,
396 uint32_t power_up_time_aon_cycles = 0;
397 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
398 kPowerUpTime, &power_up_time_aon_cycles));
399 uint32_t wake_up_time_aon_cycles = 0;
400 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(
401 kWakeUpTime, &wake_up_time_aon_cycles));
406 CHECK(power_up_time_aon_cycles < UINT8_MAX,
407 "power_up_time_aon_cycles must fit into uint8_t");
412 .num_low_power_samples = kNumLowPowerSamples,
413 .num_normal_power_samples = kNumNormalPowerSamples,
414 .power_up_time_aon_cycles = (uint8_t)power_up_time_aon_cycles + 1,
415 .wake_up_time_aon_cycles = wake_up_time_aon_cycles}));
431 (kUsbSlpOff ? 0 : kDifPwrmgrDomainOptionUsbClockInLowPower) |
432 (kUsbActOff ? 0 : kDifPwrmgrDomainOptionUsbClockInActivePower) |
433 (kDeepSleep ? 0 : kDifPwrmgrDomainOptionMainPowerInLowPower));
435 pwrmgr_testutils_enable_low_power(&pwrmgr, pwrmgr_wakeups, pwrmgr_cfg));
436 LOG_INFO(
"Power Manage configured");
440 test_status_set(0xff20);
447 CHECK_DIF_OK(dif_rv_plic_init(plic_base_addr, &rv_plic));
448 bool software_irq_pending;
450 &software_irq_pending));
451 CHECK(software_irq_pending,
452 "Software IRQ unexpectedly not pending after WFI");
456 CHECK(irq_is_pending,
"Expected watchdog bark interrupt to be pending");
460 "WDOG NMI state check1 not expected! wdog_enable:%x, wdog_raised:%x",
463 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
467 "WDOG NMI state check2 not expected! wdog_enable:%x wdog_raised:%x",