8 #ifndef _HPM_L1_CACHE_H
9 #define _HPM_L1_CACHE_H
22 #define HPM_L1C_CACHE_SIZE (uint32_t)(16 * SIZE_1KB)
23 #define HPM_L1C_ICACHE_SIZE (HPM_L1C_CACHE_SIZE)
24 #define HPM_L1C_DCACHE_SIZE (HPM_L1C_CACHE_SIZE)
26 #define HPM_L1C_CACHELINE_SIZE (32)
28 #define HPM_L1C_CACHELINES_PER_WAY (128)
37 #define HPM_MCACHE_CTL_IC_EN_SHIFT (0UL)
38 #define HPM_MCACHE_CTL_IC_EN_MASK (1UL << HPM_MCACHE_CTL_IC_EN_SHIFT)
39 #define HPM_MCACHE_CTL_IC_EN(x) \
40 (uint32_t)(((x) << HPM_MCACHE_CTL_IC_EN_SHIFT) & HPM_MCACHE_CTL_IC_EN_MASK)
48 #define HPM_MCACHE_CTL_DC_EN_SHIFT (1UL)
49 #define HPM_MCACHE_CTL_DC_EN_MASK (1UL << HPM_MCACHE_CTL_DC_EN_SHIFT)
50 #define HPM_MCACHE_CTL_DC_EN(x) \
51 (uint32_t)(((x) << HPM_MCACHE_CTL_DC_EN_SHIFT) & HPM_MCACHE_CTL_DC_EN_MASK)
61 #define HPM_MCACHE_CTL_IC_ECCEN_SHIFT (0x2UL)
62 #define HPM_MCACHE_CTL_IC_ECCEN_MASK (0x3UL << HPM_MCACHE_CTL_IC_ECCEN_SHIFT)
63 #define HPM_MCACHE_CTL_IC_ECCEN(x) \
64 (uint32_t)(((x) << HPM_MCACHE_CTL_IC_ECCEN_SHIFT) & HPM_MCACHE_CTL_IC_ECCEN_MASK)
75 #define HPM_MCACHE_CTL_DC_ECCEN_SHIFT (0x4UL)
76 #define HPM_MCACHE_CTL_DC_ECCEN_MASK (0x3UL << HPM_MCACHE_CTL_DC_ECCEN_SHIFT)
77 #define HPM_MCACHE_CTL_DC_ECCEN(x) \
78 (uint32_t)(((x) << HPM_MCACHE_CTL_DC_ECCEN_SHIFT) & HPM_MCACHE_CTL_DC_ECCEN_MASK)
89 #define HPM_MCACHE_CTL_IC_RWECC_SHIFT (0x6UL)
90 #define HPM_MCACHE_CTL_IC_RWECC_MASK (0x1UL << HPM_MCACHE_CTL_IC_RWECC_SHIFT)
91 #define HPM_MCACHE_CTL_IC_RWECC(x) \
92 (uint32_t)(((x) << HPM_MCACHE_CTL_IC_RWECC_SHIFT) & HPM_MCACHE_CTL_IC_RWECC_MASK)
104 #define HPM_MCACHE_CTL_DC_RWECC_SHIFT (0x7UL)
105 #define HPM_MCACHE_CTL_DC_RWECC_MASK (0x1UL << HPM_MCACHE_CTL_DC_RWECC_SHIFT)
106 #define HPM_MCACHE_CTL_DC_RWECC(x) \
107 (uint32_t)(((x) << HPM_MCACHE_CTL_DC_RWECC_SHIFT) & HPM_MCACHE_CTL_DC_RWECC_MASK)
116 #define HPM_MCACHE_CTL_CCTL_SUEN_SHIFT (0x8UL)
117 #define HPM_MCACHE_CTL_CCTL_SUEN_MASK (0x1UL << HPM_MCACHE_CTL_CCTL_SUEN_SHIFT)
118 #define HPM_MCACHE_CTL_CCTL_SUEN(x) \
119 (uint32_t)(((x) << HPM_MCACHE_CTL_CCTL_SUEN_SHIFT) & HPM_MCACHE_CTL_CCTL_SUEN_MASK)
128 #define HPM_MCACHE_CTL_IPREF_EN_SHIFT (0x9UL)
129 #define HPM_MCACHE_CTL_IPREF_EN_MASK (0x1UL << HPM_MCACHE_CTL_IPREF_EN_SHIFT)
130 #define HPM_MCACHE_CTL_IPREF_EN(x) \
131 (uint32_t)(((x) << HPM_MCACHE_CTL_IPREF_EN_SHIFT) & HPM_MCACHE_CTL_IPREF_EN_MASK)
140 #define HPM_MCACHE_CTL_DPREF_EN_SHIFT (0x10UL)
141 #define HPM_MCACHE_CTL_DPREF_EN_MASK (0x1UL << HPM_MCACHE_CTL_DPREF_EN_SHIFT)
142 #define HPM_MCACHE_CTL_DPREF_EN(x) \
143 (uint32_t)(((x) << HPM_MCACHE_CTL_DPREF_EN_SHIFT) & HPM_MCACHE_CTL_DPREF_EN_MASK)
151 #define HPM_MCACHE_CTL_IC_FIRST_WORD_SHIFT (0x11UL)
152 #define HPM_MCACHE_CTL_IC_FIRST_WORD_MASK (0x1UL << HPM_MCACHE_CTL_IC_FIRST_WORD_SHIFT)
153 #define HPM_MCACHE_CTL_IC_FIRST_WORD(x) \
154 (uint32_t)(((x) << HPM_MCACHE_CTL_IC_FIRST_WORD_SHIFT) & HPM_MCACHE_CTL_IC_FIRST_WORD_MASK)
162 #define HPM_MCACHE_CTL_DC_FIRST_WORD_SHIFT (0x12UL)
163 #define HPM_MCACHE_CTL_DC_FIRST_WORD_MASK (0x1UL << HPM_MCACHE_CTL_DC_FIRST_WORD_SHIFT)
164 #define HPM_MCACHE_CTL_DC_FIRST_WORD(x) \
165 (uint32_t)(((x) << HPM_MCACHE_CTL_DC_FIRST_WORD_SHIFT) & HPM_MCACHE_CTL_DC_FIRST_WORD_MASK)
179 #define HPM_MCACHE_CTL_DC_WAROUND_SHIFT (0x13UL)
180 #define HPM_MCACHE_CTL_DC_WAROUND_MASK (0x3UL << HPM_MCACHE_CTL_DC_WAROUND_SHIFT)
181 #define HPM_MCACHE_CTL_DC_WAROUND(x) \
182 (uint32_t)(((x) << HPM_MCACHE_CTL_DC_WAROUND_SHIFT) & HPM_MCACHE_CTL_DC_WAROUND_MASK)
185 #define HPM_L1C_CCTL_CMD_L1D_VA_INVAL (0UL)
186 #define HPM_L1C_CCTL_CMD_L1D_VA_WB (1UL)
187 #define HPM_L1C_CCTL_CMD_L1D_VA_WBINVAL (2UL)
188 #define HPM_L1C_CCTL_CMD_L1D_VA_LOCK (3UL)
189 #define HPM_L1C_CCTL_CMD_L1D_VA_UNLOCK (4UL)
190 #define HPM_L1C_CCTL_CMD_L1D_WBINVAL_ALL (6UL)
191 #define HPM_L1C_CCTL_CMD_L1D_WB_ALL (7UL)
193 #define HPM_L1C_CCTL_CMD_L1I_VA_INVAL (8UL)
194 #define HPM_L1C_CCTL_CMD_L1I_VA_LOCK (11UL)
195 #define HPM_L1C_CCTL_CMD_L1I_VA_UNLOCK (12UL)
197 #define HPM_L1C_CCTL_CMD_L1D_IX_INVAL (16UL)
198 #define HPM_L1C_CCTL_CMD_L1D_IX_WB (17UL)
199 #define HPM_L1C_CCTL_CMD_L1D_IX_WBINVAL (18UL)
201 #define HPM_L1C_CCTL_CMD_L1D_IX_RTAG (19UL)
202 #define HPM_L1C_CCTL_CMD_L1D_IX_RDATA (20UL)
203 #define HPM_L1C_CCTL_CMD_L1D_IX_WTAG (21UL)
204 #define HPM_L1C_CCTL_CMD_L1D_IX_WDATA (22UL)
206 #define HPM_L1C_CCTL_CMD_L1D_INVAL_ALL (23UL)
208 #define HPM_L1C_CCTL_CMD_L1I_IX_INVAL (24UL)
209 #define HPM_L1C_CCTL_CMD_L1I_IX_RTAG (27UL)
210 #define HPM_L1C_CCTL_CMD_L1I_IX_RDATA (28UL)
211 #define HPM_L1C_CCTL_CMD_L1I_IX_WTAG (29UL)
212 #define HPM_L1C_CCTL_CMD_L1I_IX_WDATA (30UL)
214 #define HPM_L1C_CCTL_CMD_SUCCESS (1UL)
215 #define HPM_L1C_CCTL_CMD_FAIL (0UL)
221 __attribute__((always_inline))
static inline uint32_t l1c_get_control(
void)
226 __attribute__((always_inline))
static inline bool l1c_dc_is_enabled(
void)
231 __attribute__((always_inline))
static inline bool l1c_ic_is_enabled(
void)
237 #define HPM_MCCTLBEGINADDR_OFFSET_SHIFT (2UL)
238 #define HPM_MCCTLBEGINADDR_OFFSET_MASK ((uint32_t) 0xF << HPM_MCCTLBEGINADDR_OFFSET_SHIFT)
239 #define HPM_MCCTLBEGINADDR_OFFSET(x) \
240 (uint32_t)(((x) << HPM_MCCTLBEGINADDR_OFFSET_SHIFT) & HPM_MCCTLBEGINADDR_OFFSET_MASK)
241 #define HPM_MCCTLBEGINADDR_INDEX_SHIFT (6UL)
242 #define HPM_MCCTLBEGINADDR_INDEX_MASK ((uint32_t) 0x3F << HPM_MCCTLBEGINADDR_INDEX_SHIFT)
243 #define HPM_MCCTLBEGINADDR_INDEX(x) \
244 (uint32_t)(((x) << HPM_MCCTLBEGINADDR_INDEX_SHIFT) & HPM_MCCTLBEGINADDR_INDEX_MASK)
245 #define HPM_MCCTLBEGINADDR_WAY_SHIFT (13UL)
246 #define HPM_MCCTLBEGINADDR_WAY_MASK ((uint32_t) 0x3 << HPM_MCCTLBEGINADDR_WAY_SHIFT)
247 #define HPM_MCCTLBEGINADDR_WAY(x) \
248 (uint32_t)(((x) << HPM_MCCTLBEGINADDR_WAY_SHIFT) & HPM_MCCTLBEGINADDR_WAY_MASK)
251 __attribute__((always_inline))
static inline void l1c_cctl_address(uint32_t
address)
257 __attribute__((always_inline))
static inline void l1c_cctl_cmd(uint8_t cmd)
262 __attribute__((always_inline))
static inline uint32_t l1c_cctl_get_address(
void)
268 __attribute__((always_inline))
static inline
269 void l1c_cctl_address_cmd(uint8_t cmd, uint32_t
address)
275 #define HPM_MCCTLDATA_I_TAG_ADDRESS_SHIFT (2UL)
276 #define HPM_MCCTLDATA_I_TAG_ADDRESS_MASK (uint32_t)(0XFFFFF << HPM_MCCTLDATA_I_TAG_ADDRESS_SHIFT)
277 #define HPM_MCCTLDATA_I_TAG_ADDRESS(x) \
278 (uint32_t)(((x) << HPM_MCCTLDATA_I_TAG_ADDRESS_SHIFT) & HPM_MCCTLDATA_I_TAG_ADDRESS_MASK)
280 #define HPM_MCCTLDATA_I_TAG_LOCK_DUP_SHIFT (29UL)
281 #define HPM_MCCTLDATA_I_TAG_LOCK_DUP_MASK (uint32_t)(1 << HPM_MCCTLDATA_I_TAG_LOCK_DUP_SHIFT)
282 #define HPM_MCCTLDATA_I_TAG_LOCK_DUP(x) \
283 (uint32_t)(((x) << HPM_MCCTLDATA_I_TAG_LOCK_DUP_SHIFT) & HPM_MCCTLDATA_I_TAG_LOCK_DUP_MASK)
285 #define HPM_MCCTLDATA_I_TAG_LOCK_SHIFT (30UL)
286 #define HPM_MCCTLDATA_I_TAG_LOCK_MASK (uint32_t)(1 << HPM_MCCTLDATA_I_TAG_LOCK_SHIFT)
287 #define HPM_MCCTLDATA_I_TAG_LOCK(x) \
288 (uint32_t)(((x) << HPM_MCCTLDATA_I_TAG_LOCK_SHIFT) & HPM_MCCTLDATA_I_TAG_LOCK_MASK)
290 #define HPM_MCCTLDATA_I_TAG_VALID_SHIFT (31UL)
291 #define HPM_MCCTLDATA_I_TAG_VALID_MASK (uint32_t)(1 << HPM_MCCTLDATA_I_TAG_VALID_SHIFT)
292 #define HPM_MCCTLDATA_I_TAG_VALID(x) \
293 (uint32_t)(((x) << HPM_MCCTLDATA_I_TAG_VALID_SHIFT) & HPM_MCCTLDATA_I_TAG_VALID_MASK)
295 #define HPM_MCCTLDATA_D_TAG_MESI_SHIFT (0UL)
296 #define HPM_MCCTLDATA_D_TAG_MESI_MASK (uint32_t)(0x3 << HPM_MCCTLDATA_D_TAG_MESI_SHIFT)
297 #define HPM_MCCTLDATA_D_TAG_MESI(x) \
298 (uint32_t)(((x) << HPM_MCCTLDATA_D_TAG_MESI_SHIFT) & HPM_MCCTLDATA_D_TAG_MESI_MASK)
300 #define HPM_MCCTLDATA_D_TAG_LOCK_SHIFT (3UL)
301 #define HPM_MCCTLDATA_D_TAG_LOCK_MASK (uint32_t)(0x1 << HPM_MCCTLDATA_D_TAG_LOCK_SHIFT)
302 #define HPM_MCCTLDATA_D_TAG_LOCK(x) \
303 (uint32_t)(((x) << HPM_MCCTLDATA_D_TAG_LOCK_SHIFT) & HPM_MCCTLDATA_D_TAG_LOCK_MASK)
305 #define HPM_MCCTLDATA_D_TAG_TAG_SHIFT (4UL)
306 #define HPM_MCCTLDATA_D_TAG_TAG_MASK (uint32_t)(0xFFFF << HPM_MCCTLDATA_D_TAG_LOCK_SHIFT)
307 #define HPM_MCCTLDATA_D_TAG_TAG(x) \
308 (uint32_t)(((x) << HPM_MCCTLDATA_D_TAG_TAG_SHIFT) & HPM_MCCTLDATA_D_TAG_TAG_MASK)
319 ATTR_ALWAYS_INLINE
static inline
337 ATTR_ALWAYS_INLINE
static inline
346 #define HPM_L1C_CFG_SET_SHIFT (0UL)
347 #define HPM_L1C_CFG_SET_MASK (uint32_t)(0x7 << HPM_L1C_CFG_SET_SHIFT)
348 #define HPM_L1C_CFG_WAY_SHIFT (3UL)
349 #define HPM_L1C_CFG_WAY_MASK (uint32_t)(0x7 << HPM_L1C_CFG_WAY_SHIFT)
350 #define HPM_L1C_CFG_SIZE_SHIFT (6UL)
351 #define HPM_L1C_CFG_SIZE_MASK (uint32_t)(0x7 << HPM_L1C_CFG_SIZE_SHIFT)
352 #define HPM_L1C_CFG_LOCK_SHIFT (9UL)
353 #define HPM_L1C_CFG_LOCK_MASK (uint32_t)(0x1 << HPM_L1C_CFG_LOCK_SHIFT)
354 #define HPM_L1C_CFG_ECC_SHIFT (10UL)
355 #define HPM_L1C_CFG_ECC_MASK (uint32_t)(0x3 << HPM_L1C_CFG_ECC_SHIFT)
356 #define HPM_L1C_CFG_LMB_SHIFT (12UL)
357 #define HPM_L1C_CFG_LMB_MASK (uint32_t)(0x7 << HPM_L1C_CFG_LMB_SHIFT)
358 #define HPM_L1C_CFG_LM_SIZE_SHIFT (15UL)
359 #define HPM_L1C_CFG_LM_SIZE_MASK (uint32_t)(0x1F << HPM_L1C_CFG_LM_SIZE_SHIFT)
360 #define HPM_L1C_CFG_LM_ECC_SHIFT (21UL)
361 #define HPM_L1C_CFG_LM_ECC_MASK (uint32_t)(0x3 << HPM_L1C_CFG_LM_ECC_SHIFT)
362 #define HPM_L1C_CFG_SETH_SHIFT (24UL)
363 #define HPM_L1C_CFG_SETH_MASK (uint32_t)(0x1 << HPM_L1C_CFG_SETH_SHIFT)
368 #define HPM_L1C_CACHELINE_ALIGN_DOWN(n) ((uint32_t)(n) & ~(HPM_L1C_CACHELINE_SIZE - 1U))
373 #define HPM_L1C_CACHELINE_ALIGN_UP(n) HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)(n) + HPM_L1C_CACHELINE_SIZE - 1U)
#define CSR_MICM_CFG
Definition: hpm_csr_regs.h:121
#define CSR_MCCTLDATA
Definition: hpm_csr_regs.h:106
#define CSR_MCACHE_CTL
Definition: hpm_csr_regs.h:103
#define CSR_MECC_CODE
Definition: hpm_csr_regs.h:95
#define CSR_MCCTLCOMMAND
Definition: hpm_csr_regs.h:105
#define CSR_MDCM_CFG
Definition: hpm_csr_regs.h:122
#define CSR_MCCTLBEGINADDR
Definition: hpm_csr_regs.h:104
void l1c_ic_invalidate(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:125
#define HPM_MCACHE_CTL_IC_EN_MASK
Definition: hpm_l1c_drv.h:38
void l1c_ic_enable(void)
Definition: hpm_l1c_drv.c:65
void l1c_ic_disable(void)
Definition: hpm_l1c_drv.c:74
void l1c_dc_flush_all(void)
Definition: hpm_l1c_drv.c:96
void l1c_dc_enable(void)
Definition: hpm_l1c_drv.c:45
#define HPM_MCACHE_CTL_DC_EN_MASK
Definition: hpm_l1c_drv.h:49
void l1c_ic_fill_lock(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:131
void l1c_dc_disable(void)
Definition: hpm_l1c_drv.c:58
void l1c_dc_writeback_all(void)
Definition: hpm_l1c_drv.c:91
static ATTR_ALWAYS_INLINE uint32_t l1c_ic_get_config(void)
Get I-cache configuration.
Definition: hpm_l1c_drv.h:380
static ATTR_ALWAYS_INLINE uint32_t l1c_dc_get_config(void)
Get D-cache configuration.
Definition: hpm_l1c_drv.h:390
void l1c_dc_flush(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:119
void l1c_dc_invalidate_all(void)
Definition: hpm_l1c_drv.c:86
void l1c_fence_i(void)
Definition: hpm_l1c_drv.c:81
static ATTR_ALWAYS_INLINE void l1c_cctl_address_cmd_write(uint8_t cmd, uint32_t address, uint32_t data, uint32_t ecc_data)
Definition: hpm_l1c_drv.h:338
void l1c_dc_writeback(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:113
uint32_t address
Definition: hpm_l1c_drv.h:270
void l1c_dc_fill_lock(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:101
void l1c_dc_invalidate(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:107
static ATTR_ALWAYS_INLINE uint32_t l1c_cctl_address_cmd_read(uint8_t cmd, uint32_t address, uint32_t *ecc_data)
Definition: hpm_l1c_drv.h:320
static void size
Definition: hpm_math.h:6899
#define read_csr(csr_num)
read value of specific csr
Definition: riscv_core.h:75