Skip to content

Commit c49f36d

Browse files
authored
Hotfix/mpu config (#552)
* fix(MPU): Fix using undefined behaviour config * style(MPU): Add clarifying comments
1 parent 332e04d commit c49f36d

1 file changed

Lines changed: 19 additions & 9 deletions

File tree

Inc/HALAL/Models/MPU.hpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ struct MPUDomain {
341341

342342
static void configure_dynamic_region(uintptr_t start, uintptr_t end, uint8_t region_num) {
343343
if (end <= start) return;
344+
// Dx NC (Normal, Non-Cacheable)
345+
// TEX=1, C=0, B=0: Normal, Non-Cacheable
346+
// Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
344347
configure_region(start, end - start, region_num,
345348
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
346349
MPU_ACCESS_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
@@ -371,39 +374,46 @@ struct MPUDomain {
371374
MPU_ACCESS_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_BUFFERABLE);
372375

373376
// Flash (Normal, Cacheable)
374-
// TEX=1, C=1, B=0: Normal, Write-Through (Read optimized)
377+
// TEX=0, C=1, B=0: Normal, Write-Through, No Read-Allocate (Read optimized)
375378
// Not Shareable to allow full caching
376379
configure_region(reinterpret_cast<uintptr_t>(&__flash_base), reinterpret_cast<size_t>(&__flash_size), MPU_REGION_NUMBER1,
377-
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
380+
MPU_TEX_LEVEL0, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
378381
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
379382

380383
// DTCM (Normal, Cacheable)
381-
// Uses Normal memory attributes. TCM access is uncached by hardware, but "Normal" allows unaligned access.
384+
// TEX=1, C=1, B=1: Normal, Write-Back, Write and Read Allocate
385+
// TCMs are like Cache, so they are not really cacheable, and the MPU settings are ignored
382386
configure_region(reinterpret_cast<uintptr_t>(&__dtcm_base), reinterpret_cast<size_t>(&__dtcm_size), MPU_REGION_NUMBER10,
383387
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
384388
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
385389

386390
// ITCM (Normal, Cacheable)
391+
// TEX=0, C=1, B=0: Normal, Write-Through, No Read-Allocate (Read optimized)
392+
// TCMs are like Cache, so they are not really cacheable, and the MPU settings are ignored
387393
configure_region(reinterpret_cast<uintptr_t>(&__itcm_base), reinterpret_cast<size_t>(&__itcm_size), MPU_REGION_NUMBER11,
388-
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
389-
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
394+
MPU_TEX_LEVEL0, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
395+
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
390396

391397
// D1 RAM Cached (Normal, WBWA)
392398
// TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
393-
// Not Shareable ensures strict L1 utilization.
399+
// Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
394400
configure_region(reinterpret_cast<uintptr_t>(&__ram_d1_base), reinterpret_cast<size_t>(&__ram_d1_size), MPU_REGION_NUMBER2,
395401
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
396-
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
402+
MPU_ACCESS_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
397403

398404
// D2 RAM Cached (Normal, WBWA)
405+
// TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
406+
// Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
399407
configure_region(reinterpret_cast<uintptr_t>(&__ram_d2_base), reinterpret_cast<size_t>(&__ram_d2_size), MPU_REGION_NUMBER4,
400408
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
401-
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
409+
MPU_ACCESS_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
402410

403411
// D3 RAM Cached (Normal, WBWA)
412+
// TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
413+
// Shareable since it can be accessed by multiple masters (CPU, DMA, etc)
404414
configure_region(reinterpret_cast<uintptr_t>(&__ram_d3_base), reinterpret_cast<size_t>(&__ram_d3_size), MPU_REGION_NUMBER6,
405415
MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
406-
MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
416+
MPU_ACCESS_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
407417
}
408418

409419
static void configure_region(uintptr_t base, size_t size, uint8_t region_num,

0 commit comments

Comments
 (0)