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