14 #include "sw/device/lib/runtime/irq.h"
16 #include "sw/device/lib/testing/alert_handler_testutils.h"
17 #include "sw/device/lib/testing/rv_plic_testutils.h"
18 #include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
19 #include "sw/device/lib/testing/test_framework/check.h"
22 #include "alert_handler_regs.h"
24 #include "sw/device/lib/testing/autogen/isr_testutils.h"
26 OTTF_DEFINE_TEST_CONFIG();
28 static dif_rv_plic_t plic;
29 static dif_alert_handler_t alert_handler;
32 static plic_isr_ctx_t plic_ctx = {
34 .hart_id = kPlicTarget,
41 static alert_handler_isr_ctx_t alert_handler_ctx = {
42 .alert_handler = &alert_handler,
44 .expected_irq = kDifAlertHandlerIrqClassb,
51 static void init_peripherals(
void) {
54 CHECK_DIF_OK(dif_rv_plic_init(base_addr, &plic));
57 CHECK_DIF_OK(dif_alert_handler_init(base_addr, &alert_handler));
60 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget,
70 static void alert_handler_config(
void) {
76 alert_classes[i] = kDifAlertHandlerClassA;
81 kDifAlertHandlerLocalAlertAlertPingFail};
87 .duration_cycles = 2000}};
91 .accumulator_threshold =
93 .irq_deadline_cycles = 0,
94 .escalation_phases = esc_phases,
95 .escalation_phases_len =
ARRAYSIZE(esc_phases),
103 kDifAlertHandlerClassB};
107 .alert_classes = alert_classes,
109 .local_alerts = loc_alerts,
110 .local_alert_classes = loc_alert_classes,
111 .local_alerts_len =
ARRAYSIZE(loc_alerts),
113 .class_configs = class_configs,
118 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
121 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
132 void ottf_external_isr(uint32_t *exc_info) {
134 dif_alert_handler_irq_t irq_serviced;
135 isr_testutils_alert_handler_isr(plic_ctx, alert_handler_ctx,
136 &peripheral_serviced, &irq_serviced);
138 "Interrupt from unexpected peripheral: %d", peripheral_serviced);
142 CHECK(irq_serviced == kDifAlertHandlerIrqClassb,
143 "Interrupt from unexpected class: Class %c",
'A' + irq_serviced);
145 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
154 irq_global_ctrl(
false);
155 irq_external_ctrl(
true);
157 alert_handler_config();
162 irq_global_ctrl(
true);
167 kDifAlertHandlerLocalAlertAlertPingFail;
169 &alert_handler, exp_local_alert, &is_cause));
170 CHECK(is_cause,
"Expect local alert cause: alert_ping_fail!");
173 for (
size_t id = 0;
id < ALERT_HANDLER_PARAM_N_ALERTS; ++id) {
178 LOG_INFO(
"Received alert ID %u.",
id);