HPM SDK
HPMicro Software Development Kit
hpm_l1c_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef _HPM_L1_CACHE_H
9 #define _HPM_L1_CACHE_H
10 #include "hpm_common.h"
11 #include "hpm_csr_drv.h"
12 #include "hpm_soc.h"
13 
21 /* cache size is 32KB */
22 #define HPM_L1C_CACHE_SIZE (uint32_t)(32 * SIZE_1KB)
23 #define HPM_L1C_ICACHE_SIZE (HPM_L1C_CACHE_SIZE)
24 #define HPM_L1C_DCACHE_SIZE (HPM_L1C_CACHE_SIZE)
25 /* cache line size is 64B */
26 #define HPM_L1C_CACHELINE_SIZE (64)
27 /* cache way is 128 */
28 #define HPM_L1C_CACHELINES_PER_WAY (128)
29 
30 /* mcache_ctl register */
31 /*
32  * Controls if the instruction cache is enabled or not.
33  *
34  * 0 I-Cache is disabled
35  * 1 I-Cache is enabled
36  */
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)
41 
42 /*
43  * Controls if the data cache is enabled or not.
44  *
45  * 0 D-Cache is disabled
46  * 1 D-Cache is enabled
47  */
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)
52 
53 /*
54  * Parity/ECC error checking enable control for the instruction cache.
55  *
56  * 0 Disable parity/ECC
57  * 1 Reserved
58  * 2 Generate exceptions only on uncorrectable parity/ECC errors
59  * 3 Generate exceptions on any type of parity/ECC errors
60  */
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)
65 
66 /*
67  *
68  * Parity/ECC error checking enable control for the data cache.
69  *
70  * 0 Disable parity/ECC
71  * 1 Reserved
72  * 2 Generate exceptions only on uncorrectable parity/ECC errors
73  * 3 Generate exceptions on any type of parity/ECC errors
74  */
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)
79 
80 /*
81  *
82  * Controls diagnostic accesses of ECC codes of the instruction cache RAMs.
83  * It is set to enable CCTL operations to access the ECC codes. This bit
84  * can be set for injecting ECC errors to test the ECC handler.
85  *
86  * 0 Disable diagnostic accesses of ECC codes
87  * 1 Enable diagnostic accesses of ECC codes
88  */
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)
93 
94 /*
95  *
96  * Controls diagnostic accesses of ECC codes of the data cache RAMs. It is
97  * set to enable CCTL operations to access the ECC codes. This bit can be
98  * set for injecting
99  *
100  * ECC errors to test the ECC handler.
101  * 0 Disable diagnostic accesses of ECC codes
102  * 1 Enable diagnostic accesses of ECC codes
103  */
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)
108 
109 /*
110  * Enable bit for Superuser-mode and User-mode software to access
111  * ucctlbeginaddr and ucctlcommand CSRs.
112  *
113  * 0 Disable ucctlbeginaddr and ucctlcommand accesses in S/U mode
114  * 1 Enable ucctlbeginaddr and ucctlcommand accesses in S/U mode
115  */
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)
120 
121 /*
122  * This bit controls hardware prefetch for instruction fetches to cacheable
123  * memory regions when I-Cache size is not 0.
124  *
125  * 0 Disable hardware prefetch on instruction fetches
126  * 1 Enable hardware prefetch on instruction fetches
127  */
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)
132 
133 /*
134  * This bit controls hardware prefetch for load/store accesses to cacheable
135  * memory regions when D-Cache size is not 0.
136  *
137  * 0 Disable hardware prefetch on load/store memory accesses.
138  * 1 Enable hardware prefetch on load/store memory accesses.
139  */
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)
144 
145 /*
146  * I-Cache miss allocation filling policy Value Meaning
147  *
148  * 0 Cache line data is returned critical (double) word first
149  * 1 Cache line data is returned the lowest address (double) word first
150  */
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)
155 
156 /*
157  * D-Cache miss allocation filling policy
158  *
159  * 0 Cache line data is returned critical (double) word first
160  * 1 Cache line data is returned the lowest address (double) word first
161  */
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)
166 
167 /*
168  * D-Cache Write-Around threshold
169  *
170  * 0 Disables streaming. All cacheable write misses allocate a cache line
171  * according to PMA settings.
172  * 1 Override PMA setting and do not allocate D-Cache entries after
173  * consecutive stores to 4 cache lines.
174  * 2 Override PMA setting and do not allocate D-Cache entries after
175  * consecutive stores to 64 cache lines.
176  * 3 Override PMA setting and do not allocate D-Cache entries after
177  * consecutive stores to 128 cache lines.
178  */
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)
183 
184 /* CCTL command list */
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)
192 
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)
196 
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)
200 
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)
205 
206 #define HPM_L1C_CCTL_CMD_L1D_INVAL_ALL (23UL)
207 
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)
213 
214 #define HPM_L1C_CCTL_CMD_SUCCESS (1UL)
215 #define HPM_L1C_CCTL_CMD_FAIL (0UL)
216 
217 #ifdef __cplusplus
218 extern "C" {
219 #endif
220 /* get cache control register value */
221 __attribute__((always_inline)) static inline uint32_t l1c_get_control(void)
222 {
223  return read_csr(CSR_MCACHE_CTL);
224 }
225 
226 __attribute__((always_inline)) static inline bool l1c_dc_is_enabled(void)
227 {
228  return l1c_get_control() & HPM_MCACHE_CTL_DC_EN_MASK;
229 }
230 
231 __attribute__((always_inline)) static inline bool l1c_ic_is_enabled(void)
232 {
233  return l1c_get_control() & HPM_MCACHE_CTL_IC_EN_MASK;
234 }
235 
236 /* mcctlbeginaddress register bitfield layout for CCTL IX type command */
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)
249 
250 /* send IX command */
251 __attribute__((always_inline)) static inline void l1c_cctl_address(uint32_t address)
252 {
254 }
255 
256 /* send command */
257 __attribute__((always_inline)) static inline void l1c_cctl_cmd(uint8_t cmd)
258 {
260 }
261 
262 __attribute__((always_inline)) static inline uint32_t l1c_cctl_get_address(void)
263 {
265 }
266 
267 /* send IX command */
268 __attribute__((always_inline)) static inline
269  void l1c_cctl_address_cmd(uint8_t cmd, uint32_t address)
270 {
273 }
274 
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)
279 
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)
284 
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)
289 
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)
294 
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)
299 
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)
304 
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)
309 
310 /*
311  * @brief Cache control command read address
312  *
313  * Send IX read tag/data cmd
314  * @param[in] cmd Command code
315  * @param[in] address Target address
316  * @param[in] ecc_data ECC value
317  * @return data read
318  */
319 ATTR_ALWAYS_INLINE static inline
320  uint32_t l1c_cctl_address_cmd_read(uint8_t cmd, uint32_t address, uint32_t *ecc_data)
321 {
324  *ecc_data = read_csr(CSR_MECC_CODE);
325  return read_csr(CSR_MCCTLDATA);
326 }
327 
328 /*
329  * @brief Cache control command write address
330  *
331  * Send IX write tag/data cmd
332  * @param[in] cmd Command code
333  * @param[in] address Target address
334  * @param[in] data Data to be written
335  * @param[in] ecc_data ECC of data
336  */
337 ATTR_ALWAYS_INLINE static inline
338  void l1c_cctl_address_cmd_write(uint8_t cmd, uint32_t address, uint32_t data, uint32_t ecc_data)
339 {
342  write_csr(CSR_MCCTLDATA, data);
343  write_csr(CSR_MECC_CODE, ecc_data);
344 }
345 
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)
364 
368 #define HPM_L1C_CACHELINE_ALIGN_DOWN(n) ((uint32_t)(n) & ~(HPM_L1C_CACHELINE_SIZE - 1U))
369 
373 #define HPM_L1C_CACHELINE_ALIGN_UP(n) HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)(n) + HPM_L1C_CACHELINE_SIZE - 1U)
374 
380 ATTR_ALWAYS_INLINE static inline uint32_t l1c_ic_get_config(void)
381 {
382  return read_csr(CSR_MICM_CFG);
383 }
384 
390 ATTR_ALWAYS_INLINE static inline uint32_t l1c_dc_get_config(void)
391 {
392  return read_csr(CSR_MDCM_CFG);
393 }
394 
395 /*
396  * @brief D-cache disable
397  */
398 void l1c_dc_disable(void);
399 
400 /*
401  * @brief D-cache enable
402  */
403 void l1c_dc_enable(void);
404 
405 /*
406  * @brief D-cache invalidate by address
407  * @param[in] address Start address to be invalidated
408  * @param[in] size Size of memory to be invalidated
409  */
410 void l1c_dc_invalidate(uint32_t address, uint32_t size);
411 
412 /*
413  * @brief D-cache writeback by address
414  * @param[in] address Start address to be writtenback
415  * @param[in] size Size of memory to be writtenback
416  */
417 void l1c_dc_writeback(uint32_t address, uint32_t size);
418 
419 /*
420  * @brief D-cache invalidate and writeback by address
421  * @param[in] address Start address to be invalidated and writtenback
422  * @param[in] size Size of memory to be invalidted and writtenback
423  */
424 void l1c_dc_flush(uint32_t address, uint32_t size);
425 
426 /*
427  * @brief D-cache fill and lock by address
428  * @param[in] address Start address to be filled and locked
429  * @param[in] size Size of memory to be filled and locked
430  */
431 void l1c_dc_fill_lock(uint32_t address, uint32_t size);
432 
433 /*
434  * @brief I-cache disable
435  */
436 void l1c_ic_disable(void);
437 
438 /*
439  * @brief I-cache enable
440  */
441 void l1c_ic_enable(void);
442 
443 /*
444  * @brief I-cache invalidate by address
445  * @param[in] address Start address to be invalidated
446  * @param[in] size Size of memory to be invalidated
447  */
448 void l1c_ic_invalidate(uint32_t address, uint32_t size);
449 
450 /*
451  * @brief I-cache fill and lock by address
452  * @param[in] address Start address to be locked
453  * @param[in] size Size of memory to be locked
454  */
455 void l1c_ic_fill_lock(uint32_t address, uint32_t size);
456 
457 /*
458  * @brief Invalidate all icache and writeback all dcache
459  */
460 void l1c_fence_i(void);
461 
462 /*
463  * @brief Invalidate all d-cache
464  */
465 void l1c_dc_invalidate_all(void);
466 
467 /*
468  * @brief Writeback all d-cache
469  */
470 void l1c_dc_writeback_all(void);
471 
472 /*
473  * @brief Flush all d-cache
474  */
475 void l1c_dc_flush_all(void);
476 
477 #ifdef __cplusplus
478 }
479 #endif
480 
485 #endif /* _HPM_L1_CACHE_H */
#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
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
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
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
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
void l1c_dc_flush(uint32_t address, uint32_t size)
Definition: hpm_l1c_drv.c:119
write_csr((0x7CC), cmd)
void l1c_dc_invalidate_all(void)
Definition: hpm_l1c_drv.c:86
void l1c_fence_i(void)
Definition: hpm_l1c_drv.c:81
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 void size
Definition: hpm_math.h:6899
#define read_csr(csr_num)
read value of specific csr
Definition: riscv_core.h:75