cpu/cva6: Switch to common PLIC handling code to make it similar to other PLIC based CPU and avoid code "duplication".
This commit is contained in:
parent
b58186a99d
commit
6164a55c6b
|
@ -90,6 +90,7 @@ class CVA6(CPU):
|
|||
def gcc_flags(self):
|
||||
flags = GCC_FLAGS[self.variant]
|
||||
flags += "-D__cva6__ "
|
||||
flags += "-D__riscv_plic__ "
|
||||
#flags += f" -DUART_POLLING"
|
||||
return flags
|
||||
|
||||
|
|
|
@ -9,15 +9,16 @@ extern "C" {
|
|||
#include <generated/csr.h>
|
||||
#include <generated/soc.h>
|
||||
|
||||
#define PLIC_SOURCE_0 0x0c000004L // source 0 priority
|
||||
#define PLIC_SOURCE_1 0x0c000008L // source 1 priority
|
||||
#define PLIC_PENDING 0x0c001000L // start of pending array
|
||||
#define PLIC_M_ENABLE 0x0c002000L // Start of Hart 0 M-mode enables
|
||||
#define PLIC_S_ENABLE 0x0c002100L // Start of Hart 0 S-mode enables
|
||||
#define PLIC_M_THRESHOLD 0x0c200000L // hart 0 M-mode priority threshold
|
||||
#define PLIC_M_CLAIM 0x0c200004L // hart 0 M-mode priority claim/complete
|
||||
#define PLIC_S_THRESHOLD 0x0c200100L // hart 0 S-mode priority threshold
|
||||
#define PLIC_S_CLAIM 0x0c200104L // hart 0 S-mode priority claim/complete
|
||||
// The CVA6 uses a Platform-Level Interrupt Controller (PLIC) which
|
||||
// is programmed and queried via a set of MMIO registers.
|
||||
|
||||
#define PLIC_BASE 0x0c000000L // Base address and per-pin priority array
|
||||
#define PLIC_PENDING 0x0c001000L // Bit field matching currently pending pins
|
||||
#define PLIC_ENABLED 0x0c002000L // Bit field corresponding to the current mask
|
||||
#define PLIC_THRSHLD 0x0c200000L // Per-pin priority must be >= this to trigger
|
||||
#define PLIC_CLAIM 0x0c200004L // Claim & completion register address
|
||||
|
||||
#define PLIC_EXT_IRQ_BASE 1
|
||||
|
||||
static inline unsigned int irq_getie(void)
|
||||
{
|
||||
|
@ -31,12 +32,12 @@ static inline void irq_setie(unsigned int ie)
|
|||
|
||||
static inline unsigned int irq_getmask(void)
|
||||
{
|
||||
return *((unsigned int *)PLIC_M_ENABLE) >> 1;
|
||||
return *((unsigned int *)PLIC_ENABLED) >> 1;
|
||||
}
|
||||
|
||||
static inline void irq_setmask(unsigned int mask)
|
||||
{
|
||||
*((unsigned int *)PLIC_M_ENABLE) = mask << 1;
|
||||
*((unsigned int *)PLIC_ENABLED) = mask << 1;
|
||||
}
|
||||
|
||||
static inline unsigned int irq_pending(void)
|
||||
|
|
|
@ -153,47 +153,8 @@ void isr_dec(void)
|
|||
mtdec(0x000000000ffffff);
|
||||
}
|
||||
|
||||
#elif defined(__cva6__)
|
||||
void plic_init(void);
|
||||
void plic_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
// priorities for interrupt pins 0...7
|
||||
for (i = 0; i < 8; i++)
|
||||
*((unsigned int *)PLIC_SOURCE_0 + i) = 1;
|
||||
// enable interrupt pins 0...7 (M-mode)
|
||||
*((unsigned int *)PLIC_M_ENABLE) = 0xff;
|
||||
// set priority threshold to 0 (any priority > 0 triggers interrupt)
|
||||
*((unsigned int *)PLIC_M_THRESHOLD) = 0;
|
||||
}
|
||||
|
||||
void isr(void)
|
||||
{
|
||||
unsigned int claim;
|
||||
|
||||
while ((claim = *((unsigned int *)PLIC_M_CLAIM))) {
|
||||
switch (claim - 1) {
|
||||
case UART_INTERRUPT:
|
||||
uart_isr();
|
||||
break;
|
||||
default:
|
||||
printf("## PLIC: Unhandled claim: %d\n", claim);
|
||||
printf("# plic_enabled: %08x\n", irq_getmask());
|
||||
printf("# plic_pending: %08x\n", irq_pending());
|
||||
printf("# mepc: %016lx\n", csrr(mepc));
|
||||
printf("# mcause: %016lx\n", csrr(mcause));
|
||||
printf("# mtval: %016lx\n", csrr(mtval));
|
||||
printf("# mie: %016lx\n", csrr(mie));
|
||||
printf("# mip: %016lx\n", csrr(mip));
|
||||
printf("###########################\n\n");
|
||||
break;
|
||||
}
|
||||
*((unsigned int *)PLIC_M_CLAIM) = claim;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct irq_table
|
||||
{
|
||||
isr_t isr;
|
||||
|
|
Loading…
Reference in New Issue