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.
#define __STATIC_INLINE
Define a static function that may be 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 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_INLINE 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 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.