1 /*
2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
3 * Copyright 2016-2020 NXP
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8 #ifndef FSL_CACHE_H_
9 #define FSL_CACHE_H_
10
11 #include "fsl_common.h"
12
13 /*!
14 * @addtogroup cache_lplmem
15 * @{
16 */
17
18 /*******************************************************************************
19 * Definitions
20 ******************************************************************************/
21
22 /*! @name Driver version */
23 /*! @{ */
24 /*! @brief cache driver version 2.1.1. */
25 #define FSL_CACHE_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))
26 /*! @} */
27 /*******************************************************************************
28 * API
29 ******************************************************************************/
30
31 #if defined(__cplusplus)
32 extern "C" {
33 #endif
34
35 /*!
36 * @name cache control for the L1 low power local memory controller
37 *@{
38 */
39
40 /*!
41 * @brief Enables the processor code bus cache.
42 *
43 */
L1CACHE_EnableCodeCache(void)44 static inline void L1CACHE_EnableCodeCache(void)
45 {
46 MCM->CPCR2 &= ~MCM_CPCR2_DCC_MASK;
47 }
48
49 /*!
50 * @brief Disables the processor code bus cache.
51 *
52 */
L1CACHE_DisableCodeCache(void)53 static inline void L1CACHE_DisableCodeCache(void)
54 {
55 MCM->CPCR2 |= MCM_CPCR2_DCC_MASK;
56 }
57
58 /*!
59 * @brief Invalidates the processor code bus cache.
60 *
61 */
L1CACHE_InvalidateCodeCache(void)62 static inline void L1CACHE_InvalidateCodeCache(void)
63 {
64 MCM->CPCR2 |= MCM_CPCR2_CCBC_MASK;
65 }
66
67 /*! @} */
68
69 /*!
70 * @name The unified L1 cache controller
71 * The LPLMEM is write-through design, so there is no cache maintain by range
72 * control operation. So all cache maintain by range unified functions are
73 * directly call the cache maintain all functions since they have the same effect.
74 *@{
75 */
76
77 /*!
78 * @brief Invalidates L1 instrument cache by range.
79 *
80 * @param address The start address of the memory to be invalidated.
81 * @param size_byte The memory size.
82 */
83 void L1CACHE_InvalidateICacheByRange(uint32_t address, uint32_t size_byte);
84
85 /*!
86 * @brief Invalidates L1 data cache by range.
87 *
88 * @param address The start address of the memory to be invalidated.
89 * @param size_byte The memory size.
90 */
L1CACHE_InvalidateDCacheByRange(uint32_t address,uint32_t size_byte)91 static inline void L1CACHE_InvalidateDCacheByRange(uint32_t address, uint32_t size_byte)
92 {
93 L1CACHE_InvalidateICacheByRange(address, size_byte);
94 }
95
96 /*!
97 * @brief Cleans L1 data cache by range.
98 *
99 * The cache is write through mode, so there is nothing to do with
100 * the cache flush/clean operation.
101 *
102 * @param address The start address of the memory to be cleaned.
103 * @param size_byte The memory size.
104 */
L1CACHE_CleanDCacheByRange(uint32_t address,uint32_t size_byte)105 static inline void L1CACHE_CleanDCacheByRange(uint32_t address, uint32_t size_byte)
106 {
107 }
108
109 /*!
110 * @brief Cleans and Invalidates L1 data cache by range.
111 *
112 * @param address The start address of the memory to be clean and invalidated.
113 * @param size_byte The memory size.
114 */
L1CACHE_CleanInvalidateDCacheByRange(uint32_t address,uint32_t size_byte)115 static inline void L1CACHE_CleanInvalidateDCacheByRange(uint32_t address, uint32_t size_byte)
116 {
117 L1CACHE_InvalidateDCacheByRange(address, size_byte);
118 }
119
120 /*! @} */
121
122 /*!
123 * @name Unified Cache Control for caches in all levels
124 *@{
125 */
126
127 /*!
128 * @brief Invalidates instruction cache by range.
129 *
130 * @param address The physical address.
131 * @param size_byte size of the memory to be invalidated.
132 */
ICACHE_InvalidateByRange(uint32_t address,uint32_t size_byte)133 static inline void ICACHE_InvalidateByRange(uint32_t address, uint32_t size_byte)
134 {
135 L1CACHE_InvalidateICacheByRange(address, size_byte);
136 }
137
138 /*!
139 * @brief Invalidates data cache by range.
140 *
141 * @param address The physical address.
142 * @param size_byte size of the memory to be invalidated.
143 */
DCACHE_InvalidateByRange(uint32_t address,uint32_t size_byte)144 static inline void DCACHE_InvalidateByRange(uint32_t address, uint32_t size_byte)
145 {
146 L1CACHE_InvalidateDCacheByRange(address, size_byte);
147 }
148
149 /*!
150 * @brief Clean data cache by range.
151 *
152 * @param address The physical address.
153 * @param size_byte size of the memory to be cleaned.
154 */
DCACHE_CleanByRange(uint32_t address,uint32_t size_byte)155 static inline void DCACHE_CleanByRange(uint32_t address, uint32_t size_byte)
156 {
157 L1CACHE_CleanDCacheByRange(address, size_byte);
158 }
159
160 /*!
161 * @brief Cleans and Invalidates data cache by range.
162 *
163 * @param address The physical address.
164 * @param size_byte size of the memory to be Cleaned and Invalidated.
165 */
DCACHE_CleanInvalidateByRange(uint32_t address,uint32_t size_byte)166 static inline void DCACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte)
167 {
168 L1CACHE_CleanInvalidateDCacheByRange(address, size_byte);
169 }
170
171 /*! @} */
172
173 #if defined(__cplusplus)
174 }
175 #endif
176
177 /*! @}*/
178
179 #endif /* FSL_CACHE_H_*/
180