The MCUXpresso SDK provides Peripheral driver for the CACHE Controller of MCUXpresso SDK devices.
CACHE driver is created to help user to operate the Cache memory more easy. The APIs for basic operations are including the following three levels: 1L. The L1 cache driver API. This level provides the level 1 caches controller drivers. The L1 caches are mainly integrated in the Core memory system, Cortex-M7 L1 caches etc. For our kinetis Cortex-M4 series platforms, the L1 cache is the local memory controller (LMEM) which is not integrated in Cortex-M4 processer memory system.
2L. The L2 cache driver API. This level provides the level 2 cache controller drivers. The L2 cache could be integrated in CORE memory system or an external L2 cache memory, PL310 etc.
3L. The combined cache driver API. This level provides many APIs for combined L1 and L2 cache maintain operations. This is provided for MCUXpresso SDK drivers (DMA, ENET, USDHC etc) which should do the cache maintenance in their transactional APIs.
Function groups
L1 CACHE Operation {#L1CACHE MaintainOperation}
The L1 CACHE has both code cache and data cache. This function group provides independent two groups API for both code cache and data cache. There are Enable/Disable APIs for code cache and data cache control and cache maintenance operations as Invalidate/Clean/CleanInvalidate by all and by address range.
L2 CACHE Operation {#L2CACHE MaintainOperation}
The L2 CACHE not divide the cache to data and code. So this function group provides one group cache maintenance operations as Enable/Disable/Invalidate/Clean/CleanInvalidate by all and by address range. Except the maintenance operation APIs, the L2 CACHE has it's initialization/configure API. User can use the default configure parameter by calling L2CACHE_GetDefaultConfig() or change the parameters as they wish. Then call L2CACHE_Init to do the L2 CACHE initialization. After the Initialization, the L2 cache can be enabled then.
Note: For the core external l2 Cache, the soc usually has the control bit to select the SRAM to use as L2 Cache or normal SRAM. Please many sure this select is right when you use the L2 CACHE feature.
|
enum | l2cache_way_num_t { kL2CACHE_8ways = 0
} |
| Number of level 2 cache controller ways. More...
|
|
enum | l2cache_way_size {
kL2CACHE_16KBSize = 1,
kL2CACHE_32KBSize = 2,
kL2CACHE_64KBSize = 3,
kL2CACHE_128KBSize = 4,
kL2CACHE_256KBSize = 5,
kL2CACHE_512KBSize = 6
} |
| Level 2 cache controller way size. More...
|
|
enum | l2cache_replacement_t {
kL2CACHE_Pseudorandom = 0U,
kL2CACHE_Roundrobin
} |
| Level 2 cache controller replacement policy. More...
|
|
enum | l2cache_writealloc_t {
kL2CACHE_UseAwcache = 0,
kL2CACHE_NoWriteallocate,
kL2CACHE_forceWriteallocate
} |
| Level 2 cache controller force write allocate options. More...
|
|
enum | l2cache_latency_t {
kL2CACHE_1CycleLate = 0,
kL2CACHE_2CycleLate,
kL2CACHE_3CycleLate,
kL2CACHE_4CycleLate,
kL2CACHE_5CycleLate,
kL2CACHE_6CycleLate,
kL2CACHE_7CycleLate,
kL2CACHE_8CycleLate
} |
| Level 2 cache controller tag/data ram latency. More...
|
|
struct L2cache_latency_config_t |
Set NUll if not required.
bool l2cache_config_t::istrPrefetchEnable |
bool l2cache_config_t::dataPrefetchEnable |
bool l2cache_config_t::nsLockdownEnable |
#define FSL_CACHE_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) |
Enumerator |
---|
kL2CACHE_8ways |
8 ways.
|
Enumerator |
---|
kL2CACHE_16KBSize |
16 KB way size.
|
kL2CACHE_32KBSize |
32 KB way size.
|
kL2CACHE_64KBSize |
64 KB way size.
|
kL2CACHE_128KBSize |
128 KB way size.
|
kL2CACHE_256KBSize |
256 KB way size.
|
kL2CACHE_512KBSize |
512 KB way size.
|
Enumerator |
---|
kL2CACHE_Pseudorandom |
Peseudo-random replacement policy using an lfsr.
|
kL2CACHE_Roundrobin |
Round-robin replacemnt policy.
|
Enumerator |
---|
kL2CACHE_UseAwcache |
Use AWCAHE attribute for the write allocate.
|
kL2CACHE_NoWriteallocate |
Force no write allocate.
|
kL2CACHE_forceWriteallocate |
Force write allocate when write misses.
|
Enumerator |
---|
kL2CACHE_1CycleLate |
1 cycle of latency.
|
kL2CACHE_2CycleLate |
2 cycle of latency.
|
kL2CACHE_3CycleLate |
3 cycle of latency.
|
kL2CACHE_4CycleLate |
4 cycle of latency.
|
kL2CACHE_5CycleLate |
5 cycle of latency.
|
kL2CACHE_6CycleLate |
6 cycle of latency.
|
kL2CACHE_7CycleLate |
7 cycle of latency.
|
kL2CACHE_8CycleLate |
8 cycle of latency.
|
void L1CACHE_InvalidateICacheByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
- Parameters
-
address | The start address of the memory to be invalidated. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L1 I-cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
static void L1CACHE_InvalidateDCacheByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
|
inlinestatic |
- Parameters
-
address | The start address of the memory to be invalidated. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L1 D-cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
static void L1CACHE_CleanDCacheByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
|
inlinestatic |
- Parameters
-
address | The start address of the memory to be cleaned. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L1 D-cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
static void L1CACHE_CleanInvalidateDCacheByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
|
inlinestatic |
- Parameters
-
address | The start address of the memory to be clean and invalidated. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L1 D-cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
- Parameters
-
config | Pointer to configuration structure. See "l2cache_config_t". |
This function initializes the cache controller configuration structure with default settings. The default values are:
* config->waySize = kL2CACHE_32KbSize;
* config->lateConfig = NULL;
* config->istrPrefetchEnable = false;
* config->dataPrefetchEnable = false;
* config->nsLockdownEnable = false;
*
- Parameters
-
config | Pointer to the configuration structure. |
void L2CACHE_Enable |
( |
void |
| ) |
|
This function enables the cache controller. Must be written using a secure access. If write with a Non-secure access will cause a DECERR response.
void L2CACHE_Disable |
( |
void |
| ) |
|
This function disables the cache controller. Must be written using a secure access. If write with a Non-secure access will cause a DECERR response.
void L2CACHE_Invalidate |
( |
void |
| ) |
|
This function invalidates all entries in cache.
void L2CACHE_InvalidateByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
This function invalidates all cache lines between two physical addresses.
- Parameters
-
address | The start address of the memory to be invalidated. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L2 line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void L2CACHE_Clean |
( |
void |
| ) |
|
This function cleans all entries in the level 2 cache controller.
void L2CACHE_CleanByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
This function cleans all cache lines between two physical addresses.
- Parameters
-
address | The start address of the memory to be cleaned. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L2 line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void L2CACHE_CleanInvalidate |
( |
void |
| ) |
|
This function cleans and invalidates all entries in the level 2 cache controller.
void L2CACHE_CleanInvalidateByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
This function cleans and invalidates all cache lines between two physical addresses.
- Parameters
-
address | The start address of the memory to be cleaned and invalidated. |
size_byte | The memory size. |
- Note
- The start address and size_byte should be 32-byte(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) aligned. The startAddr here will be forced to align to L2 line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void L2CACHE_LockdownByWayEnable |
( |
uint32_t |
masterId, |
|
|
uint32_t |
mask, |
|
|
bool |
enable |
|
) |
| |
This function locks down the cached instruction/data by way and prevent the adresses from being allocated and prevent dara from being evicted out of the level 2 cache. But the normal cache maintenance operations that invalidate, clean or clean and validate cache contents affect the locked-down cache lines as normal.
- Parameters
-
masterId | The master id, range from 0 ~ 7. |
mask | The ways to be enabled or disabled to lockdown. each bit in value is related to each way of the cache. for example: value: bit 0 ---— way 0. value: bit 1 ---— way 1.
|
value: bit 15 ---— way 15. Note: please make sure the value setting is align with your supported ways.
- Parameters
-
enable | True enable the lockdown, false to disable the lockdown. |
void ICACHE_InvalidateByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte.
- Parameters
-
address | The physical address. |
size_byte | size of the memory to be invalidated. |
- Note
- address and size should be aligned to cache line size 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced to align to the cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void DCACHE_InvalidateByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte.
- Parameters
-
address | The physical address. |
size_byte | size of the memory to be invalidated. |
- Note
- address and size should be aligned to cache line size 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced to align to the cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void DCACHE_CleanByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte.
- Parameters
-
address | The physical address. |
size_byte | size of the memory to be cleaned. |
- Note
- address and size should be aligned to cache line size 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced to align to the cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.
void DCACHE_CleanInvalidateByRange |
( |
uint32_t |
address, |
|
|
uint32_t |
size_byte |
|
) |
| |
Both cortex-m7 L1 cache line and L2 PL310 cache line length is 32-byte.
- Parameters
-
address | The physical address. |
size_byte | size of the memory to be cleaned and invalidated. |
- Note
- address and size should be aligned to cache line size 32-Byte due to the cache operation unit is one cache line. The startAddr here will be forced to align to the cache line size if startAddr is not aligned. For the size_byte, application should make sure the alignment or make sure the right operation order if the size_byte is not aligned.