Line data Source code
1 1 : /*
2 : * Copyright 2021 Carlo Caione <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * Public APIs for external cache controller drivers
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_CACHE_H_
13 : #define ZEPHYR_INCLUDE_DRIVERS_CACHE_H_
14 :
15 : #include <stddef.h>
16 :
17 : /**
18 : * @brief External Cache Controller Interface
19 : * @defgroup cache_external_interface External Cache Controller Interface
20 : * @ingroup io_interfaces
21 : * @{
22 : */
23 :
24 : #ifdef __cplusplus
25 : extern "C" {
26 : #endif
27 :
28 : #if defined(CONFIG_DCACHE)
29 :
30 : /**
31 : * @brief Enable the d-cache
32 : *
33 : * Enable the data cache.
34 : */
35 : void cache_data_enable(void);
36 :
37 : /**
38 : * @brief Disable the d-cache
39 : *
40 : * Disable the data cache.
41 : */
42 : void cache_data_disable(void);
43 :
44 : /**
45 : * @brief Flush the d-cache
46 : *
47 : * Flush the whole data cache.
48 : *
49 : * @retval 0 If succeeded.
50 : * @retval -ENOTSUP If not supported.
51 : * @retval -errno Negative errno for other failures.
52 : */
53 : int cache_data_flush_all(void);
54 :
55 : /**
56 : * @brief Invalidate the d-cache
57 : *
58 : * Invalidate the whole data cache.
59 : *
60 : * @retval 0 If succeeded.
61 : * @retval -ENOTSUP If not supported.
62 : * @retval -errno Negative errno for other failures.
63 : */
64 : int cache_data_invd_all(void);
65 :
66 : /**
67 : * @brief Flush and Invalidate the d-cache
68 : *
69 : * Flush and Invalidate the whole data cache.
70 : *
71 : * @retval 0 If succeeded.
72 : * @retval -ENOTSUP If not supported.
73 : * @retval -errno Negative errno for other failures.
74 : */
75 : int cache_data_flush_and_invd_all(void);
76 :
77 : /**
78 : * @brief Flush an address range in the d-cache
79 : *
80 : * Flush the specified address range of the data cache.
81 : *
82 : * @note the cache operations act on cache line. When multiple data structures
83 : * share the same cache line being flushed, all the portions of the
84 : * data structures sharing the same line will be flushed. This is usually
85 : * not a problem because writing back is a non-destructive process that
86 : * could be triggered by hardware at any time, so having an aligned
87 : * @p addr or a padded @p size is not strictly necessary.
88 : *
89 : * @param addr Starting address to flush.
90 : * @param size Range size.
91 : *
92 : * @retval 0 If succeeded.
93 : * @retval -ENOTSUP If not supported.
94 : * @retval -errno Negative errno for other failures.
95 : */
96 : int cache_data_flush_range(void *addr, size_t size);
97 :
98 : /**
99 : * @brief Invalidate an address range in the d-cache
100 : *
101 : * Invalidate the specified address range of the data cache.
102 : *
103 : * @note the cache operations act on cache line. When multiple data structures
104 : * share the same cache line being invalidated, all the portions of the
105 : * non-read-only data structures sharing the same line will be
106 : * invalidated as well. This is a destructive process that could lead to
107 : * data loss and/or corruption. When @p addr is not aligned to the cache
108 : * line and/or @p size is not a multiple of the cache line size the
109 : * behaviour is undefined.
110 : *
111 : * @param addr Starting address to invalidate.
112 : * @param size Range size.
113 : *
114 : * @retval 0 If succeeded.
115 : * @retval -ENOTSUP If not supported.
116 : * @retval -errno Negative errno for other failures.
117 : */
118 : int cache_data_invd_range(void *addr, size_t size);
119 :
120 : /**
121 : * @brief Flush and Invalidate an address range in the d-cache
122 : *
123 : * Flush and Invalidate the specified address range of the data cache.
124 : *
125 : * @note the cache operations act on cache line. When multiple data structures
126 : * share the same cache line being flushed, all the portions of the
127 : * data structures sharing the same line will be flushed before being
128 : * invalidated. This is usually not a problem because writing back is a
129 : * non-destructive process that could be triggered by hardware at any
130 : * time, so having an aligned @p addr or a padded @p size is not strictly
131 : * necessary.
132 : *
133 : * @param addr Starting address to flush and invalidate.
134 : * @param size Range size.
135 : *
136 : * @retval 0 If succeeded.
137 : * @retval -ENOTSUP If not supported.
138 : * @retval -errno Negative errno for other failures.
139 : */
140 : int cache_data_flush_and_invd_range(void *addr, size_t size);
141 :
142 : #if defined(CONFIG_DCACHE_LINE_SIZE_DETECT)
143 : /**
144 : *
145 : * @brief Get the d-cache line size.
146 : *
147 : * The API is provided to dynamically detect the data cache line size at run
148 : * time.
149 : *
150 : * The function must be implemented only when CONFIG_DCACHE_LINE_SIZE_DETECT is
151 : * defined.
152 : *
153 : * @retval size Size of the d-cache line.
154 : * @retval 0 If the d-cache is not enabled.
155 : */
156 : size_t cache_data_line_size_get(void);
157 :
158 : #endif /* CONFIG_DCACHE_LINE_SIZE_DETECT */
159 :
160 : #endif /* CONFIG_DCACHE */
161 :
162 : #if defined(CONFIG_ICACHE)
163 :
164 : /**
165 : * @brief Enable the i-cache
166 : *
167 : * Enable the instruction cache.
168 : */
169 : void cache_instr_enable(void);
170 :
171 : /**
172 : * @brief Disable the i-cache
173 : *
174 : * Disable the instruction cache.
175 : */
176 : void cache_instr_disable(void);
177 :
178 : /**
179 : * @brief Flush the i-cache
180 : *
181 : * Flush the whole instruction cache.
182 : *
183 : * @retval 0 If succeeded.
184 : * @retval -ENOTSUP If not supported.
185 : * @retval -errno Negative errno for other failures.
186 : */
187 : int cache_instr_flush_all(void);
188 :
189 : /**
190 : * @brief Invalidate the i-cache
191 : *
192 : * Invalidate the whole instruction cache.
193 : *
194 : * @retval 0 If succeeded.
195 : * @retval -ENOTSUP If not supported.
196 : * @retval -errno Negative errno for other failures.
197 : */
198 : int cache_instr_invd_all(void);
199 :
200 : /**
201 : * @brief Flush and Invalidate the i-cache
202 : *
203 : * Flush and Invalidate the whole instruction cache.
204 : *
205 : * @retval 0 If succeeded.
206 : * @retval -ENOTSUP If not supported.
207 : * @retval -errno Negative errno for other failures.
208 : */
209 : int cache_instr_flush_and_invd_all(void);
210 :
211 : /**
212 : * @brief Flush an address range in the i-cache
213 : *
214 : * Flush the specified address range of the instruction cache.
215 : *
216 : * @note the cache operations act on cache line. When multiple data structures
217 : * share the same cache line being flushed, all the portions of the
218 : * data structures sharing the same line will be flushed. This is usually
219 : * not a problem because writing back is a non-destructive process that
220 : * could be triggered by hardware at any time, so having an aligned
221 : * @p addr or a padded @p size is not strictly necessary.
222 : *
223 : * @param addr Starting address to flush.
224 : * @param size Range size.
225 : *
226 : * @retval 0 If succeeded.
227 : * @retval -ENOTSUP If not supported.
228 : * @retval -errno Negative errno for other failures.
229 : */
230 : int cache_instr_flush_range(void *addr, size_t size);
231 :
232 : /**
233 : * @brief Invalidate an address range in the i-cache
234 : *
235 : * Invalidate the specified address range of the instruction cache.
236 : *
237 : * @note the cache operations act on cache line. When multiple data structures
238 : * share the same cache line being invalidated, all the portions of the
239 : * non-read-only data structures sharing the same line will be
240 : * invalidated as well. This is a destructive process that could lead to
241 : * data loss and/or corruption. When @p addr is not aligned to the cache
242 : * line and/or @p size is not a multiple of the cache line size the
243 : * behaviour is undefined.
244 : *
245 : * @param addr Starting address to invalidate.
246 : * @param size Range size.
247 : *
248 : * @retval 0 If succeeded.
249 : * @retval -ENOTSUP If not supported.
250 : * @retval -errno Negative errno for other failures.
251 : */
252 : int cache_instr_invd_range(void *addr, size_t size);
253 :
254 : /**
255 : * @brief Flush and Invalidate an address range in the i-cache
256 : *
257 : * Flush and Invalidate the specified address range of the instruction cache.
258 : *
259 : * @note the cache operations act on cache line. When multiple data structures
260 : * share the same cache line being flushed, all the portions of the
261 : * data structures sharing the same line will be flushed before being
262 : * invalidated. This is usually not a problem because writing back is a
263 : * non-destructive process that could be triggered by hardware at any
264 : * time, so having an aligned @p addr or a padded @p size is not strictly
265 : * necessary.
266 : *
267 : * @param addr Starting address to flush and invalidate.
268 : * @param size Range size.
269 : *
270 : * @retval 0 If succeeded.
271 : * @retval -ENOTSUP If not supported.
272 : * @retval -errno Negative errno for other failures.
273 : */
274 : int cache_instr_flush_and_invd_range(void *addr, size_t size);
275 :
276 : #ifdef CONFIG_ICACHE_LINE_SIZE_DETECT
277 : /**
278 : *
279 : * @brief Get the i-cache line size.
280 : *
281 : * The API is provided to dynamically detect the instruction cache line size at
282 : * run time.
283 : *
284 : * The function must be implemented only when CONFIG_ICACHE_LINE_SIZE_DETECT is
285 : * defined.
286 : *
287 : * @retval size Size of the d-cache line.
288 : * @retval 0 If the d-cache is not enabled.
289 : */
290 : size_t cache_instr_line_size_get(void);
291 :
292 : #endif /* CONFIG_ICACHE_LINE_SIZE_DETECT */
293 :
294 : #endif /* CONFIG_ICACHE */
295 :
296 : #ifdef __cplusplus
297 : }
298 : #endif
299 :
300 : /**
301 : * @}
302 : */
303 :
304 : #endif /* ZEPHYR_INCLUDE_DRIVERS_CACHE_H_ */
|