diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-06-04 23:32:33 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-06-04 23:32:33 +0200 |
commit | d78b60f868f40cefe3ac958800ac828f2eafc81c (patch) | |
tree | 29309397c2e77f2598a1f282bfc9d4436d697263 /kernel/aplic.c | |
parent | f95c522b0ae30dd3c4d9c4449de98d3b5c6e9a65 (diff) |
Diffstat (limited to 'kernel/aplic.c')
-rw-r--r-- | kernel/aplic.c | 24 |
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;
}
|