18 #ifndef __CORE_FEATURE_PLIC__
19 #define __CORE_FEATURE_PLIC__
37 #include "core_feature_base.h"
39 #if defined(__PLIC_PRESENT) && (__PLIC_PRESENT == 1)
49 #define PLIC_PRIORITY_OFFSET _AC(0x0000,UL)
50 #define PLIC_PRIORITY_SHIFT_PER_SOURCE 2
52 #define PLIC_PENDING_OFFSET _AC(0x1000,UL)
53 #define PLIC_PENDING_SHIFT_PER_SOURCE 0
56 #define PLIC_ENABLE_OFFSET _AC(0x2000,UL)
57 #define PLIC_ENABLE_SHIFT_PER_CONTEXT 7
59 #define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL)
60 #define PLIC_CLAIM_OFFSET _AC(0x200004,UL)
61 #define PLIC_THRESHOLD_SHIFT_PER_CONTEXT 12
62 #define PLIC_CLAIM_SHIFT_PER_CONTEXT 12
64 #ifndef __PLIC_BASEADDR
66 #error "__PLIC_BASEADDR is not defined, please check!"
70 #define PLIC_BASE __PLIC_BASEADDR
80 #define PLIC_GetHartID() (__get_hart_index())
81 #define PLIC_GetHartID_S() (__get_hart_index_s())
83 #define PLIC_GetHartID() (__PLIC_HARTID)
84 #define PLIC_GetHartID_S() (__PLIC_HARTID)
87 #define PLIC_GetHartMContextID() (PLIC_GetHartID() << 1)
89 #define PLIC_GetHartSContextID() ((PLIC_GetHartID_S() << 1) + 1)
91 #define PLIC_PRIORITY_REGADDR(source) ((PLIC_BASE) + (PLIC_PRIORITY_OFFSET) + ((source) << PLIC_PRIORITY_SHIFT_PER_SOURCE))
92 #define PLIC_PENDING_REGADDR(source) ((PLIC_BASE) + (PLIC_PENDING_OFFSET) + (((source) >> 5) * 4))
93 #define PLIC_ENABLE_REGADDR(ctxid, source) ((PLIC_BASE) + (PLIC_ENABLE_OFFSET) + ((ctxid) << PLIC_ENABLE_SHIFT_PER_CONTEXT) + ((source) >> 5) * 4)
94 #define PLIC_THRESHOLD_REGADDR(ctxid) ((PLIC_BASE) + (PLIC_THRESHOLD_OFFSET) + ((ctxid) << PLIC_THRESHOLD_SHIFT_PER_CONTEXT))
95 #define PLIC_CLAIM_REGADDR(ctxid) ((PLIC_BASE) + (PLIC_CLAIM_OFFSET) + ((ctxid) << PLIC_CLAIM_SHIFT_PER_CONTEXT))
96 #define PLIC_COMPLETE_REGADDR(ctxid) (PLIC_CLAIM_REGADDR(ctxid))
123 *thresh_reg = thresh;
140 return (*thresh_reg);
157 uint32_t current = *enable_reg;
158 current = current | (1UL << (source & 0x1F));
159 *enable_reg = current;
176 uint32_t current = *enable_reg;
177 current = current & (~(1UL << (source & 0x1F)));
178 *enable_reg = current;
197 uint32_t current = *enable_reg;
198 current = (current >> (source & 0x1F)) & 0x1;
216 uint32_t current = *pending_reg;
217 current = current | (1UL << (source & 0x1F));
218 *pending_reg = current;
235 uint32_t current = *pending_reg;
236 current = current & (~(1UL << (source & 0x1F)));
237 *pending_reg = current;
255 uint32_t current = *pending_reg;
256 current = (current >> (source & 0x1F)) & 0x1;
274 *priority_reg = priority;
291 return (*priority_reg);
336 *complete_reg = source;
355 for (i = 0; i < num_sources; i ++) {
365 #define PLIC_Init(num_sources, enable, thresh) PLIC_Context_Init(PLIC_GetHartMContextID(), (num_sources), (enable), (thresh))
366 #define PLIC_Init_S(num_sources, enable, thresh) PLIC_Context_Init(PLIC_GetHartSContextID(), (num_sources), (enable), (thresh))
368 #define PLIC_ClaimInterrupt() PLIC_ClaimContextInterrupt(PLIC_GetHartMContextID())
369 #define PLIC_ClaimInterrupt_S() PLIC_ClaimContextInterrupt(PLIC_GetHartSContextID())
371 #define PLIC_CompleteInterrupt(source) PLIC_CompleteContextInterrupt(PLIC_GetHartMContextID(), (source))
372 #define PLIC_CompleteInterrupt_S(source) PLIC_CompleteContextInterrupt(PLIC_GetHartSContextID(), (source))
374 #define PLIC_GetInterruptEnable(source) PLIC_GetContextInterruptEnable(PLIC_GetHartMContextID(), (source))
375 #define PLIC_GetInterruptEnable_S(source) PLIC_GetContextInterruptEnable(PLIC_GetHartSContextID(), (source))
377 #define PLIC_EnableInterrupt(source) PLIC_EnableContextInterrupt(PLIC_GetHartMContextID(), (source))
378 #define PLIC_EnableInterrupt_S(source) PLIC_EnableContextInterrupt(PLIC_GetHartSContextID(), (source))
380 #define PLIC_DisableInterrupt(source) PLIC_DisableContextInterrupt(PLIC_GetHartMContextID(), (source))
381 #define PLIC_DisableInterrupt_S(source) PLIC_DisableContextInterrupt(PLIC_GetHartSContextID(), (source))
383 #define PLIC_SetThreshold(source, thresh) PLIC_SetContextThreshold(PLIC_GetHartMContextID(), (source), (thresh))
384 #define PLIC_SetThreshold_S(source, thresh) PLIC_SetContextThreshold(PLIC_GetHartSContextID(), (source), (thresh))
386 #define PLIC_GetThreshold() PLIC_GetContextThreshold(PLIC_GetHartMContextID())
387 #define PLIC_GetThreshold_S() PLIC_GetContextThreshold(PLIC_GetHartSContextID())
#define __RV_CSR_READ(csr)
CSR operation Macro for csrr instruction.
#define __RV_CSR_WRITE(csr, val)
CSR operation Macro for csrw instruction.
#define __STATIC_FORCEINLINE
Define a static function that should be always inlined by the compiler.
__STATIC_FORCEINLINE uint32_t PLIC_ClaimContextInterrupt(uint32_t ctxid)
Claim interrupt for plic for selected context.
__STATIC_FORCEINLINE void PLIC_SetInterruptPending(uint32_t source)
Set interrupt pending of selected source plic.
__STATIC_FORCEINLINE uint32_t PLIC_GetInterruptPending(uint32_t source)
Get interrupt pending status of selected source plic.
__STATIC_FORCEINLINE void PLIC_SetContextThreshold(uint32_t ctxid, uint32_t thresh)
Set priority threshold value of plic for selected context.
__STATIC_FORCEINLINE void PLIC_CompleteContextInterrupt(uint32_t ctxid, uint32_t source)
Complete interrupt for plic for selected context.
__STATIC_FORCEINLINE void __set_trap_entry(rv_csr_t addr)
Set Trap entry address.
__STATIC_FORCEINLINE uint32_t PLIC_GetContextInterruptEnable(uint32_t ctxid, uint32_t source)
Get interrupt enable status of selected source plic for selected context.
__STATIC_FORCEINLINE void PLIC_EnableContextInterrupt(uint32_t ctxid, uint32_t source)
Enable interrupt of selected source plic for selected context.
__STATIC_FORCEINLINE rv_csr_t __get_trap_entry(void)
Get trap entry address.
__STATIC_FORCEINLINE void PLIC_Context_Init(uint32_t ctxid, uint32_t num_sources, uint32_t enable, uint32_t thresh)
Perform init for plic for selected context.
__STATIC_FORCEINLINE uint32_t PLIC_GetPriority(uint32_t source)
Get interrupt priority for selected source plic.
__STATIC_FORCEINLINE void PLIC_SetPriority(uint32_t source, uint32_t priority)
Set interrupt priority for selected source plic.
__STATIC_FORCEINLINE void PLIC_ClearInterruptPending(uint32_t source)
Clear interrupt pending of selected source plic.
__STATIC_FORCEINLINE void PLIC_DisableContextInterrupt(uint32_t ctxid, uint32_t source)
Disable interrupt of selected source plic for selected context.
__STATIC_FORCEINLINE uint32_t PLIC_GetContextThreshold(uint32_t ctxid)
Get priority threshold value of plic for selected context.
#define PLIC_PENDING_REGADDR(source)
#define PLIC_PRIORITY_REGADDR(source)
#define PLIC_ENABLE_REGADDR(ctxid, source)
#define PLIC_THRESHOLD_REGADDR(ctxid)
#define PLIC_CLAIM_REGADDR(ctxid)
#define PLIC_COMPLETE_REGADDR(ctxid)
unsigned long rv_csr_t
Type of Control and Status Register(CSR), depends on the XLEN defined in RISC-V.