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>
This commit is contained in:
parent
11a8a39c63
commit
c14f55b530
5 changed files with 142 additions and 0 deletions
1
drivers/cache/CMakeLists.txt
vendored
1
drivers/cache/CMakeLists.txt
vendored
|
|
@ -9,3 +9,4 @@ zephyr_library_sources_ifdef(CONFIG_CACHE_ASPEED cache_aspeed.c)
|
|||
zephyr_library_sources_ifdef(CONFIG_CACHE_ANDES cache_andes.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_USERSPACE cache_handlers.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_CACHE_NRF_CACHE cache_nrf.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_CACHE_NXP_XCACHE cache_nxp_xcache.c)
|
||||
|
|
|
|||
1
drivers/cache/Kconfig
vendored
1
drivers/cache/Kconfig
vendored
|
|
@ -21,5 +21,6 @@ comment "Device Drivers"
|
|||
source "drivers/cache/Kconfig.aspeed"
|
||||
source "drivers/cache/Kconfig.nrf"
|
||||
source "drivers/cache/Kconfig.andes"
|
||||
source "drivers/cache/Kconfig.nxp_xcache"
|
||||
|
||||
endif # CACHE
|
||||
|
|
|
|||
10
drivers/cache/Kconfig.nxp_xcache
vendored
Normal file
10
drivers/cache/Kconfig.nxp_xcache
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Copyright 2025 NXP
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
config CACHE_NXP_XCACHE
|
||||
bool "NXP external cache driver for xcache controller"
|
||||
default y
|
||||
select CACHE_HAS_DRIVER
|
||||
depends on HAS_MCUX_XCACHE
|
||||
help
|
||||
This option enables the XCACHE driver for NXP SOC's.
|
||||
125
drivers/cache/cache_nxp_xcache.c
vendored
Normal file
125
drivers/cache/cache_nxp_xcache.c
vendored
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* Copyright 2025 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/drivers/cache.h>
|
||||
#include <zephyr/logging/log.h>
|
||||
#include <soc.h>
|
||||
#include <fsl_cache.h>
|
||||
|
||||
LOG_MODULE_REGISTER(cache_nxp_xcache, CONFIG_CACHE_LOG_LEVEL);
|
||||
|
||||
#if !defined(NXP_XCACHE_INSTR)
|
||||
#define NXP_XCACHE_INSTR XCACHE_PC
|
||||
#endif
|
||||
|
||||
#if !defined(NXP_XCACHE_DATA)
|
||||
#define NXP_XCACHE_DATA XCACHE_PS
|
||||
#endif
|
||||
|
||||
void cache_data_enable(void)
|
||||
{
|
||||
XCACHE_EnableCache(NXP_XCACHE_DATA);
|
||||
}
|
||||
|
||||
void cache_data_disable(void)
|
||||
{
|
||||
XCACHE_DisableCache(NXP_XCACHE_DATA);
|
||||
}
|
||||
|
||||
int cache_data_flush_all(void)
|
||||
{
|
||||
XCACHE_CleanCache(NXP_XCACHE_DATA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_data_invd_all(void)
|
||||
{
|
||||
XCACHE_InvalidateCache(NXP_XCACHE_DATA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_data_flush_and_invd_all(void)
|
||||
{
|
||||
XCACHE_CleanInvalidateCache(NXP_XCACHE_DATA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_data_flush_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_CleanCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_data_invd_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_InvalidateCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_data_flush_and_invd_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_CleanInvalidateCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cache_instr_enable(void)
|
||||
{
|
||||
XCACHE_EnableCache(NXP_XCACHE_INSTR);
|
||||
}
|
||||
|
||||
void cache_instr_disable(void)
|
||||
{
|
||||
XCACHE_DisableCache(NXP_XCACHE_INSTR);
|
||||
}
|
||||
|
||||
int cache_instr_flush_all(void)
|
||||
{
|
||||
XCACHE_CleanCache(NXP_XCACHE_INSTR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_instr_invd_all(void)
|
||||
{
|
||||
XCACHE_InvalidateCache(NXP_XCACHE_INSTR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_instr_flush_and_invd_all(void)
|
||||
{
|
||||
XCACHE_CleanInvalidateCache(NXP_XCACHE_INSTR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_instr_flush_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_CleanCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_instr_invd_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_InvalidateCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cache_instr_flush_and_invd_range(void *addr, size_t size)
|
||||
{
|
||||
XCACHE_CleanInvalidateCacheByRange((uint32_t)addr, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -364,6 +364,11 @@ config HAS_MCUX_XBARA
|
|||
help
|
||||
Set if the XBARA module is present on the SoC.
|
||||
|
||||
config HAS_MCUX_XCACHE
|
||||
bool
|
||||
help
|
||||
Set if the XCACHE module is present on the SoC.
|
||||
|
||||
config HAS_NXP_MONOLITHIC_NBU
|
||||
bool
|
||||
help
|
||||
|
|
|
|||
Loading…
Reference in a new issue