6 #include "dt/dt_rv_plic.h"
10 #include "sw/device/lib/runtime/irq.h"
12 #include "sw/device/lib/testing/test_framework/check.h"
14 #include "sw/device/lib/testing/test_framework/status.h"
16 #include "rv_plic_regs.h"
18 OTTF_DEFINE_TEST_CONFIG();
22 static dif_rv_plic_t plic0;
24 static uint32_t external_intr_triggered = 0;
25 static uint32_t software_intr_triggered = 0;
30 static void plic_configure_irqs(dif_rv_plic_t *plic) {
32 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
52 void ottf_external_isr(uint32_t *exc_info) {
55 ++external_intr_triggered;
56 LOG_FATAL(
"External Interrupt should not occur");
57 test_status_set(kTestStatusFailed);
69 void ottf_software_isr(uint32_t *exc_info) {
71 ++software_intr_triggered;
76 LOG_INFO(
"Software ISR event is cleared");
79 static void execute_test(dif_rv_plic_t *plic) {
84 while (abs_mmio_read32((uint32_t)&software_intr_triggered) == 0) {
91 irq_global_ctrl(
true);
92 irq_external_ctrl(
true);
94 static_assert(kDtRvPlicCount >= 1,
"This test requires an RV PLIC.");
95 CHECK_DIF_OK(dif_rv_plic_init_from_dt((dt_rv_plic_t)0, &plic0));
97 plic_configure_irqs(&plic0);
100 irq_software_ctrl(
true);
102 execute_test(&plic0);
105 if ((abs_mmio_read32((uint32_t)&software_intr_triggered) == 1) &&
106 (abs_mmio_read32((uint32_t)&external_intr_triggered) == 0)) {