File indexing completed on 2025-05-11 08:22:52
0001
0002
0003
0004
0005
0006
0007
0008 #include "fsl_cache.h"
0009
0010
0011
0012
0013
0014 #ifndef FSL_COMPONENT_ID
0015 #define FSL_COMPONENT_ID "platform.drivers.cache_lmem"
0016 #endif
0017
0018 #define L1CACHE_ONEWAYSIZE_BYTE (4096U)
0019 #define L1CACHE_CODEBUSADDR_BOUNDARY (0x1FFFFFFFU)
0020
0021
0022
0023
0024 #if (FSL_FEATURE_SOC_LMEM_COUNT == 1)
0025
0026
0027
0028
0029 void L1CACHE_EnableCodeCache(void)
0030 {
0031 if (0U == (LMEM->PCCCR & LMEM_PCCCR_ENCACHE_MASK))
0032 {
0033
0034 L1CACHE_InvalidateCodeCache();
0035
0036
0037 LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK;
0038 }
0039 }
0040
0041
0042
0043
0044
0045 void L1CACHE_DisableCodeCache(void)
0046 {
0047
0048 L1CACHE_CleanCodeCache();
0049
0050
0051 LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK;
0052 }
0053
0054
0055
0056
0057
0058 void L1CACHE_InvalidateCodeCache(void)
0059 {
0060
0061
0062 LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;
0063
0064
0065 while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U)
0066 {
0067 }
0068
0069
0070 LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083 void L1CACHE_InvalidateCodeCacheByRange(uint32_t address, uint32_t size_byte)
0084 {
0085 uint32_t endAddr = address + size_byte;
0086 uint32_t pccReg = 0;
0087
0088 uint32_t startAddr = address & ~((uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE - 1U);
0089
0090
0091 pccReg = (LMEM->PCCLCR & ~LMEM_PCCLCR_LCMD_MASK) | LMEM_PCCLCR_LCMD(1) | LMEM_PCCLCR_LADSEL_MASK;
0092 LMEM->PCCLCR = pccReg;
0093
0094 while (startAddr < endAddr)
0095 {
0096
0097 LMEM->PCCSAR = (startAddr & LMEM_PCCSAR_PHYADDR_MASK) | LMEM_PCCSAR_LGO_MASK;
0098
0099
0100 while ((LMEM->PCCSAR & LMEM_PCCSAR_LGO_MASK) != 0U)
0101 {
0102 }
0103 startAddr += (uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE;
0104 }
0105 }
0106
0107
0108
0109
0110
0111 void L1CACHE_CleanCodeCache(void)
0112 {
0113
0114 LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK;
0115
0116
0117 while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U)
0118 {
0119 }
0120
0121
0122 LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK);
0123 }
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 void L1CACHE_CleanCodeCacheByRange(uint32_t address, uint32_t size_byte)
0136 {
0137 uint32_t endAddr = address + size_byte;
0138 uint32_t pccReg = 0;
0139
0140 uint32_t startAddr = address & ~((uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE - 1U);
0141
0142
0143 pccReg = (LMEM->PCCLCR & ~LMEM_PCCLCR_LCMD_MASK) | LMEM_PCCLCR_LCMD(2) | LMEM_PCCLCR_LADSEL_MASK;
0144 LMEM->PCCLCR = pccReg;
0145
0146 while (startAddr < endAddr)
0147 {
0148
0149 LMEM->PCCSAR = (startAddr & LMEM_PCCSAR_PHYADDR_MASK) | LMEM_PCCSAR_LGO_MASK;
0150
0151
0152 while ((LMEM->PCCSAR & LMEM_PCCSAR_LGO_MASK) != 0U)
0153 {
0154 }
0155 startAddr += (uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE;
0156 }
0157 }
0158
0159
0160
0161
0162
0163 void L1CACHE_CleanInvalidateCodeCache(void)
0164 {
0165
0166 LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK |
0167 LMEM_PCCCR_GO_MASK;
0168
0169
0170 while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U)
0171 {
0172 }
0173
0174
0175 LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
0176 }
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188 void L1CACHE_CleanInvalidateCodeCacheByRange(uint32_t address, uint32_t size_byte)
0189 {
0190 uint32_t endAddr = address + size_byte;
0191 uint32_t pccReg = 0;
0192
0193 uint32_t startAddr = address & ~((uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE - 1U);
0194
0195
0196 pccReg = (LMEM->PCCLCR & ~LMEM_PCCLCR_LCMD_MASK) | LMEM_PCCLCR_LCMD(3) | LMEM_PCCLCR_LADSEL_MASK;
0197 LMEM->PCCLCR = pccReg;
0198
0199 while (startAddr < endAddr)
0200 {
0201
0202 LMEM->PCCSAR = (startAddr & LMEM_PCCSAR_PHYADDR_MASK) | LMEM_PCCSAR_LGO_MASK;
0203
0204
0205 while ((LMEM->PCCSAR & LMEM_PCCSAR_LGO_MASK) != 0U)
0206 {
0207 }
0208 startAddr += (uint32_t)L1CODEBUSCACHE_LINESIZE_BYTE;
0209 }
0210 }
0211
0212 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0213
0214
0215
0216
0217 void L1CACHE_EnableSystemCache(void)
0218 {
0219
0220 if (0U == (LMEM->PSCCR & LMEM_PSCCR_ENCACHE_MASK))
0221 {
0222
0223 L1CACHE_InvalidateSystemCache();
0224
0225
0226 LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK;
0227 }
0228 }
0229
0230
0231
0232
0233
0234 void L1CACHE_DisableSystemCache(void)
0235 {
0236
0237 L1CACHE_CleanSystemCache();
0238
0239
0240 LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK;
0241 }
0242
0243
0244
0245
0246
0247 void L1CACHE_InvalidateSystemCache(void)
0248 {
0249
0250
0251 LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK;
0252
0253
0254 while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U)
0255 {
0256 }
0257
0258
0259 LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);
0260 }
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272 void L1CACHE_InvalidateSystemCacheByRange(uint32_t address, uint32_t size_byte)
0273 {
0274 uint32_t endAddr = address + size_byte;
0275 uint32_t pscReg = 0;
0276 uint32_t startAddr =
0277 address & ~((uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE - 1U);
0278
0279
0280 pscReg = (LMEM->PSCLCR & ~LMEM_PSCLCR_LCMD_MASK) | LMEM_PSCLCR_LCMD(1) | LMEM_PSCLCR_LADSEL_MASK;
0281 LMEM->PSCLCR = pscReg;
0282
0283 while (startAddr < endAddr)
0284 {
0285
0286 LMEM->PSCSAR = (startAddr & LMEM_PSCSAR_PHYADDR_MASK) | LMEM_PSCSAR_LGO_MASK;
0287
0288
0289 while ((LMEM->PSCSAR & LMEM_PSCSAR_LGO_MASK) != 0U)
0290 {
0291 }
0292 startAddr += (uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE;
0293 }
0294 }
0295
0296
0297
0298
0299
0300 void L1CACHE_CleanSystemCache(void)
0301 {
0302
0303 LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK;
0304
0305
0306 while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U)
0307 {
0308 }
0309
0310
0311 LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK);
0312 }
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324 void L1CACHE_CleanSystemCacheByRange(uint32_t address, uint32_t size_byte)
0325 {
0326 uint32_t endAddr = address + size_byte;
0327 uint32_t pscReg = 0;
0328 uint32_t startAddr =
0329 address & ~((uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE - 1U);
0330
0331
0332 pscReg = (LMEM->PSCLCR & ~LMEM_PSCLCR_LCMD_MASK) | LMEM_PSCLCR_LCMD(2) | LMEM_PSCLCR_LADSEL_MASK;
0333 LMEM->PSCLCR = pscReg;
0334
0335 while (startAddr < endAddr)
0336 {
0337
0338 LMEM->PSCSAR = (startAddr & LMEM_PSCSAR_PHYADDR_MASK) | LMEM_PSCSAR_LGO_MASK;
0339
0340
0341 while ((LMEM->PSCSAR & LMEM_PSCSAR_LGO_MASK) != 0U)
0342 {
0343 }
0344 startAddr += (uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE;
0345 }
0346 }
0347
0348
0349
0350
0351
0352 void L1CACHE_CleanInvalidateSystemCache(void)
0353 {
0354
0355 LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK |
0356 LMEM_PSCCR_GO_MASK;
0357
0358
0359 while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U)
0360 {
0361 }
0362
0363
0364 LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);
0365 }
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377 void L1CACHE_CleanInvalidateSystemCacheByRange(uint32_t address, uint32_t size_byte)
0378 {
0379 uint32_t endAddr = address + size_byte;
0380 uint32_t pscReg = 0;
0381 uint32_t startAddr =
0382 address & ~((uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE - 1U);
0383
0384
0385 pscReg = (LMEM->PSCLCR & ~LMEM_PSCLCR_LCMD_MASK) | LMEM_PSCLCR_LCMD(3) | LMEM_PSCLCR_LADSEL_MASK;
0386 LMEM->PSCLCR = pscReg;
0387
0388 while (startAddr < endAddr)
0389 {
0390
0391 LMEM->PSCSAR = (startAddr & LMEM_PSCSAR_PHYADDR_MASK) | LMEM_PSCSAR_LGO_MASK;
0392
0393
0394 while ((LMEM->PSCSAR & LMEM_PSCSAR_LGO_MASK) != 0U)
0395 {
0396 }
0397 startAddr += (uint32_t)L1SYSTEMBUSCACHE_LINESIZE_BYTE;
0398 }
0399 }
0400
0401 #endif
0402 #endif
0403
0404
0405
0406
0407
0408
0409
0410
0411 void L1CACHE_InvalidateICacheByRange(uint32_t address, uint32_t size_byte)
0412 {
0413 #if (FSL_FEATURE_SOC_LMEM_COUNT == 1)
0414 uint32_t endAddr = address + size_byte;
0415 uint32_t size = size_byte;
0416
0417 if (endAddr <= L1CACHE_CODEBUSADDR_BOUNDARY)
0418 {
0419 L1CACHE_InvalidateCodeCacheByRange(address, size);
0420 }
0421 else if (address <= L1CACHE_CODEBUSADDR_BOUNDARY)
0422 {
0423 size = L1CACHE_CODEBUSADDR_BOUNDARY - address;
0424 L1CACHE_InvalidateCodeCacheByRange(address, size);
0425 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0426 size = size_byte - size;
0427 L1CACHE_InvalidateSystemCacheByRange((L1CACHE_CODEBUSADDR_BOUNDARY + 1U), size);
0428 #endif
0429 }
0430 else
0431 {
0432 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0433 L1CACHE_InvalidateSystemCacheByRange(address, size);
0434 #endif
0435 }
0436 #endif
0437 }
0438
0439
0440
0441
0442
0443
0444
0445
0446 void L1CACHE_CleanDCacheByRange(uint32_t address, uint32_t size_byte)
0447 {
0448 #if (FSL_FEATURE_SOC_LMEM_COUNT == 1)
0449 uint32_t endAddr = address + size_byte;
0450 uint32_t size = size_byte;
0451
0452 if (endAddr <= L1CACHE_CODEBUSADDR_BOUNDARY)
0453 {
0454 L1CACHE_CleanCodeCacheByRange(address, size);
0455 }
0456 else if (address <= L1CACHE_CODEBUSADDR_BOUNDARY)
0457 {
0458 size = L1CACHE_CODEBUSADDR_BOUNDARY - address;
0459 L1CACHE_CleanCodeCacheByRange(address, size);
0460 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0461 size = size_byte - size;
0462 L1CACHE_CleanSystemCacheByRange((L1CACHE_CODEBUSADDR_BOUNDARY + 1U), size);
0463 #endif
0464 }
0465 else
0466 {
0467 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0468 L1CACHE_CleanSystemCacheByRange(address, size);
0469 #endif
0470 }
0471 #endif
0472 }
0473
0474
0475
0476
0477
0478
0479
0480
0481 void L1CACHE_CleanInvalidateDCacheByRange(uint32_t address, uint32_t size_byte)
0482 {
0483 #if (FSL_FEATURE_SOC_LMEM_COUNT == 1)
0484 uint32_t endAddr = address + size_byte;
0485 uint32_t size = size_byte;
0486
0487 if (endAddr <= L1CACHE_CODEBUSADDR_BOUNDARY)
0488 {
0489 L1CACHE_CleanInvalidateCodeCacheByRange(address, size);
0490 }
0491 else if (address <= L1CACHE_CODEBUSADDR_BOUNDARY)
0492 {
0493 size = L1CACHE_CODEBUSADDR_BOUNDARY - address;
0494 L1CACHE_CleanInvalidateCodeCacheByRange(address, size);
0495 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0496 size = size_byte - size;
0497 L1CACHE_CleanInvalidateSystemCacheByRange((L1CACHE_CODEBUSADDR_BOUNDARY + 1U), size);
0498 #endif
0499 }
0500 else
0501 {
0502 #if defined(FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE) && FSL_FEATURE_LMEM_HAS_SYSTEMBUS_CACHE
0503 L1CACHE_CleanInvalidateSystemCacheByRange(address, size);
0504 #endif
0505 }
0506 #endif
0507 }