Zephyr Project API  3.3.0
A Scalable Open Source RTOS
cache.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Wind River Systems, Inc.
3 * Copyright (c) 2022 Carlo Caione <ccaione@baylibre.com>
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef ZEPHYR_INCLUDE_CACHE_H_
9#define ZEPHYR_INCLUDE_CACHE_H_
10
16#include <zephyr/kernel.h>
17#include <zephyr/arch/cpu.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#if defined(CONFIG_EXTERNAL_CACHE)
24
25/*
26 * External cache API driver interface mirrored in
27 * include/zephyr/drivers/cache.h
28 */
29
30#if defined(CONFIG_DCACHE)
31
32extern void cache_data_enable(void);
33extern void cache_data_disable(void);
34
35extern int cache_data_flush_all(void);
36extern int cache_data_invd_all(void);
37extern int cache_data_flush_and_invd_all(void);
38
39extern int cache_data_flush_range(void *addr, size_t size);
40extern int cache_data_invd_range(void *addr, size_t size);
41extern int cache_data_flush_and_invd_range(void *addr, size_t size);
42
43#if defined(CONFIG_DCACHE_LINE_SIZE_DETECT)
44extern size_t cache_data_line_size_get(void);
45#endif /* CONFIG_DCACHE_LINE_SIZE_DETECT */
46
47#endif /* CONFIG_DCACHE */
48
49#if defined(CONFIG_ICACHE)
50
51extern void cache_instr_enable(void);
52extern void cache_instr_disable(void);
53
54extern int cache_instr_flush_all(void);
55extern int cache_instr_invd_all(void);
56extern int cache_instr_flush_and_invd_all(void);
57
58extern int cache_instr_flush_range(void *addr, size_t size);
59extern int cache_instr_invd_range(void *addr, size_t size);
60extern int cache_instr_flush_and_invd_range(void *addr, size_t size);
61
62#if defined(CONFIG_ICACHE_LINE_SIZE_DETECT)
63extern size_t cache_instr_line_size_get(void);
64#endif /* CONFIG_ICACHE_LINE_SIZE_DETECT */
65
66#endif /* CONFIG_ICACHE */
67
68#else /* CONFIG_ARCH_CACHE */
69
70/*
71 * Arch cache API interface mirrored in
72 * include/zephyr/sys/arch_interface.h
73 */
74
75#if defined(CONFIG_DCACHE)
76
77#define cache_data_enable arch_dcache_enable
78#define cache_data_disable arch_dcache_disable
79
80#define cache_data_flush_all arch_dcache_flush_all
81#define cache_data_invd_all arch_dcache_invd_all
82#define cache_data_flush_and_invd_all arch_dcache_flush_and_invd_all
83
84#define cache_data_flush_range(addr, size) arch_dcache_flush_range(addr, size)
85#define cache_data_invd_range(addr, size) arch_dcache_invd_range(addr, size)
86#define cache_data_flush_and_invd_range(addr, size) \
87 arch_dcache_flush_and_invd_range(addr, size)
88
89#if defined(CONFIG_DCACHE_LINE_SIZE_DETECT)
90#define cache_data_line_size_get arch_dcache_line_size_get
91#endif /* CONFIG_DCACHE_LINE_SIZE_DETECT */
92
93#endif /* CONFIG_DCACHE */
94
95#if defined(CONFIG_ICACHE)
96
97#define cache_instr_enable arch_icache_enable
98#define cache_instr_disable arch_icache_disable
99
100#define cache_instr_flush_all arch_icache_flush_all
101#define cache_instr_invd_all arch_icache_invd_all
102#define cache_instr_flush_and_invd_all arch_icache_flush_and_invd_all
103
104#define cache_instr_flush_range(addr, size) arch_icache_flush_range(addr, size)
105#define cache_instr_invd_range(addr, size) arch_icache_invd_range(addr, size)
106#define cache_instr_flush_and_invd_range(addr, size) \
107 arch_icache_flush_and_invd_range(addr, size)
108
109#if defined(CONFIG_ICACHE_LINE_SIZE_DETECT)
110#define cache_instr_line_size_get arch_icache_line_size_get
111#endif /* CONFIG_ICACHE_LINE_SIZE_DETECT */
112
113#endif /* CONFIG_ICACHE */
114#endif /* CONFIG_EXTERNAL_CACHE */
115
116
127#define _CPU DT_PATH(cpus, cpu_0)
128
137static inline void sys_cache_data_enable(void)
138{
139#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
140 cache_data_enable();
141#endif
142}
143
150static inline void sys_cache_data_disable(void)
151{
152#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
153 cache_data_disable();
154#endif
155}
156
163static inline void sys_cache_instr_enable(void)
164{
165#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
166 cache_instr_enable();
167#endif
168}
169
176static inline void sys_cache_instr_disable(void)
177{
178#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
179 cache_instr_disable();
180#endif
181}
182
192static inline int sys_cache_data_flush_all(void)
193{
194#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
195 return cache_data_flush_all();
196#endif
197 return -ENOTSUP;
198}
199
209static inline int sys_cache_instr_flush_all(void)
210{
211#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
212 return cache_instr_flush_all();
213#endif
214 return -ENOTSUP;
215}
216
226static inline int sys_cache_data_invd_all(void)
227{
228#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
229 return cache_data_invd_all();
230#endif
231 return -ENOTSUP;
232}
233
243static inline int sys_cache_instr_invd_all(void)
244{
245#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
246 return cache_instr_invd_all();
247#endif
248 return -ENOTSUP;
249}
250
261{
262#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
263 return cache_data_flush_and_invd_all();
264#endif
265 return -ENOTSUP;
266}
267
278{
279#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
280 return cache_instr_flush_and_invd_all();
281#endif
282 return -ENOTSUP;
283}
284
297__syscall int sys_cache_data_flush_range(void *addr, size_t size);
298static inline int z_impl_sys_cache_data_flush_range(void *addr, size_t size)
299{
300#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
301 return cache_data_flush_range(addr, size);
302#endif
303 ARG_UNUSED(addr);
304 ARG_UNUSED(size);
305
306 return -ENOTSUP;
307}
308
321static inline int sys_cache_instr_flush_range(void *addr, size_t size)
322{
323#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
324 return cache_instr_flush_range(addr, size);
325#endif
326 ARG_UNUSED(addr);
327 ARG_UNUSED(size);
328
329 return -ENOTSUP;
330}
331
344__syscall int sys_cache_data_invd_range(void *addr, size_t size);
345static inline int z_impl_sys_cache_data_invd_range(void *addr, size_t size)
346{
347#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
348 return cache_data_invd_range(addr, size);
349#endif
350 ARG_UNUSED(addr);
351 ARG_UNUSED(size);
352
353 return -ENOTSUP;
354}
355
368static inline int sys_cache_instr_invd_range(void *addr, size_t size)
369{
370#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
371 return cache_instr_invd_range(addr, size);
372#endif
373 ARG_UNUSED(addr);
374 ARG_UNUSED(size);
375
376 return -ENOTSUP;
377}
378
391__syscall int sys_cache_data_flush_and_invd_range(void *addr, size_t size);
392static inline int z_impl_sys_cache_data_flush_and_invd_range(void *addr, size_t size)
393{
394#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
395 return cache_data_flush_and_invd_range(addr, size);
396#endif
397 ARG_UNUSED(addr);
398 ARG_UNUSED(size);
399
400 return -ENOTSUP;
401}
402
415static inline int sys_cache_instr_flush_and_invd_range(void *addr, size_t size)
416{
417#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ICACHE)
418 return cache_instr_flush_and_invd_range(addr, size);
419#endif
420 ARG_UNUSED(addr);
421 ARG_UNUSED(size);
422
423 return -ENOTSUP;
424}
425
442static inline size_t sys_cache_data_line_size_get(void)
443{
444#ifdef CONFIG_DCACHE_LINE_SIZE_DETECT
445 return cache_data_line_size_get();
446#elif (CONFIG_DCACHE_LINE_SIZE != 0)
447 return CONFIG_DCACHE_LINE_SIZE;
448#else
449 return DT_PROP_OR(_CPU, d_cache_line_size, 0);
450#endif
451}
452
469static inline size_t sys_cache_instr_line_size_get(void)
470{
471#ifdef CONFIG_ICACHE_LINE_SIZE_DETECT
472 return cache_instr_line_size_get();
473#elif (CONFIG_ICACHE_LINE_SIZE != 0)
474 return CONFIG_ICACHE_LINE_SIZE;
475#else
476 return DT_PROP_OR(_CPU, i_cache_line_size, 0);
477#endif
478}
479
480#ifdef CONFIG_LIBMETAL
481static inline void sys_cache_flush(void *addr, size_t size)
482{
483 sys_cache_data_flush_range(addr, size);
484}
485#endif
486
487#include <syscalls/cache.h>
488#ifdef __cplusplus
489}
490#endif
491
496#endif /* ZEPHYR_INCLUDE_CACHE_H_ */
static int sys_cache_data_invd_all(void)
Invalidate the d-cache.
Definition: cache.h:226
static void sys_cache_data_enable(void)
Enable the d-cache.
Definition: cache.h:137
static int sys_cache_instr_flush_and_invd_all(void)
Flush and Invalidate the i-cache.
Definition: cache.h:277
static int sys_cache_instr_invd_all(void)
Invalidate the i-cache.
Definition: cache.h:243
static int sys_cache_instr_flush_range(void *addr, size_t size)
Flush an address range in the i-cache.
Definition: cache.h:321
static void sys_cache_instr_disable(void)
Disable the i-cache.
Definition: cache.h:176
int sys_cache_data_flush_and_invd_range(void *addr, size_t size)
Flush and Invalidate an address range in the d-cache.
int sys_cache_data_invd_range(void *addr, size_t size)
Invalidate an address range in the d-cache.
static int sys_cache_instr_invd_range(void *addr, size_t size)
Invalidate an address range in the i-cache.
Definition: cache.h:368
int sys_cache_data_flush_range(void *addr, size_t size)
Flush an address range in the d-cache.
static int sys_cache_instr_flush_and_invd_range(void *addr, size_t size)
Flush and Invalidate an address range in the i-cache.
Definition: cache.h:415
static void sys_cache_instr_enable(void)
Enable the i-cache.
Definition: cache.h:163
static int sys_cache_data_flush_all(void)
Flush the d-cache.
Definition: cache.h:192
static int sys_cache_instr_flush_all(void)
Flush the i-cache.
Definition: cache.h:209
static size_t sys_cache_data_line_size_get(void)
Get the the d-cache line size.
Definition: cache.h:442
static void sys_cache_data_disable(void)
Disable the d-cache.
Definition: cache.h:150
static int sys_cache_data_flush_and_invd_all(void)
Flush and Invalidate the d-cache.
Definition: cache.h:260
static size_t sys_cache_instr_line_size_get(void)
Get the the i-cache line size.
Definition: cache.h:469
#define DT_PROP_OR(node_id, prop, default_value)
Like DT_PROP(), but with a fallback to default_value.
Definition: devicetree.h:753
#define ENOTSUP
Definition: errno.h:115
Public kernel APIs.