 |
NMSIS-Core
Version 1.6.0
NMSIS-Core support for Nuclei processor-based devices
|
18 #ifndef __CORE_FEATURE_ECLIC__
19 #define __CORE_FEATURE_ECLIC__
45 #include "core_feature_base.h"
47 #if defined(__ECLIC_PRESENT) && (__ECLIC_PRESENT == 1)
102 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
105 __IM uint8_t RESERVED2;
109 uint32_t RESERVED4[1021];
110 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
124 #define CLIC_CLICCFG_NLBIT_Pos 1U
125 #define CLIC_CLICCFG_NLBIT_Msk (0xFUL << CLIC_CLICCFG_NLBIT_Pos)
127 #define CLIC_CLICINFO_CTLBIT_Pos 21U
128 #define CLIC_CLICINFO_CTLBIT_Msk (0xFUL << CLIC_CLICINFO_CTLBIT_Pos)
130 #define CLIC_CLICINFO_VER_Pos 13U
131 #define CLIC_CLICINFO_VER_Msk (0xFFUL << CLIC_CLICINFO_VER_Pos)
133 #define CLIC_CLICINFO_NUM_Pos 0U
134 #define CLIC_CLICINFO_NUM_Msk (0x1FFFUL << CLIC_CLICINFO_NUM_Pos)
136 #define CLIC_CLICINFO_SHD_NUM_Pos 25U
137 #define CLIC_CLICINFO_SHD_NUM_Msk (0xFUL << CLIC_CLICINFO_SHD_NUM_Pos)
139 #define CLIC_INTIP_IP_Pos 0U
140 #define CLIC_INTIP_IP_Msk (0x1UL << CLIC_INTIP_IP_Pos)
142 #define CLIC_INTIE_IE_Pos 0U
143 #define CLIC_INTIE_IE_Msk (0x1UL << CLIC_INTIE_IE_Pos)
145 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
146 #define CLIC_INTATTR_MODE_Pos 6U
147 #define CLIC_INTATTR_MODE_Msk (0x3U << CLIC_INTATTR_MODE_Pos)
150 #define CLIC_INTATTR_TRIG_Pos 1U
151 #define CLIC_INTATTR_TRIG_Msk (0x3UL << CLIC_INTATTR_TRIG_Pos)
153 #define CLIC_INTATTR_SHV_Pos 0U
154 #define CLIC_INTATTR_SHV_Msk (0x1UL << CLIC_INTATTR_SHV_Pos)
156 #define ECLIC_MAX_NLBITS 8U
157 #define ECLIC_MODE_MTVEC_Msk 3U
159 #define ECLIC_NON_VECTOR_INTERRUPT 0x0
160 #define ECLIC_VECTOR_INTERRUPT 0x1
163 typedef enum ECLIC_TRIGGER {
168 } ECLIC_TRIGGER_Type;
170 #ifndef __ECLIC_BASEADDR
172 #error "__ECLIC_BASEADDR is not defined, please check!"
175 #ifndef __ECLIC_INTCTLBITS
177 #define __ECLIC_INTCTLBITS (__ECLIC_GetInfoCtlbits())
182 #define __ECLIC_VER 1U
186 #define ECLIC_BASE __ECLIC_BASEADDR
187 #define ECLIC ((CLIC_Type *) ECLIC_BASE)
213 #if defined(__ONLY_FOR_DOXYGEN_DOCUMENT_GENERATION__)
248 #ifdef NMSIS_ECLIC_VIRTUAL
249 #ifndef NMSIS_ECLIC_VIRTUAL_HEADER_FILE
250 #define NMSIS_ECLIC_VIRTUAL_HEADER_FILE "nmsis_eclic_virtual.h"
252 #include NMSIS_ECLIC_VIRTUAL_HEADER_FILE
254 #define ECLIC_SetCfgNlbits __ECLIC_SetCfgNlbits
255 #define ECLIC_GetCfgNlbits __ECLIC_GetCfgNlbits
256 #define ECLIC_GetInfoVer __ECLIC_GetInfoVer
257 #define ECLIC_GetInfoCtlbits __ECLIC_GetInfoCtlbits
258 #define ECLIC_GetInfoNum __ECLIC_GetInfoNum
259 #define ECLIC_GetInfoShadowNum __ECLIC_GetInfoShadowNum
260 #define ECLIC_SetMth __ECLIC_SetMth
261 #define ECLIC_GetMth __ECLIC_GetMth
262 #define ECLIC_EnableIRQ __ECLIC_EnableIRQ
263 #define ECLIC_GetEnableIRQ __ECLIC_GetEnableIRQ
264 #define ECLIC_DisableIRQ __ECLIC_DisableIRQ
265 #define ECLIC_SetPendingIRQ __ECLIC_SetPendingIRQ
266 #define ECLIC_GetPendingIRQ __ECLIC_GetPendingIRQ
267 #define ECLIC_ClearPendingIRQ __ECLIC_ClearPendingIRQ
268 #define ECLIC_SetTrigIRQ __ECLIC_SetTrigIRQ
269 #define ECLIC_GetTrigIRQ __ECLIC_GetTrigIRQ
270 #define ECLIC_SetShvIRQ __ECLIC_SetShvIRQ
271 #define ECLIC_GetShvIRQ __ECLIC_GetShvIRQ
272 #define ECLIC_SetCtrlIRQ __ECLIC_SetCtrlIRQ
273 #define ECLIC_GetCtrlIRQ __ECLIC_GetCtrlIRQ
274 #define ECLIC_SetLevelIRQ __ECLIC_SetLevelIRQ
275 #define ECLIC_GetLevelIRQ __ECLIC_GetLevelIRQ
276 #define ECLIC_SetPriorityIRQ __ECLIC_SetPriorityIRQ
277 #define ECLIC_GetPriorityIRQ __ECLIC_GetPriorityIRQ
279 #define ECLIC_EnableShadow __ECLIC_EnableShadow
280 #define ECLIC_DisableShadow __ECLIC_DisableShadow
281 #define ECLIC_SetShadowLevel __ECLIC_SetShadowLevel
282 #define ECLIC_GetShadowLevel __ECLIC_GetShadowLevel
283 #define ECLIC_SetShadowLevelReg __ECLIC_SetShadowLevelReg
284 #define ECLIC_GetShadowLevelReg __ECLIC_GetShadowLevelReg
288 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
289 #define ECLIC_SetModeIRQ __ECLIC_SetModeIRQ
290 #define ECLIC_SetSth __ECLIC_SetSth
291 #define ECLIC_GetSth __ECLIC_GetSth
292 #define ECLIC_SetPendingIRQ_S __ECLIC_SetPendingIRQ_S
293 #define ECLIC_GetPendingIRQ_S __ECLIC_GetPendingIRQ_S
294 #define ECLIC_ClearPendingIRQ_S __ECLIC_ClearPendingIRQ_S
295 #define ECLIC_SetTrigIRQ_S __ECLIC_SetTrigIRQ_S
296 #define ECLIC_GetTrigIRQ_S __ECLIC_GetTrigIRQ_S
297 #define ECLIC_SetShvIRQ_S __ECLIC_SetShvIRQ_S
298 #define ECLIC_GetShvIRQ_S __ECLIC_GetShvIRQ_S
299 #define ECLIC_SetCtrlIRQ_S __ECLIC_SetCtrlIRQ_S
300 #define ECLIC_GetCtrlIRQ_S __ECLIC_GetCtrlIRQ_S
301 #define ECLIC_SetLevelIRQ_S __ECLIC_SetLevelIRQ_S
302 #define ECLIC_GetLevelIRQ_S __ECLIC_GetLevelIRQ_S
303 #define ECLIC_SetPriorityIRQ_S __ECLIC_SetPriorityIRQ_S
304 #define ECLIC_GetPriorityIRQ_S __ECLIC_GetPriorityIRQ_S
305 #define ECLIC_EnableIRQ_S __ECLIC_EnableIRQ_S
306 #define ECLIC_GetEnableIRQ_S __ECLIC_GetEnableIRQ_S
307 #define ECLIC_DisableIRQ_S __ECLIC_DisableIRQ_S
309 #define ECLIC_EnableShadow_S __ECLIC_EnableShadow_S
310 #define ECLIC_DisableShadow_S __ECLIC_DisableShadow_S
311 #define ECLIC_SetShadowLevel_S __ECLIC_SetShadowLevel_S
312 #define ECLIC_GetShadowLevel_S __ECLIC_GetShadowLevel_S
313 #define ECLIC_SetShadowLevelReg_S __ECLIC_SetShadowLevelReg_S
314 #define ECLIC_GetShadowLevelReg_S __ECLIC_GetShadowLevelReg_S
320 #ifdef NMSIS_VECTAB_VIRTUAL
321 #ifndef NMSIS_VECTAB_VIRTUAL_HEADER_FILE
322 #define NMSIS_VECTAB_VIRTUAL_HEADER_FILE "nmsis_vectab_virtual.h"
324 #include NMSIS_VECTAB_VIRTUAL_HEADER_FILE
326 #define ECLIC_SetVector __ECLIC_SetVector
327 #define ECLIC_GetVector __ECLIC_GetVector
329 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
330 #define ECLIC_SetVector_S __ECLIC_SetVector_S
331 #define ECLIC_GetVector_S __ECLIC_GetVector_S
347 uint8_t temp =
ECLIC->CFG;
586 uint8_t temp =
ECLIC->CTRL[
IRQn].INTATTR;
627 uint8_t temp =
ECLIC->CTRL[
IRQn].INTATTR;
701 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
707 if (nlbits > intctlbits) {
710 uint8_t maxlvl = ((1UL << nlbits) - 1);
711 if (lvl_abs > maxlvl) {
716 cur_ctrl = cur_ctrl << nlbits;
717 cur_ctrl = cur_ctrl >> nlbits;
735 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
741 if (nlbits > intctlbits) {
766 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
767 if (nlbits < intctlbits) {
768 uint8_t maxpri = ((1UL << (intctlbits - nlbits)) - 1);
773 uint8_t mask = ((uint8_t)(-1)) >> intctlbits;
796 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
797 if (nlbits < intctlbits) {
799 uint8_t pri = cur_ctrl << nlbits;
859 __STATIC_INLINE void __ECLIC_SetShadowLevel(
unsigned long idx, uint8_t level)
868 uint8_t max_level = (1U << nlbits) - 1;
869 if (level > max_level) {
874 uint8_t level_shifted = (uint8_t)((level << (8 - nlbits)) | ((1U << (8 - nlbits)) - 1));
876 #if __RISCV_XLEN == 64
879 uint32_t bit_pos = idx << 3;
881 uint64_t mask = (uint64_t)0xFFUL << bit_pos;
884 current_val = (current_val & ~mask) | (((uint64_t)level_shifted) << bit_pos);
890 uint32_t bit_pos = idx << 3;
891 uint32_t mask = 0xFFUL << bit_pos;
893 current_val = (current_val & ~mask) | (((uint32_t)level_shifted) << bit_pos);
897 uint32_t bit_pos = (idx - 4) << 3;
898 uint32_t mask = 0xFFUL << bit_pos;
900 current_val = (current_val & ~mask) | (((uint32_t)level_shifted) << bit_pos);
933 #if __RISCV_XLEN == 64
936 uint32_t bit_pos = idx << 3;
939 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
941 uint8_t level = (extracted_val >> (8 - nlbits));
947 uint32_t bit_pos = idx << 3;
950 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
952 uint8_t level = (extracted_val >> (8 - nlbits));
956 uint32_t bit_pos = (idx - 4) << 3;
959 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
961 uint8_t level = (extracted_val >> (8 - nlbits));
984 #if __RISCV_XLEN == 64
1009 #if __RISCV_XLEN == 64
1038 unsigned long vec_base;
1040 vec_base += ((
unsigned long)
IRQn) *
sizeof(
unsigned long);
1041 (* (
unsigned long *) vec_base) = vector;
1042 #if (defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1))
1043 #if (defined(__CCM_PRESENT) && (__CCM_PRESENT == 1))
1047 #if (defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1))
1048 #if (defined(__CCM_PRESENT) && (__CCM_PRESENT == 1))
1070 #if __RISCV_XLEN == 32
1072 #elif __RISCV_XLEN == 64
1074 #else // TODO Need cover for XLEN=128 case in future
1079 #if defined(__SMODE_PRESENT) && (__SMODE_PRESENT == 1)
1135 return (
ECLIC->STH);
1208 uint8_t temp =
ECLIC->SCTRL[
IRQn].INTATTR;
1250 uint8_t temp =
ECLIC->SCTRL[
IRQn].INTATTR;
1324 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
1330 if (nlbits > intctlbits) {
1331 nlbits = intctlbits;
1333 uint8_t maxlvl = ((1UL << nlbits) - 1);
1334 if (lvl_abs > maxlvl) {
1339 cur_ctrl = cur_ctrl << nlbits;
1340 cur_ctrl = cur_ctrl >> nlbits;
1359 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
1365 if (nlbits > intctlbits) {
1366 nlbits = intctlbits;
1390 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
1391 if (nlbits < intctlbits) {
1392 uint8_t maxpri = ((1UL << (intctlbits - nlbits)) - 1);
1397 uint8_t mask = ((uint8_t)(-1)) >> intctlbits;
1420 uint8_t intctlbits = (uint8_t)__ECLIC_INTCTLBITS;
1421 if (nlbits < intctlbits) {
1423 uint8_t pri = cur_ctrl << nlbits;
1424 pri = pri >> nlbits;
1499 volatile unsigned long vec_base;
1501 vec_base += ((
unsigned long)
IRQn) *
sizeof(
unsigned long);
1502 (* (
unsigned long *) vec_base) = vector;
1503 #if (defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1))
1504 #if (defined(__CCM_PRESENT) && (__CCM_PRESENT == 1))
1508 #if (defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1))
1509 #if (defined(__CCM_PRESENT) && (__CCM_PRESENT == 1))
1531 #if __RISCV_XLEN == 32
1533 #elif __RISCV_XLEN == 64
1535 #else // TODO Need cover for XLEN=128 case in future
1540 #if __ECLIC_VER == 2
1591 __STATIC_INLINE void __ECLIC_SetShadowLevel_S(
unsigned long idx, uint8_t level)
1600 uint8_t max_level = (1U << nlbits) - 1;
1601 if (level > max_level) {
1606 uint8_t level_shifted = (uint8_t)((level << (8 - nlbits)) | ((1U << (8 - nlbits)) - 1));
1608 #if __RISCV_XLEN == 64
1611 uint32_t bit_pos = idx << 3;
1613 uint64_t mask = (uint64_t)0xFFUL << bit_pos;
1616 current_val = (current_val & ~mask) | (((uint64_t)level_shifted) << bit_pos);
1622 uint32_t bit_pos = idx << 3;
1623 uint32_t mask = 0xFFUL << bit_pos;
1625 current_val = (current_val & ~mask) | (((uint32_t)level_shifted) << bit_pos);
1629 uint32_t bit_pos = (idx - 4) << 3;
1630 uint32_t mask = 0xFFUL << bit_pos;
1632 current_val = (current_val & ~mask) | (((uint32_t)level_shifted) << bit_pos);
1665 #if __RISCV_XLEN == 64
1668 uint32_t bit_pos = idx << 3;
1671 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
1673 uint8_t level = (extracted_val >> (8 - nlbits));
1679 uint32_t bit_pos = idx << 3;
1682 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
1684 uint8_t level = (extracted_val >> (8 - nlbits));
1688 uint32_t bit_pos = (idx - 4) << 3;
1691 uint8_t extracted_val = (uint8_t)((current_val >> bit_pos) & 0xFF);
1693 uint8_t level = (extracted_val >> (8 - nlbits));
1716 #if __RISCV_XLEN == 64
1741 #if __RISCV_XLEN == 64
1850 #if __ECLIC_VER == 2
1851 #define SAVE_SSUBM_VAR() rv_csr_t __ssubm = __RV_CSR_READ(CSR_SSUBM);
1852 #define RESTORE_SSUBM_VAR() __RV_CSR_WRITE(CSR_SSUBM, __ssubm);
1854 #define SAVE_SSUBM_VAR()
1855 #define RESTORE_SSUBM_VAR()
1888 #define SAVE_IRQ_CSR_CONTEXT() \
1889 rv_csr_t __mcause = __RV_CSR_READ(CSR_MCAUSE); \
1890 rv_csr_t __mepc = __RV_CSR_READ(CSR_MEPC); \
1891 rv_csr_t __msubm = __RV_CSR_READ(CSR_MSUBM); \
1895 #define SAVE_IRQ_CSR_CONTEXT_S() \
1896 rv_csr_t __scause = __RV_CSR_READ(CSR_SCAUSE); \
1897 rv_csr_t __sepc = __RV_CSR_READ(CSR_SEPC); \
1911 #define RESTORE_IRQ_CSR_CONTEXT() \
1913 __RV_CSR_WRITE(CSR_MSUBM, __msubm); \
1914 __RV_CSR_WRITE(CSR_MEPC, __mepc); \
1915 __RV_CSR_WRITE(CSR_MCAUSE, __mcause);
1918 #define RESTORE_IRQ_CSR_CONTEXT_S() \
1919 __disable_irq_s(); \
1920 RESTORE_SSUBM_VAR(); \
1921 __RV_CSR_WRITE(CSR_SEPC, __sepc); \
1922 __RV_CSR_WRITE(CSR_SCAUSE, __scause);
#define __IM
Defines 'read only' structure member permissions.
__STATIC_FORCEINLINE rv_csr_t __ECLIC_GetVector(IRQn_Type IRQn)
Get Interrupt Vector of a specific interrupt.
__STATIC_FORCEINLINE void __ECLIC_EnableIRQ_S(IRQn_Type IRQn)
Enable a specific interrupt in supervisor mode.
@ SysTimer_IRQn
System Timer Interrupt.
__STATIC_INLINE void __ECLIC_SetVector_S(IRQn_Type IRQn, rv_csr_t vector)
Set Interrupt Vector of a specific interrupt in supervisor mode.
@ Reserved5_IRQn
Internal reserved.
__IM uint32_t INFO
Offset: 0x004 (R/ ) CLIC information register.
#define CLIC_INTIE_IE_Msk
CLIC INTIE: IE Mask.
__STATIC_FORCEINLINE void __ECLIC_SetShvIRQ(IRQn_Type IRQn, uint32_t shv)
Set interrupt working mode for a specific interrupt.
@ Reserved3_IRQn
Internal reserved.
__IM uint32_t shd_num
bit: 25..28 number of shadow register groups for single mode(M/S mode)
#define CLIC_INTATTR_TRIG_Pos
CLIC INTATTR: TRIG Position.
uint8_t w
Type used for byte access.
@ Reserved14_IRQn
Internal reserved.
__STATIC_FORCEINLINE void __ECLIC_DisableIRQ_S(IRQn_Type IRQn)
Disable a specific interrupt in supervisor mode.
__IM uint32_t numint
bit: 0..12 number of maximum interrupt inputs supported
#define CLIC_INTATTR_MODE_Msk
CLIC INTATTA: Mode Mask.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetTrigIRQ(IRQn_Type IRQn)
Get trigger mode and polarity for a specific interrupt.
__STATIC_INLINE void __ECLIC_SetVector(IRQn_Type IRQn, rv_csr_t vector)
Set Interrupt Vector of a specific interrupt.
@ ECLIC_NEGTIVE_EDGE_TRIGGER
Negtive/Falling Edge Triggered, trig[0] = 1, trig[1] = 1.
@ Reserved7_IRQn
Internal reserved.
#define __RV_CSR_CLEAR(csr, val)
CSR operation Macro for csrc instruction.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetShvIRQ_S(IRQn_Type IRQn)
Get interrupt working mode for a specific interrupt in supervisor mode.
__STATIC_INLINE void MInvalICacheLine(unsigned long addr)
Invalidate one I-Cache line specified by address in M-Mode.
#define CLIC_INTATTR_SHV_Pos
CLIC INTATTR: SHV Position.
__STATIC_FORCEINLINE void __set_exc_entry(rv_csr_t addr)
Set Exception entry address.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoShadowNum(void)
Get number of shadow register groups.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetMth(void)
Get Machine Mode Interrupt Level Threshold.
__STATIC_FORCEINLINE void __ECLIC_SetShvIRQ_S(IRQn_Type IRQn, uint32_t shv)
Set interrupt working mode for a specific interrupt in supervisor mode.
__STATIC_INLINE void __ECLIC_SetLevelIRQ(IRQn_Type IRQn, uint8_t lvl_abs)
Set ECLIC Interrupt level of a specific interrupt.
@ Reserved6_IRQn
Internal reserved.
__STATIC_INLINE uint8_t __ECLIC_GetLevelIRQ(IRQn_Type IRQn)
Get ECLIC Interrupt level of a specific interrupt.
__STATIC_FORCEINLINE void __ECLIC_SetPendingIRQ_S(IRQn_Type IRQn)
Set a specific interrupt to pending in supervisor mode.
@ Reserved0_IRQn
Internal reserved.
__IOM uint8_t STH
Offset: 0x009 (R/W ) CLIC supervisor mode interrupt-level threshold.
__IOM uint8_t INTIE
Offset: 0x001 (R/W) Interrupt set enable register.
__STATIC_INLINE uint8_t __ECLIC_GetPriorityIRQ(IRQn_Type IRQn)
Get ECLIC Interrupt priority of a specific interrupt.
__IOM uint8_t nlbits
bit: 1..4 specified the bit-width of level and priority in the register clicintctl[i]
#define CLIC_CLICCFG_NLBIT_Msk
CLIC CLICCFG: NLBIT Mask.
Union type to access CLICFG configure register.
@ Reserved8_IRQn
Internal reserved.
__STATIC_INLINE void __ECLIC_SetPriorityIRQ_S(IRQn_Type IRQn, uint8_t pri)
Set ECLIC Interrupt priority of a specific interrupt in supervisor mode.
#define __IOM
Defines 'read/write' structure member permissions.
__IOM uint8_t INTATTR
Offset: 0x002 (R/W) Interrupt set attributes register.
__IM uint32_t _reserved0
bit: 29..31 Reserved
@ ECLIC_POSTIVE_EDGE_TRIGGER
Postive/Rising Edge Triggered, trig[0] = 1, trig[1] = 0.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetCtrlIRQ_S(IRQn_Type IRQn)
Get ECLIC Interrupt Input Control Register value for a specific interrupt in supervisor mode.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoVer(void)
Get the ECLIC version number.
#define ECLIC_MODE_MTVEC_Msk
ECLIC Mode mask for MTVT CSR Register.
#define CLIC_INTATTR_MODE_Pos
CLIC INTATTA: Mode Position.
IRQn
Definition of IRQn numbers.
__STATIC_INLINE void __ECLIC_SetLevelIRQ_S(IRQn_Type IRQn, uint8_t lvl_abs)
Set ECLIC Interrupt level of a specific interrupt in supervisor mode.
__STATIC_FORCEINLINE void __ECLIC_SetMth(uint8_t mth)
Set Machine Mode Interrupt Level Threshold.
#define ECLIC
CLIC configuration struct.
#define __RV_CSR_WRITE(csr, val)
CSR operation Macro for csrw instruction.
Access to the structure of ECLIC Memory Map.
__STATIC_INLINE void __ECLIC_SetPriorityIRQ(IRQn_Type IRQn, uint8_t pri)
Get ECLIC Interrupt priority of a specific interrupt.
#define SECLIC_CTL_SHADOW_EN
__STATIC_INLINE uint8_t __ECLIC_GetPriorityIRQ_S(IRQn_Type IRQn)
Get ECLIC Interrupt priority of a specific interrupt in supervisor mode.
__STATIC_FORCEINLINE void __ECLIC_SetCtrlIRQ(IRQn_Type IRQn, uint8_t intctrl)
Modify ECLIC Interrupt Input Control Register for a specific interrupt.
__STATIC_FORCEINLINE void __ECLIC_ClearPendingIRQ_S(IRQn_Type IRQn)
Clear a specific interrupt from pending in supervisor mode.
__STATIC_FORCEINLINE int32_t __ECLIC_GetPendingIRQ_S(IRQn_Type IRQn)
Get the pending specific interrupt in supervisor mode.
#define CLIC_CLICINFO_CTLBIT_Pos
CLIC INTINFO: CLICINTCTLBITS Position.
__STATIC_FORCEINLINE void __ECLIC_SetTrigIRQ(IRQn_Type IRQn, uint32_t trig)
Set trigger mode and polarity for a specific interrupt.
__STATIC_FORCEINLINE void __FENCE_I(void)
Fence.i Instruction.
@ SOC_INT_MAX
Number of total interrupts.
Access to the machine mode register structure of INTIP, INTIE, INTATTR, INTCTL.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoNum(void)
Get number of maximum interrupt inputs supported.
@ ECLIC_LEVEL_TRIGGER
Level Triggerred, trig[0] = 0.
#define CLIC_CLICINFO_SHD_NUM_Msk
CLIC CLICINFO: SHD_NUM Mask.
__IM uint32_t intctlbits
bit: 21..24 specifies how many hardware bits are actually implemented in the clicintctl registers
__STATIC_INLINE void SInvalICacheLine(unsigned long addr)
Invalidate one I-Cache line specified by address in S-Mode.
#define CLIC_INTATTR_SHV_Msk
CLIC INTATTR: SHV Mask.
@ ECLIC_MAX_TRIGGER
MAX Supported Trigger Mode.
#define __STATIC_INLINE
Define a static function that may be inlined by the compiler.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetShvIRQ(IRQn_Type IRQn)
Get interrupt working mode for a specific interrupt.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetSth(void)
Get supervisor-mode Interrupt Level Threshold in supervisor mode.
__STATIC_FORCEINLINE void __ECLIC_DisableIRQ(IRQn_Type IRQn)
Disable a specific interrupt.
#define CLIC_CLICINFO_SHD_NUM_Pos
CLIC CLICINFO: SHD_NUM Position.
__STATIC_FORCEINLINE void __ECLIC_EnableIRQ(IRQn_Type IRQn)
Enable a specific interrupt.
@ FirstDeviceSpecificInterrupt_IRQn
First Device Specific Interrupt.
@ Reserved16_IRQn
Internal reserved.
@ Reserved9_IRQn
Internal reserved.
__IOM uint8_t INTIP
Offset: 0x000 (R/W) Interrupt set pending register.
__STATIC_FORCEINLINE void __ECLIC_SetTrigIRQ_S(IRQn_Type IRQn, uint32_t trig)
Set trigger mode and polarity for a specific interrupt in supervisor mode.
__IOM uint8_t MTH
Offset: 0x00B(R/W) CLIC machine mode interrupt-level threshold.
#define CLIC_CLICINFO_NUM_Msk
CLIC CLICINFO: NUM_INTERRUPT Mask.
#define __STATIC_FORCEINLINE
Define a static function that should be always inlined by the compiler.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetEnableIRQ(IRQn_Type IRQn)
Get a specific interrupt enable status.
__STATIC_INLINE void MFlushDCacheLine(unsigned long addr)
Flush one D-Cache line specified by address in M-Mode.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetCfgNlbits(void)
Get nlbits value.
@ Reserved15_IRQn
Internal reserved.
#define ECLIC_MAX_NLBITS
Max nlbit of the CLICINTCTLBITS.
@ Reserved2_IRQn
Internal reserved.
#define CLIC_CLICCFG_NLBIT_Pos
CLIC CLICCFG: NLBIT Position.
Union type to access CLICINFO information register.
@ Reserved11_IRQn
Internal reserved.
__IOM uint8_t INTCTRL
Offset: 0x003 (R/W) Interrupt configure register.
#define __RV_CSR_READ(csr)
CSR operation Macro for csrr instruction.
__STATIC_INLINE void __set_nonvec_entry(rv_csr_t addr)
Set Non-vector interrupt entry address.
__STATIC_FORCEINLINE rv_csr_t __get_nmi_entry(void)
Get NMI interrupt entry from 'CSR_MNVEC'.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetEnableIRQ_S(IRQn_Type IRQn)
Get a specific interrupt enable status in supervisor mode.
#define CLIC_INTATTR_TRIG_Msk
CLIC INTATTR: TRIG Mask.
@ Reserved10_IRQn
Internal reserved.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetCtrlIRQ(IRQn_Type IRQn)
Get ECLIC Interrupt Input Control Register value for a specific interrupt.
__STATIC_INLINE void SFlushDCacheLine(unsigned long addr)
Flush one D-Cache line specified by address in S-Mode.
__STATIC_FORCEINLINE void __ECLIC_SetCtrlIRQ_S(IRQn_Type IRQn, uint8_t intctrl)
Modify ECLIC Interrupt Input Control Register for a specific interrupt in supervisor mode.
__STATIC_FORCEINLINE int32_t __ECLIC_GetPendingIRQ(IRQn_Type IRQn)
Get the pending specific interrupt.
__STATIC_FORCEINLINE void __ECLIC_ClearPendingIRQ(IRQn_Type IRQn)
Clear a specific interrupt from pending.
__IOM uint8_t CFG
Offset: 0x000 (R/W) CLIC configuration register.
__STATIC_FORCEINLINE rv_csr_t __get_exc_entry(void)
Get Exception entry address.
#define __RV_CSR_SET(csr, val)
CSR operation Macro for csrs instruction.
__STATIC_FORCEINLINE void __ECLIC_SetSth(uint8_t sth)
Set supervisor-mode Interrupt Level Threshold in supervisor mode.
__IOM uint8_t SSTH
Offset: 0x2009 (R) CLIC supervisor mode threshold register, which is a mirror to mintthresh....
@ Reserved4_IRQn
Internal reserved.
@ Reserved13_IRQn
Internal reserved.
__STATIC_INLINE rv_csr_t __get_nonvec_entry(void)
Get Non-vector interrupt entry address.
__STATIC_INLINE uint8_t __ECLIC_GetLevelIRQ_S(IRQn_Type IRQn)
Get ECLIC Interrupt level of a specific interrupt.
__IM uint32_t version
bit: 13..20 Hardware implementation version number.
@ Reserved1_IRQn
Internal reserved.
@ SysTimerSW_IRQn
System Timer SW interrupt.
__IM uint32_t w
Type used for word access.
__STATIC_FORCEINLINE rv_csr_t __ECLIC_GetVector_S(IRQn_Type IRQn)
Get Interrupt Vector of a specific interrupt in supervisor mode.
__STATIC_FORCEINLINE uint8_t __ECLIC_GetTrigIRQ_S(IRQn_Type IRQn)
Get trigger mode and polarity for a specific interrupt in supervisor mode.
#define CLIC_CLICINFO_VER_Pos
CLIC CLICINFO: VERSION Position.
__STATIC_FORCEINLINE uint32_t __ECLIC_GetInfoCtlbits(void)
Get CLICINTCTLBITS.
__STATIC_FORCEINLINE void __ECLIC_SetModeIRQ(IRQn_Type IRQn, uint32_t mode)
Set privilege mode of a specific interrupt.
#define MECLIC_CTL_SHADOW_EN
#define CLIC_CLICINFO_CTLBIT_Msk
CLIC INTINFO: CLICINTCTLBITS Mask.
@ Reserved12_IRQn
Internal reserved.
__STATIC_FORCEINLINE void __ECLIC_SetPendingIRQ(IRQn_Type IRQn)
Set a specific interrupt to pending.
__IM uint8_t nmbits
bit: 5..6 ties to 1 if supervisor-level interrupt supported, or else it's reserved
unsigned long rv_csr_t
Type of Control and Status Register(CSR), depends on the XLEN defined in RISC-V.
#define CLIC_INTIP_IP_Msk
CLIC INTIP: IP Mask.
__STATIC_FORCEINLINE void __ECLIC_SetCfgNlbits(uint32_t nlbits)
Set nlbits value.
#define CLIC_CLICINFO_NUM_Pos
CLIC CLICINFO: NUM_INTERRUPT Position.
#define CLIC_CLICINFO_VER_Msk
CLIC CLICINFO: VERSION Mask.