Skip to content

Commit dc728b9

Browse files
committed
NMSIS/Core: fix bugs and typos in core headers, update changelog
- Add boundary check in __CTZ for data == 0 to prevent infinite loop - Fix __ECLIC_SetModeIRQ using wrong register (ECLIC->SCTRL to ECLIC->CTRL) - Fix DisableSUCCM SMPCC bitmask clearing logic - Fix ECC_IsTLBSupportECC incorrect PLIC dependency - Fix TLB ECC error check using wrong RAM ID mask (DLM to TLB) - Fix ECC typos (Maintainence, suppported) - Add __ECLIC_VER macro with default value 1 - Fix CSR field comment typos (accesse, privilede, fisrt, nestting) - Fix ssnpm field comment in core_feature_iinfo.h - Improve PLIC memory map documentation and fix PLIC_SetThreshold macro - Fix indentation of #include in nmsis_core.h - Update changelog.rst with new V1.6.0 Core entries
1 parent a5444d7 commit dc728b9

9 files changed

Lines changed: 114 additions & 41 deletions

File tree

NMSIS/Core/Include/core_compatiable.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ __STATIC_INLINE unsigned long __CTZ(unsigned long data)
258258
{
259259
unsigned long ret = 0;
260260

261+
if (data == 0) {
262+
return __RISCV_XLEN;
263+
}
264+
261265
while (!(data & 1UL)) {
262266
ret++;
263267
data = data >> 1;

NMSIS/Core/Include/core_feature_base.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,11 @@ typedef union {
117117
rv_csr_t mie:1; /*!< bit: 3 machine mode interrupt enable flag */
118118
rv_csr_t _reserved2:1; /*!< bit: 4 Reserved */
119119
rv_csr_t spie:1; /*!< bit: 5 supervisor mode interrupt enable flag */
120-
rv_csr_t ube:1; /*!< bit: 6 U-mode non-instruction-fetch memory accesse big-endian enable flag */
120+
rv_csr_t ube:1; /*!< bit: 6 U-mode non-instruction-fetch memory access big-endian enable flag */
121121
rv_csr_t mpie:1; /*!< bit: 7 machine mode previous interrupt enable flag */
122-
rv_csr_t spp:1; /*!< bit: 8 supervisor previous privilede mode */
122+
rv_csr_t spp:1; /*!< bit: 8 supervisor previous privilege mode */
123123
rv_csr_t vs:2; /*!< bit: 9..10 vector status flag */
124-
rv_csr_t mpp:2; /*!< bit: 11..12 machine previous privilede mode */
124+
rv_csr_t mpp:2; /*!< bit: 11..12 machine previous privilege mode */
125125
rv_csr_t fs:2; /*!< bit: 13..14 FS status flag */
126126
rv_csr_t xs:2; /*!< bit: 15..16 XS status flag */
127127
rv_csr_t mprv:1; /*!< bit: 17 Modify PRiVilege */
@@ -136,8 +136,8 @@ typedef union {
136136
rv_csr_t _reserved3:7; /*!< bit: 25..31 Reserved */
137137
rv_csr_t uxl:2; /*!< bit: 32..33 U-mode XLEN */
138138
rv_csr_t sxl:2; /*!< bit: 34..35 S-mode XLEN */
139-
rv_csr_t sbe:1; /*!< bit: 36 S-mode non-instruction-fetch memory accesse big-endian enable flag */
140-
rv_csr_t mbe:1; /*!< bit: 37 M-mode non-instruction-fetch memory accesse big-endian enable flag */
139+
rv_csr_t sbe:1; /*!< bit: 36 S-mode non-instruction-fetch memory access big-endian enable flag */
140+
rv_csr_t mbe:1; /*!< bit: 37 M-mode non-instruction-fetch memory access big-endian enable flag */
141141
rv_csr_t gva:1; /*!< bit: 38 Guest Virtual Address */
142142
rv_csr_t mpv:1; /*!< bit: 39 Machine Previous Virtualization Mode */
143143
rv_csr_t _reserved4:1; /*!< bit: 40 Reserved */
@@ -160,8 +160,8 @@ typedef union {
160160
typedef union {
161161
struct {
162162
rv_csr_t _reserved0:4; /*!< bit: 0..3 Reserved */
163-
rv_csr_t sbe:1; /*!< bit: 4 S-mode non-instruction-fetch memory accesse big-endian enable flag */
164-
rv_csr_t mbe:1; /*!< bit: 5 M-mode non-instruction-fetch memory accesse big-endian enable flag */
163+
rv_csr_t sbe:1; /*!< bit: 4 S-mode non-instruction-fetch memory access big-endian enable flag */
164+
rv_csr_t mbe:1; /*!< bit: 5 M-mode non-instruction-fetch memory access big-endian enable flag */
165165
rv_csr_t gva:1; /*!< bit: 6 Guest Virtual Address */
166166
rv_csr_t mpv:1; /*!< bit: 7 Machine Previous Virtualization Mode */
167167
rv_csr_t _reserved1:1; /*!< bit: 8 Reserved */
@@ -337,14 +337,14 @@ typedef CSR_MCACHECTL_Type CSR_MCACHE_CTL_Type;
337337
*/
338338
typedef union {
339339
struct {
340-
rv_csr_t mpie1:1; /*!< bit: 0 interrupt enable flag of fisrt level NMI/exception nestting */
341-
rv_csr_t mpp1:2; /*!< bit: 1..2 privilede mode of fisrt level NMI/exception nestting */
340+
rv_csr_t mpie1:1; /*!< bit: 0 interrupt enable flag of first level NMI/exception nesting */
341+
rv_csr_t mpp1:2; /*!< bit: 1..2 privilede mode of first level NMI/exception nesting */
342342
rv_csr_t _reserved0:3; /*!< bit: 3..5 Reserved */
343-
rv_csr_t ptyp1:2; /*!< bit: 6..7 NMI/exception type of before first nestting */
344-
rv_csr_t mpie2:1; /*!< bit: 8 interrupt enable flag of second level NMI/exception nestting */
345-
rv_csr_t mpp2:2; /*!< bit: 9..10 privilede mode of second level NMI/exception nestting */
343+
rv_csr_t ptyp1:2; /*!< bit: 6..7 NMI/exception type of before first nesting */
344+
rv_csr_t mpie2:1; /*!< bit: 8 interrupt enable flag of second level NMI/exception nesting */
345+
rv_csr_t mpp2:2; /*!< bit: 9..10 privilede mode of second level NMI/exception nesting */
346346
rv_csr_t _reserved1:3; /*!< bit: 11..13 Reserved */
347-
rv_csr_t ptyp2:2; /*!< bit: 14..15 NMI/exception type of before second nestting */
347+
rv_csr_t ptyp2:2; /*!< bit: 14..15 NMI/exception type of before second nesting */
348348
rv_csr_t _reserved2:__RISCV_XLEN-16; /*!< bit: 16..XLEN-1 Reserved */
349349
} b; /*!< Structure used for bit access */
350350
rv_csr_t w; /*!< Type used for csr data access */

NMSIS/Core/Include/core_feature_cache.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ __STATIC_FORCEINLINE void DisableSUCCM(void)
220220
{
221221
__RV_CSR_CLEAR(CSR_CCM_SUEN, CCM_SUEN_SUEN_Msk);
222222
#if defined(__SMPCC_PRESENT) && (__SMPCC_PRESENT == 1)
223-
SMPCC_CMD->CC_CTRL &= ~_VAL2FLD(SMPCC_CMD_CTRL_SUP_EN, SMPCC_CMD_CTRL_SUP_EN_DISABLE) &
224-
~_VAL2FLD(SMPCC_CMD_CTRL_USE_EN, SMPCC_CMD_CTRL_USE_EN_DISABLE);
223+
SMPCC_CMD->CC_CTRL &= ~(SMPCC_CMD_CTRL_SUP_EN_Msk | SMPCC_CMD_CTRL_USE_EN_Msk); /* Clear SUP_EN and USE_EN bits */
225224
#endif /* #if defined(__SMPCC_PRESENT) && (__SMPCC_PRESENT == 1) */
226225
}
227226

NMSIS/Core/Include/core_feature_ecc.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* 3. __DCACHE_PRESENT: Define whether D-Cache Unit is present or not.
3232
* * 0: Not present
3333
* * 1: Present
34-
* 4. __CCM_PRESENT: Define whether Nuclei Cache Control and Maintainence(CCM) Unit is present or not.
34+
* 4. __CCM_PRESENT: Define whether Nuclei Cache Control and Maintenance(CCM) Unit is present or not.
3535
* * 0: Not present
3636
* * 1: Present
3737
*
@@ -110,18 +110,14 @@ __STATIC_FORCEINLINE int32_t ECC_IsDCacheSupportECC(void)
110110
/**
111111
* \brief Check if TLB supports ECC
112112
* \details
113-
* This function checks if both PLIC and TLB ECC are supported in the core.
114-
* Note: TLB is only present with MMU, and when PLIC is present, MMU will be present.
113+
* This function checks if TLB ECC is supported in the core.
115114
* \return 1 if TLB supports ECC, 0 otherwise
116115
*/
117116
__STATIC_FORCEINLINE int32_t ECC_IsTLBSupportECC(void)
118117
{
119-
CSR_MCFGINFO_Type mcfginfo;
120118
CSR_MTLBCFGINFO_Type mtlbcfginfo;
121-
mcfginfo.d = __RV_CSR_READ(CSR_MCFG_INFO);
122119
mtlbcfginfo.d = __RV_CSR_READ(CSR_MTLBCFG_INFO);
123-
/* TLB only present with MMU, when PLIC present MMU will present */
124-
return mcfginfo.b.plic && mtlbcfginfo.b.ecc;
120+
return mtlbcfginfo.b.ecc;
125121
}
126122

127123
/**
@@ -157,7 +153,7 @@ __STATIC_FORCEINLINE int32_t ECC_IsDLMSupportECC(void)
157153
/**
158154
* \brief Check if XOR error injection mode is supported
159155
* \details
160-
* This function reads the machine ECC code CSR and checks if error injection mode is suppported.
156+
* This function reads the machine ECC code CSR and checks if error injection mode is supported.
161157
* \return 1 if XOR error injection mode is enabled, 0 otherwise
162158
*/
163159
__STATIC_FORCEINLINE int32_t ECC_IsXorErrorInjectMode(void)
@@ -707,7 +703,7 @@ __STATIC_FORCEINLINE int32_t ECC_IsTLBSingleBitErrorOccured(void)
707703
{
708704
CSR_MECC_CODE_Type mecc_code;
709705
mecc_code.d = __RV_CSR_READ(CSR_MECC_CODE);
710-
return mecc_code.b.sramid & ECC_ERROR_RAMID_MASK_DLM;
706+
return mecc_code.b.sramid & ECC_ERROR_RAMID_MASK_TLB;
711707
}
712708

713709
/**
@@ -851,7 +847,7 @@ __STATIC_FORCEINLINE int32_t ECC_IsTLBDoubleBitErrorOccured(void)
851847
{
852848
CSR_MECC_CODE_Type mecc_code;
853849
mecc_code.d = __RV_CSR_READ(CSR_MECC_CODE);
854-
return mecc_code.b.ramid & ECC_ERROR_RAMID_MASK_DLM;
850+
return mecc_code.b.ramid & ECC_ERROR_RAMID_MASK_TLB;
855851
}
856852

857853
/**

NMSIS/Core/Include/core_feature_eclic.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
* 5. __SMODE_PRESENT: Define whether S-Mode present, if present, ECLIC will present with S-Mode ECLIC feature
3434
* * 0: Not present
3535
* * 1: Present
36+
* 6. __ECLIC_VER: Optional, define the ECLIC version, if not defined, defaults to 1
37+
* * 1: ECLICv1 (default)
38+
* * 2: ECLICv2 (supports hardware context saving and shadow registers)
3639
*
3740
*/
3841
#ifdef __cplusplus
@@ -174,6 +177,11 @@ typedef enum ECLIC_TRIGGER {
174177
#define __ECLIC_INTCTLBITS (__ECLIC_GetInfoCtlbits())
175178
#endif
176179

180+
#ifndef __ECLIC_VER
181+
/* Define __ECLIC_VER to 1 if not defined, assume ECLICv1 by default */
182+
#define __ECLIC_VER 1U
183+
#endif
184+
177185
/* ECLIC Memory mapping of Device */
178186
#define ECLIC_BASE __ECLIC_BASEADDR /*!< ECLIC Base Address */
179187
#define ECLIC ((CLIC_Type *) ECLIC_BASE) /*!< CLIC configuration struct */

NMSIS/Core/Include/core_feature_iinfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ typedef union {
121121
__IM uint32_t smcdeleg:1; /*!< bit: 9 support Smcdeleg extension */
122122
__IM uint32_t smmpm:1; /*!< bit: 10 support Smmpm extension */
123123
__IM uint32_t smnpm:1; /*!< bit: 11 support Smnpm extension */
124-
__IM uint32_t ssnpm:1; /*!< bit: 12 support Smnpm extension */
124+
__IM uint32_t ssnpm:1; /*!< bit: 12 support Ssnpm extension */
125125
__IM uint32_t smstateen:1; /*!< bit: 13 support Smstateen extension */
126126
__IM uint32_t sstateen:1; /*!< bit: 14 support Sstateen extension */
127127
__IM uint32_t smcsrind:1; /*!< bit: 15 support Smcsrind extension */

NMSIS/Core/Include/core_feature_plic.h

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,72 @@
4545
* @{
4646
*/
4747

48-
/* 32 bits per source */
48+
/*
49+
* PLIC Memory Map (per RISC-V PLIC spec):
50+
*
51+
* Interrupt Source Priority (per-source, not per-context):
52+
* base + 0x000000: Source 0 (reserved, not exist)
53+
* base + 0x000004: Source 1 priority
54+
* ...
55+
* base + 0x000FFC: Source 1023 priority
56+
* addr = base + source * 4
57+
*
58+
* Interrupt Pending Bits (per-source, not per-context):
59+
* base + 0x001000: Source 0-31 pending
60+
* base + 0x001004: Source 32-63 pending
61+
* ...
62+
* addr = base + 0x1000 + (source / 32) * 4
63+
*
64+
* Interrupt Enable Bits (per-context, 0x80 bytes each):
65+
* base + 0x002000: Context 0, Source 0-31 enable
66+
* base + 0x002080: Context 1, Source 0-31 enable
67+
* ...
68+
* addr = base + 0x2000 + ctxid * 0x80 + (source / 32) * 4
69+
*
70+
* Priority Threshold (per-context, 0x1000 bytes each):
71+
* base + 0x200000: Context 0 threshold
72+
* base + 0x201000: Context 1 threshold
73+
* ...
74+
* addr = base + 0x200000 + ctxid * 0x1000
75+
*
76+
* Claim / Complete (per-context, same 4K block as threshold):
77+
* base + 0x200004: Context 0 claim/complete
78+
* base + 0x201004: Context 1 claim/complete
79+
* ...
80+
* addr = base + 0x200004 + ctxid * 0x1000
81+
* Claim: read returns highest-priority pending interrupt ID
82+
* Complete: write interrupt ID to signal handler completion
83+
*
84+
* Context ID to Hart/Mode mapping (Nuclei RISC-V CPU, not in PLIC spec):
85+
* M-mode context ID = hartid * 2 (even: 0, 2, 4, 6, 8)
86+
* S-mode context ID = hartid * 2 + 1 (odd: 1, 3, 5, 7, 9)
87+
*
88+
* Hart 0: M=ctxid 0, S=ctxid 1
89+
* Hart 1: M=ctxid 2, S=ctxid 3
90+
* Hart 2: M=ctxid 4, S=ctxid 5
91+
* Hart 3: M=ctxid 6, S=ctxid 7
92+
* Hart 4: M=ctxid 8, S=ctxid 9
93+
*
94+
* Reference: https://github.com/riscv/riscv-plic-spec
95+
*/
96+
97+
/* Priority: 32 bits per source, addr = base + source * 4 */
4998
#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) /*!< PLIC Priority register offset */
50-
#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 /*!< PLIC Priority register offset shift per source */
51-
/* 1 bit per source (1 address) */
99+
#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 /*!< log2(4), shift per source */
100+
101+
/* Pending: 1 bit per source, packed 32 per 32-bit register */
52102
#define PLIC_PENDING_OFFSET _AC(0x1000,UL) /*!< PLIC Pending register offset */
53-
#define PLIC_PENDING_SHIFT_PER_SOURCE 0 /*!< PLIC Pending register offset shift per source */
103+
#define PLIC_PENDING_SHIFT_PER_SOURCE 0 /*!< bit index within word */
54104

55-
/* 0x80 per context */
105+
/* Enable: 0x80 (128) bytes per context, packed 32 sources per 32-bit word */
56106
#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) /*!< PLIC Enable register offset */
57-
#define PLIC_ENABLE_SHIFT_PER_CONTEXT 7 /*!< PLIC Enable register offset shift per context */
107+
#define PLIC_ENABLE_SHIFT_PER_CONTEXT 7 /*!< log2(0x80), shift per context */
58108

109+
/* Threshold: 0x1000 (4096) bytes per context */
59110
#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) /*!< PLIC Threshold register offset */
60-
#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) /*!< PLIC Claim register offset */
61-
#define PLIC_THRESHOLD_SHIFT_PER_CONTEXT 12 /*!< PLIC Threshold register offset shift per context */
62-
#define PLIC_CLAIM_SHIFT_PER_CONTEXT 12 /*!< PLIC Claim register offset shift per context */
111+
#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) /*!< PLIC Claim/Complete register offset */
112+
#define PLIC_THRESHOLD_SHIFT_PER_CONTEXT 12 /*!< log2(0x1000), shift per context */
113+
#define PLIC_CLAIM_SHIFT_PER_CONTEXT 12 /*!< log2(0x1000), shift per context */
63114

64115
#ifndef __PLIC_BASEADDR
65116
/* Base address of PLIC(__PLIC_BASEADDR) should be defined in <Device.h> */
@@ -84,8 +135,14 @@
84135
#define PLIC_GetHartID_S() (__PLIC_HARTID)
85136
#endif
86137

138+
/*
139+
* Context ID mapping (Nuclei RISC-V CPU convention):
140+
* M-mode: ctxid = hartid * 2 (even: 0, 2, 4, 6, 8)
141+
* S-mode: ctxid = hartid * 2 + 1 (odd: 1, 3, 5, 7, 9)
142+
* This is NOT part of the RISC-V PLIC spec.
143+
*/
87144
#define PLIC_GetHartMContextID() (PLIC_GetHartID() << 1)
88-
// TODO SMODE HARTID need to handle, maybe use a predefined variable of hartid
145+
// TODO SMODE HARTID need to handle, maybe use CSR shartid defined by Nuclei RISC-V CPU
89146
#define PLIC_GetHartSContextID() ((PLIC_GetHartID_S() << 1) + 1)
90147

91148
#define PLIC_PRIORITY_REGADDR(source) ((PLIC_BASE) + (PLIC_PRIORITY_OFFSET) + ((source) << PLIC_PRIORITY_SHIFT_PER_SOURCE))
@@ -317,8 +374,7 @@ __STATIC_FORCEINLINE uint32_t PLIC_ClaimContextInterrupt(uint32_t ctxid)
317374
* \details
318375
* This function complete interrupt for plic for selected context.
319376
* \param [in] ctxid selected context id
320-
* \return the ID of the highest priority pending interrupt or
321-
* zero if there is no pending interrupt
377+
* \param [in] source interrupt source ID to complete
322378
* \remarks
323379
* The PLIC signals it has completed executing an interrupt handler by writing
324380
* the interrupt ID it received from the claim to the claim/complete register.
@@ -380,8 +436,8 @@ __STATIC_INLINE void PLIC_Context_Init(uint32_t ctxid, uint32_t num_sources, uin
380436
#define PLIC_DisableInterrupt(source) PLIC_DisableContextInterrupt(PLIC_GetHartMContextID(), (source))
381437
#define PLIC_DisableInterrupt_S(source) PLIC_DisableContextInterrupt(PLIC_GetHartSContextID(), (source))
382438

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))
439+
#define PLIC_SetThreshold(thresh) PLIC_SetContextThreshold(PLIC_GetHartMContextID(), (thresh))
440+
#define PLIC_SetThreshold_S(thresh) PLIC_SetContextThreshold(PLIC_GetHartSContextID(), (thresh))
385441

386442
#define PLIC_GetThreshold() PLIC_GetContextThreshold(PLIC_GetHartMContextID())
387443
#define PLIC_GetThreshold_S() PLIC_GetContextThreshold(PLIC_GetHartSContextID())

NMSIS/Core/Include/nmsis_core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
/* Include core pmp feature header file */
8989
#include "core_feature_pmp.h"
9090
/* Include core spmp feature header file */
91-
#include "core_feature_spmp.h"
91+
#include "core_feature_spmp.h"
9292
/* Include core cache feature header file */
9393
#include "core_feature_cache.h"
9494
/* Include core cidu feature header file */

NMSIS/doc/source/changelog.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ This is the version of ``V1.6.0`` release.
3939
- Add precise ECC injection support in ``core_feature_iinfo.h``: new ``IINFO_ECC_INJ_WAY_Type`` union, ``IINFO_IsPreciseECCInjSupported()`` and ``IINFO_SetPreciseECCInjWay()`` APIs
4040
- Extend ``core_feature_smpcc.h`` with new SMPCC register types (``CC_INV_RANGE_Type``, ``CC_ECC_INJ_WAY_Type``, ``CC_ECC_INJ_ADDR_Type``, ``CC_ECC_INJ_DATA_Type``, ``IOCP_ATTR_RMP_Type``), new ``SMPCC_ClearBusErrPending()`` API, and update ``SMPCC_CCacheTramErrInject()`` / ``SMPCC_CCacheDramErrInject()`` to support precise ECC injection with an additional ``way`` parameter
4141
- Fix instruction descriptions in ``core_feature_dsp.h``
42+
- Add boundary check in ``__CTZ`` in ``core_compatiable.h`` to return ``__RISCV_XLEN`` when input is 0, preventing an infinite loop
43+
- Fix typos in CSR field comments in ``core_feature_base.h``: ``accesse`` to ``access``, ``privilede`` to ``privilege``, ``fisrt`` to ``first``, ``nestting`` to ``nesting``
44+
- Fix ``DisableSUCCM`` in ``core_feature_cache.h`` to use direct bitmask clearing (``SMPCC_CMD_CTRL_SUP_EN_Msk | SMPCC_CMD_CTRL_USE_EN_Msk``) instead of incorrect ``_VAL2FLD`` approach
45+
- Fix ``ECC_IsTLBSupportECC`` in ``core_feature_ecc.h`` to remove incorrect PLIC dependency, now directly checks ``mtlbcfginfo.b.ecc``
46+
- Fix ``ECC_IsTLBSingleBitErrorOccured`` and ``ECC_IsTLBDoubleBitErrorOccured`` in ``core_feature_ecc.h`` to use ``ECC_ERROR_RAMID_MASK_TLB`` instead of ``ECC_ERROR_RAMID_MASK_DLM``
47+
- Fix typos in ``core_feature_ecc.h``: ``Maintainence`` to ``Maintenance``, ``suppported`` to ``supported``
48+
- Add ``__ECLIC_VER`` macro in ``core_feature_eclic.h`` with default value of 1 for ECLIC version identification
49+
- Fix ``ssnpm`` field comment in ``core_feature_iinfo.h`` to correctly reference ``Ssnpm`` extension instead of ``Smnpm``
50+
- Improve PLIC memory map documentation and fix ``PLIC_SetThreshold`` macro signature (removed incorrect ``source`` parameter) and ``PLIC_CompleteContextInterrupt`` parameter description in ``core_feature_plic.h``
51+
- Fix indentation of ``#include "core_feature_spmp.h"`` in ``nmsis_core.h``
4252

4353
* **NMSIS-DSP**
4454

0 commit comments

Comments
 (0)