summaryrefslogtreecommitdiff
path: root/kernel/aplic.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/aplic.c')
-rw-r--r--kernel/aplic.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/kernel/aplic.c b/kernel/aplic.c
index 61a42c3..a5b91be 100644
--- a/kernel/aplic.c
+++ b/kernel/aplic.c
@@ -1,5 +1,4 @@
#include "kernel/aplic.h"
-#include "kernel/spinlock.h"
static volatile char* APLIC_M = (volatile char*)0x0c00'0000;
static volatile char* APLIC_S = (volatile char*)0x0d00'0000;
@@ -109,13 +108,22 @@ void aplic_init()
aplic_w_smsiaddr(APLIC_M, (void*)IMSIC_S);
- uint32_t uart_source = 10;
- aplic_w_sourcecfg_delegate(APLIC_M, uart_source, 0);
- aplic_w_sourcecfg_active_high(APLIC_S, uart_source);
- aplic_w_target_msi(APLIC_S, uart_source, 0, 0, uart_source);
- aplic_enable_intr(APLIC_S, uart_source);
-
imsic_w_seithreshold(0);
imsic_w_seidelivery(EIDELIVERY_ENABLED);
- imsic_s_seie(uart_source);
+}
+
+void aplic_enable_intr_s(uint32_t source, uint32_t msg)
+{
+ aplic_w_sourcecfg_delegate(APLIC_M, source, 0);
+ aplic_w_sourcecfg_active_high(APLIC_S, source);
+ aplic_w_target_msi(APLIC_S, source, 0, 0, msg);
+ aplic_enable_intr(APLIC_S, source);
+ imsic_s_seie(msg);
+}
+
+uint32_t aplic_claim_msi_s()
+{
+ uint32_t intr;
+ __asm__ volatile("csrrw %0, stopei, zero" : "=r"(intr));
+ return intr >> 16;
}