14 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
17 #include "sw/device/lib/runtime/irq.h"
19 #include "sw/device/lib/testing/alert_handler_testutils.h"
20 #include "sw/device/lib/testing/pwrmgr_testutils.h"
21 #include "sw/device/lib/testing/test_framework/check.h"
22 #include "sw/device/lib/testing/test_framework/ottf_isrs.h"
26 #include "sw/device/lib/testing/autogen/isr_testutils.h"
28 OTTF_DEFINE_TEST_CONFIG();
31 uint32_t alert_raised;
33 uint64_t elapsed_ticks;
39 static volatile bool ext_irq_fired =
false;
41 static dif_pwrmgr_t pwrmgr;
42 static dif_rv_core_ibex_t rv_core_ibex;
43 static dif_alert_handler_t alert_handler;
44 static dif_rv_timer_t timer;
52 kEscalationPhase0Micros = 100 * 1000,
53 kEscalationPhase2Micros = 100,
54 kIrqDeadlineMicros = 10,
55 kTick1us = 1 * 1000 * 1000,
57 kTimeThresholdUs = 5000,
60 static status_t set_tick(uint32_t tick_hz) {
68 static void alerts_configure_all(
const dif_alert_handler_t *alert_handler,
88 ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_MASK);
112 static void alert_handler_config(
void) {
113 uint32_t cycles[3] = {0};
114 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
115 kEscalationPhase0Micros, &cycles[0]));
116 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
117 kEscalationPhase2Micros, &cycles[1]));
118 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(kIrqDeadlineMicros,
123 .duration_cycles = cycles[0]},
126 .duration_cycles = cycles[1]}};
129 .accumulator_threshold = 0,
130 .irq_deadline_cycles = cycles[2],
131 .escalation_phases = esc_phases,
132 .escalation_phases_len =
ARRAYSIZE(esc_phases),
141 .alert_classes = alert_classes,
144 .class_configs = class_config,
146 .ping_timeout = kAlertHandlerTestutilsDefaultPingTimeout,
151 CHECK_STATUS_OK(set_tick(kTick1us));
156 (uint64_t *)&
counters.elapsed_ticks));
157 CHECK(
counters.elapsed_ticks == 0,
"Failed to write the counter");
169 static void alert_handler_ping_ok_test(
void) {
170 alert_handler_config();
172 uint64_t theshold_us = kTimeThresholdUs;
174 theshold_us = theshold_us * 10;
175 CHECK(theshold_us > kTimeThresholdUs,
"Threshold overflow");
180 &timer, kHart, (uint64_t *)&
counters.elapsed_ticks));
181 }
while (
counters.elapsed_ticks < theshold_us);
191 void ottf_external_nmi_handler(uint32_t *exc_info) {
192 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
202 CHECK_DIF_OK(dif_rv_core_ibex_clear_nmi_state(&rv_core_ibex,
203 kDifRvCoreIbexNmiSourceAll));
210 void ottf_external_isr(uint32_t *exc_info) { ext_irq_fired =
true; }
212 void init_peripherals(
void) {
215 CHECK_DIF_OK(dif_rv_core_ibex_init(addr, &rv_core_ibex));
218 CHECK_DIF_OK(dif_alert_handler_init(addr, &alert_handler));
221 CHECK_DIF_OK(dif_pwrmgr_init(addr, &pwrmgr));
223 CHECK_DIF_OK(dif_rv_timer_init(
231 irq_global_ctrl(
false);
232 irq_external_ctrl(
false);
236 dif_rv_core_ibex_enable_nmi(&rv_core_ibex, kDifRvCoreIbexNmiSourceAll));
238 alert_handler_ping_ok_test();
241 CHECK(ext_irq_fired ==
false,
"Unexpected external interrupt triggered.");
242 CHECK(
counters.alert_raised == 0,
"Unexpected alert raised.");
243 CHECK(
counters.wdog_barked == 0,
"Unexpected watchdog bark.");
246 return UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0));