Skip to content

Commit c14f55b

Browse files
mmahadevan108kartben
authored andcommitted
drivers: cache: Cache driver for NXP XCACHE controller
Some NXP SoC's have External cache that is managed by the XCACHE cache controller. Signed-off-by: Mahesh Mahadevan <mahesh.mahadevan@nxp.com>
1 parent 11a8a39 commit c14f55b

File tree

5 files changed

+142
-0
lines changed

5 files changed

+142
-0
lines changed

drivers/cache/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ zephyr_library_sources_ifdef(CONFIG_CACHE_ASPEED cache_aspeed.c)
99
zephyr_library_sources_ifdef(CONFIG_CACHE_ANDES cache_andes.c)
1010
zephyr_library_sources_ifdef(CONFIG_USERSPACE cache_handlers.c)
1111
zephyr_library_sources_ifdef(CONFIG_CACHE_NRF_CACHE cache_nrf.c)
12+
zephyr_library_sources_ifdef(CONFIG_CACHE_NXP_XCACHE cache_nxp_xcache.c)

drivers/cache/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ comment "Device Drivers"
2121
source "drivers/cache/Kconfig.aspeed"
2222
source "drivers/cache/Kconfig.nrf"
2323
source "drivers/cache/Kconfig.andes"
24+
source "drivers/cache/Kconfig.nxp_xcache"
2425

2526
endif # CACHE

drivers/cache/Kconfig.nxp_xcache

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Copyright 2025 NXP
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config CACHE_NXP_XCACHE
5+
bool "NXP external cache driver for xcache controller"
6+
default y
7+
select CACHE_HAS_DRIVER
8+
depends on HAS_MCUX_XCACHE
9+
help
10+
This option enables the XCACHE driver for NXP SOC's.

drivers/cache/cache_nxp_xcache.c

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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+
23+
void cache_data_enable(void)
24+
{
25+
XCACHE_EnableCache(NXP_XCACHE_DATA);
26+
}
27+
28+
void cache_data_disable(void)
29+
{
30+
XCACHE_DisableCache(NXP_XCACHE_DATA);
31+
}
32+
33+
int cache_data_flush_all(void)
34+
{
35+
XCACHE_CleanCache(NXP_XCACHE_DATA);
36+
37+
return 0;
38+
}
39+
40+
int cache_data_invd_all(void)
41+
{
42+
XCACHE_InvalidateCache(NXP_XCACHE_DATA);
43+
44+
return 0;
45+
}
46+
47+
int cache_data_flush_and_invd_all(void)
48+
{
49+
XCACHE_CleanInvalidateCache(NXP_XCACHE_DATA);
50+
51+
return 0;
52+
}
53+
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+
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+
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+
75+
void cache_instr_enable(void)
76+
{
77+
XCACHE_EnableCache(NXP_XCACHE_INSTR);
78+
}
79+
80+
void cache_instr_disable(void)
81+
{
82+
XCACHE_DisableCache(NXP_XCACHE_INSTR);
83+
}
84+
85+
int cache_instr_flush_all(void)
86+
{
87+
XCACHE_CleanCache(NXP_XCACHE_INSTR);
88+
89+
return 0;
90+
}
91+
92+
int cache_instr_invd_all(void)
93+
{
94+
XCACHE_InvalidateCache(NXP_XCACHE_INSTR);
95+
96+
return 0;
97+
}
98+
99+
int cache_instr_flush_and_invd_all(void)
100+
{
101+
XCACHE_CleanInvalidateCache(NXP_XCACHE_INSTR);
102+
103+
return 0;
104+
}
105+
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+
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+
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+
}

modules/Kconfig.mcux

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,11 @@ config HAS_MCUX_XBARA
364364
help
365365
Set if the XBARA module is present on the SoC.
366366

367+
config HAS_MCUX_XCACHE
368+
bool
369+
help
370+
Set if the XCACHE module is present on the SoC.
371+
367372
config HAS_NXP_MONOLITHIC_NBU
368373
bool
369374
help

0 commit comments

Comments
 (0)