1 /*
2 * Copyright 2025 NXP
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/kernel.h>
8 #include <zephyr/drivers/cache.h>
9 #include <zephyr/logging/log.h>
10 #include <soc.h>
11 #include <fsl_cache.h>
12
13 LOG_MODULE_REGISTER(cache_nxp_xcache, CONFIG_CACHE_LOG_LEVEL);
14
15 #if !defined(NXP_XCACHE_INSTR)
16 #define NXP_XCACHE_INSTR XCACHE_PC
17 #endif
18
19 #if !defined(NXP_XCACHE_DATA)
20 #define NXP_XCACHE_DATA XCACHE_PS
21 #endif
22
cache_data_enable(void)23 void cache_data_enable(void)
24 {
25 XCACHE_EnableCache(NXP_XCACHE_DATA);
26 }
27
cache_data_disable(void)28 void cache_data_disable(void)
29 {
30 XCACHE_DisableCache(NXP_XCACHE_DATA);
31 }
32
cache_data_flush_all(void)33 int cache_data_flush_all(void)
34 {
35 XCACHE_CleanCache(NXP_XCACHE_DATA);
36
37 return 0;
38 }
39
cache_data_invd_all(void)40 int cache_data_invd_all(void)
41 {
42 XCACHE_InvalidateCache(NXP_XCACHE_DATA);
43
44 return 0;
45 }
46
cache_data_flush_and_invd_all(void)47 int cache_data_flush_and_invd_all(void)
48 {
49 XCACHE_CleanInvalidateCache(NXP_XCACHE_DATA);
50
51 return 0;
52 }
53
cache_data_flush_range(void * addr,size_t size)54 int cache_data_flush_range(void *addr, size_t size)
55 {
56 XCACHE_CleanCacheByRange((uint32_t)addr, size);
57
58 return 0;
59 }
60
cache_data_invd_range(void * addr,size_t size)61 int cache_data_invd_range(void *addr, size_t size)
62 {
63 XCACHE_InvalidateCacheByRange((uint32_t)addr, size);
64
65 return 0;
66 }
67
cache_data_flush_and_invd_range(void * addr,size_t size)68 int cache_data_flush_and_invd_range(void *addr, size_t size)
69 {
70 XCACHE_CleanInvalidateCacheByRange((uint32_t)addr, size);
71
72 return 0;
73 }
74
cache_instr_enable(void)75 void cache_instr_enable(void)
76 {
77 XCACHE_EnableCache(NXP_XCACHE_INSTR);
78 }
79
cache_instr_disable(void)80 void cache_instr_disable(void)
81 {
82 XCACHE_DisableCache(NXP_XCACHE_INSTR);
83 }
84
cache_instr_flush_all(void)85 int cache_instr_flush_all(void)
86 {
87 XCACHE_CleanCache(NXP_XCACHE_INSTR);
88
89 return 0;
90 }
91
cache_instr_invd_all(void)92 int cache_instr_invd_all(void)
93 {
94 XCACHE_InvalidateCache(NXP_XCACHE_INSTR);
95
96 return 0;
97 }
98
cache_instr_flush_and_invd_all(void)99 int cache_instr_flush_and_invd_all(void)
100 {
101 XCACHE_CleanInvalidateCache(NXP_XCACHE_INSTR);
102
103 return 0;
104 }
105
cache_instr_flush_range(void * addr,size_t size)106 int cache_instr_flush_range(void *addr, size_t size)
107 {
108 XCACHE_CleanCacheByRange((uint32_t)addr, size);
109
110 return 0;
111 }
112
cache_instr_invd_range(void * addr,size_t size)113 int cache_instr_invd_range(void *addr, size_t size)
114 {
115 XCACHE_InvalidateCacheByRange((uint32_t)addr, size);
116
117 return 0;
118 }
119
cache_instr_flush_and_invd_range(void * addr,size_t size)120 int cache_instr_flush_and_invd_range(void *addr, size_t size)
121 {
122 XCACHE_CleanInvalidateCacheByRange((uint32_t)addr, size);
123
124 return 0;
125 }
126