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