blob: b0a6083da7a2b317e6385b6136cbba08772e7b19 [file] [log] [blame]
Benjamin Walsh334c14e2015-09-18 16:36:57 -04001/*
2 * Copyright (c) 2015 Wind River Systems, Inc.
3 *
David B. Kinderac74d8b2017-01-18 17:01:01 -08004 * SPDX-License-Identifier: Apache-2.0
Benjamin Walsh334c14e2015-09-18 16:36:57 -04005 */
6
Flavio Ceolin67ca1762018-09-14 10:43:44 -07007#ifndef ZEPHYR_INCLUDE_CACHE_H_
8#define ZEPHYR_INCLUDE_CACHE_H_
Benjamin Walsh334c14e2015-09-18 16:36:57 -04009
Anas Nashifea8c6aad2016-12-23 07:32:56 -050010#include <kernel.h>
Carlo Caionee2333262021-04-28 10:38:27 +020011#include <kernel_structs.h>
Benjamin Walsh334c14e2015-09-18 16:36:57 -040012
Peter Mitsisa0e45682016-01-22 12:38:49 -050013#ifdef __cplusplus
14extern "C" {
15#endif
16
Carlo Caionee77c8412020-12-02 12:38:58 +010017/**
18 * Common operations for the caches
19 *
20 * WB means write-back and intends to transfer dirty cache lines to memory in a
21 * copy-back cache policy. May be a no-op in write-back cache policy.
22 *
23 * INVD means invalidate and will mark cache lines as not valid. A future
24 * access to the associated address is guaranteed to generate a memory fetch.
25 */
Carlo Caionee2333262021-04-28 10:38:27 +020026
Carlo Caionee77c8412020-12-02 12:38:58 +010027#define K_CACHE_WB BIT(0)
28#define K_CACHE_INVD BIT(1)
29#define K_CACHE_WB_INVD (K_CACHE_WB | K_CACHE_INVD)
Benjamin Walsh334c14e2015-09-18 16:36:57 -040030
Carlo Caionee2333262021-04-28 10:38:27 +020031#if defined(CONFIG_HAS_EXTERNAL_CACHE)
Benjamin Walsh7b526e22015-10-30 17:04:00 -040032
Carlo Caionee2333262021-04-28 10:38:27 +020033/* Driver interface mirrored in include/drivers/cache.h */
Aastha Grover2d9b4592020-07-16 12:32:24 -070034
Carlo Caionee2333262021-04-28 10:38:27 +020035/* Enable d-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020036extern void cache_data_enable(void);
Carlo Caionee77c8412020-12-02 12:38:58 +010037
Carlo Caionee2333262021-04-28 10:38:27 +020038/* Disable d-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020039extern void cache_data_disable(void);
Carlo Caionee77c8412020-12-02 12:38:58 +010040
Carlo Caionee2333262021-04-28 10:38:27 +020041/* Enable i-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020042extern void cache_instr_enable(void);
Carlo Caionee77c8412020-12-02 12:38:58 +010043
Carlo Caionee2333262021-04-28 10:38:27 +020044/* Disable i-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020045extern void cache_instr_disable(void);
Carlo Caionee77c8412020-12-02 12:38:58 +010046
Carlo Caionee2333262021-04-28 10:38:27 +020047/* Write-back / Invalidate / Write-back + Invalidate all d-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020048extern int cache_data_all(int op);
Carlo Caionee77c8412020-12-02 12:38:58 +010049
Carlo Caionee2333262021-04-28 10:38:27 +020050/* Write-back / Invalidate / Write-back + Invalidate d-cache lines */
Carlo Caionef0006952021-05-04 16:26:10 +020051extern int cache_data_range(void *addr, size_t size, int op);
Carlo Caionee2333262021-04-28 10:38:27 +020052
53/* Write-back / Invalidate / Write-back + Invalidate all i-cache */
Carlo Caionef0006952021-05-04 16:26:10 +020054extern int cache_instr_all(int op);
Carlo Caionee2333262021-04-28 10:38:27 +020055
56/* Write-back / Invalidate / Write-back + Invalidate i-cache lines */
Carlo Caionef0006952021-05-04 16:26:10 +020057extern int cache_instr_range(void *addr, size_t size, int op);
Carlo Caionee2333262021-04-28 10:38:27 +020058
59#else
60
61/* Hooks into arch code */
62
Carlo Caionef0006952021-05-04 16:26:10 +020063#define cache_data_enable arch_dcache_enable
64#define cache_data_disable arch_dcache_disable
65#define cache_instr_enable arch_icache_enable
66#define cache_instr_disable arch_icache_disable
67#define cache_data_all(op) arch_dcache_all(op)
68#define cache_data_range(addr, size, op) arch_dcache_range(addr, size, op)
69#define cache_instr_all(op) arch_icache_all(op)
70#define cache_instr_range(addr, size, op) arch_icache_range(addr, size, op)
71#define cache_data_line_size_get arch_dcache_line_size_get
72#define cache_instr_line_size_get arch_icache_line_size_get
Carlo Caionee2333262021-04-28 10:38:27 +020073
74#endif
Carlo Caionee77c8412020-12-02 12:38:58 +010075
Carlo Caionef0006952021-05-04 16:26:10 +020076__syscall int sys_cache_data_all(int op);
77static inline int z_impl_sys_cache_data_all(int op)
Aastha Grover97ecad62020-04-28 13:14:54 -070078{
Carlo Caionee2333262021-04-28 10:38:27 +020079#if defined(CONFIG_CACHE_MANAGEMENT)
Carlo Caionef0006952021-05-04 16:26:10 +020080 return cache_data_all(op);
Carlo Caionee2333262021-04-28 10:38:27 +020081#endif
Carlo Caione6fed3fd2021-05-24 11:51:00 +020082 ARG_UNUSED(op);
83
Carlo Caionee77c8412020-12-02 12:38:58 +010084 return -ENOTSUP;
Aastha Grover97ecad62020-04-28 13:14:54 -070085}
Benjamin Walsh334c14e2015-09-18 16:36:57 -040086
Carlo Caionef0006952021-05-04 16:26:10 +020087__syscall int sys_cache_data_range(void *addr, size_t size, int op);
88static inline int z_impl_sys_cache_data_range(void *addr, size_t size, int op)
Carlo Caionee77c8412020-12-02 12:38:58 +010089{
Carlo Caionee2333262021-04-28 10:38:27 +020090#if defined(CONFIG_CACHE_MANAGEMENT)
Carlo Caionef0006952021-05-04 16:26:10 +020091 return cache_data_range(addr, size, op);
Carlo Caionee2333262021-04-28 10:38:27 +020092#endif
Carlo Caione6fed3fd2021-05-24 11:51:00 +020093 ARG_UNUSED(addr);
94 ARG_UNUSED(size);
95 ARG_UNUSED(op);
96
Carlo Caionee77c8412020-12-02 12:38:58 +010097 return -ENOTSUP;
98}
99
Carlo Caionef0006952021-05-04 16:26:10 +0200100__syscall int sys_cache_instr_all(int op);
101static inline int z_impl_sys_cache_instr_all(int op)
Carlo Caionee77c8412020-12-02 12:38:58 +0100102{
Carlo Caionee2333262021-04-28 10:38:27 +0200103#if defined(CONFIG_CACHE_MANAGEMENT)
Carlo Caionef0006952021-05-04 16:26:10 +0200104 return cache_instr_all(op);
Carlo Caionee2333262021-04-28 10:38:27 +0200105#endif
Carlo Caione6fed3fd2021-05-24 11:51:00 +0200106 ARG_UNUSED(op);
107
Carlo Caionee77c8412020-12-02 12:38:58 +0100108 return -ENOTSUP;
109}
110
Carlo Caionef0006952021-05-04 16:26:10 +0200111__syscall int sys_cache_instr_range(void *addr, size_t size, int op);
112static inline int z_impl_sys_cache_instr_range(void *addr, size_t size, int op)
Carlo Caionee77c8412020-12-02 12:38:58 +0100113{
Carlo Caionee2333262021-04-28 10:38:27 +0200114#if defined(CONFIG_CACHE_MANAGEMENT)
Carlo Caionef0006952021-05-04 16:26:10 +0200115 return cache_instr_range(addr, size, op);
Carlo Caionee2333262021-04-28 10:38:27 +0200116#endif
Carlo Caione6fed3fd2021-05-24 11:51:00 +0200117 ARG_UNUSED(addr);
118 ARG_UNUSED(size);
119 ARG_UNUSED(op);
120
Carlo Caionee77c8412020-12-02 12:38:58 +0100121 return -ENOTSUP;
122}
123
Carlo Caione9d563e82020-12-02 21:42:42 +0100124#ifdef CONFIG_LIBMETAL
125static inline void sys_cache_flush(void *addr, size_t size)
126{
Carlo Caionef0006952021-05-04 16:26:10 +0200127 sys_cache_data_range(addr, size, K_CACHE_WB);
Carlo Caione9d563e82020-12-02 21:42:42 +0100128}
129#endif
130
Carlo Caionee77c8412020-12-02 12:38:58 +0100131#define CPU DT_PATH(cpus, cpu_0)
132
Aastha Grover97ecad62020-04-28 13:14:54 -0700133/**
134 *
135 * @brief Get the d-cache line size.
136 *
Carlo Caionee77c8412020-12-02 12:38:58 +0100137 * The API is provided to get the d-cache line size.
Aastha Grover97ecad62020-04-28 13:14:54 -0700138 *
Carlo Caionee77c8412020-12-02 12:38:58 +0100139 * @return size of the d-cache line or 0 if the d-cache is not enabled.
Aastha Grover97ecad62020-04-28 13:14:54 -0700140 */
Carlo Caionef0006952021-05-04 16:26:10 +0200141static inline size_t sys_cache_data_line_size_get(void)
Aastha Grover97ecad62020-04-28 13:14:54 -0700142{
Carlo Caionee77c8412020-12-02 12:38:58 +0100143#ifdef CONFIG_DCACHE_LINE_SIZE_DETECT
Carlo Caionef0006952021-05-04 16:26:10 +0200144 return cache_data_line_size_get();
Carlo Caionee77c8412020-12-02 12:38:58 +0100145#elif (CONFIG_DCACHE_LINE_SIZE != 0)
146 return CONFIG_DCACHE_LINE_SIZE;
Benjamin Walsh7b526e22015-10-30 17:04:00 -0400147#else
Carlo Caionee77c8412020-12-02 12:38:58 +0100148 return DT_PROP_OR(CPU, d_cache_line_size, 0);
149#endif
150}
151
152/*
153 *
154 * @brief Get the i-cache line size.
155 *
156 * The API is provided to get the i-cache line size.
157 *
158 * @return size of the i-cache line or 0 if the i-cache is not enabled.
159 */
Carlo Caionef0006952021-05-04 16:26:10 +0200160static inline size_t sys_cache_instr_line_size_get(void)
Carlo Caionee77c8412020-12-02 12:38:58 +0100161{
162#ifdef CONFIG_ICACHE_LINE_SIZE_DETECT
Carlo Caionef0006952021-05-04 16:26:10 +0200163 return cache_instr_line_size_get();
Carlo Caionee77c8412020-12-02 12:38:58 +0100164#elif (CONFIG_ICACHE_LINE_SIZE != 0)
165 return CONFIG_ICACHE_LINE_SIZE;
Aastha Grover97ecad62020-04-28 13:14:54 -0700166#else
Carlo Caionee77c8412020-12-02 12:38:58 +0100167 return DT_PROP_OR(CPU, i_cache_line_size, 0);
168#endif
Aastha Grover97ecad62020-04-28 13:14:54 -0700169}
Benjamin Walsh334c14e2015-09-18 16:36:57 -0400170
Aastha Grover2d9b4592020-07-16 12:32:24 -0700171#include <syscalls/cache.h>
Peter Mitsisa0e45682016-01-22 12:38:49 -0500172#ifdef __cplusplus
173}
174#endif
175
Flavio Ceolin67ca1762018-09-14 10:43:44 -0700176#endif /* ZEPHYR_INCLUDE_CACHE_H_ */