14#if defined(CONFIG_AARCH32_ARMV8_R) 
   15#define MPU_IR_REGION_Msk (0xFFU) 
   16#define MPU_IR_REGION_Pos 8U 
   18#define MPU_RBAR_BASE_Pos 6U 
   19#define MPU_RBAR_BASE_Msk (0x3FFFFFFFFFFFFFFUL << MPU_RBAR_BASE_Pos) 
   20#define MPU_RBAR_SH_Pos   3U 
   21#define MPU_RBAR_SH_Msk   (0x3UL << MPU_RBAR_SH_Pos) 
   22#define MPU_RBAR_AP_Pos   1U 
   23#define MPU_RBAR_AP_Msk   (0x3UL << MPU_RBAR_AP_Pos) 
   25#define MPU_RBAR_XN_Pos   0U 
   26#define MPU_RBAR_XN_Msk   (0x1UL << MPU_RBAR_XN_Pos) 
   29#define MPU_RLAR_LIMIT_Pos    6U 
   30#define MPU_RLAR_LIMIT_Msk    (0x3FFFFFFFFFFFFFFUL << MPU_RLAR_LIMIT_Pos) 
   31#define MPU_RLAR_AttrIndx_Pos 1U 
   32#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) 
   33#define MPU_RLAR_EN_Msk       (0x1UL) 
   35#include <cmsis_core.h> 
   46#define P_RW_U_NA_Msk   ((P_RW_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   52#define P_RW_U_RW_Msk   ((P_RW_U_RW << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   54#define FULL_ACCESS     0x1 
   55#define FULL_ACCESS_Msk ((FULL_ACCESS << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   58#define P_RO_U_NA_Msk   ((P_RO_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   61#define P_RO_U_RO_Msk   ((P_RO_U_RO << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   64#define RO_Msk          ((RO << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) 
   67#define NOT_EXEC MPU_RBAR_XN_Msk 
   70#define NON_SHAREABLE       0x0 
   71#define NON_SHAREABLE_Msk   ((NON_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) 
   72#define OUTER_SHAREABLE     0x2 
   73#define OUTER_SHAREABLE_Msk ((OUTER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) 
   74#define INNER_SHAREABLE     0x3 
   75#define INNER_SHAREABLE_Msk ((INNER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) 
   78#define REGION_LIMIT_ADDR(base, size) (((base & MPU_RBAR_BASE_Msk) + size - 1) & MPU_RLAR_LIMIT_Msk) 
  100#define DEVICE_nGnRnE 0x0U 
  101#define DEVICE_nGnRE  0x4U 
  102#define DEVICE_nGRE   0x8U 
  103#define DEVICE_GRE    0xCU 
  106#define R_NON_W_NON     0x0  
  107#define R_NON_W_ALLOC   0x1  
  108#define R_ALLOC_W_NON   0x2  
  109#define R_ALLOC_W_ALLOC 0x3  
  112#define NORMAL_O_WT_NT 0x80  
  113#define NORMAL_O_WB_NT 0xC0  
  114#define NORMAL_O_NON_C 0x40  
  116#define NORMAL_I_WT_NT 0x08  
  117#define NORMAL_I_WB_NT 0x0C  
  118#define NORMAL_I_NON_C 0x04  
  120#define NORMAL_OUTER_INNER_WRITE_THROUGH_READ_ALLOCATE_NON_TRANS                                   \ 
  121        ((NORMAL_O_WT_NT | (R_ALLOC_W_NON << 4)) | (NORMAL_I_WT_NT | R_ALLOC_W_NON)) 
 
  123#define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_TRANS                                \ 
  124        ((NORMAL_O_WB_NT | (R_ALLOC_W_ALLOC << 4)) | (NORMAL_I_WB_NT | R_ALLOC_W_ALLOC)) 
 
  126#define NORMAL_OUTER_INNER_NON_CACHEABLE                                                           \ 
  127        ((NORMAL_O_NON_C | (R_NON_W_NON << 4)) | (NORMAL_I_NON_C | R_NON_W_NON)) 
 
  130#define MPU_CACHE_ATTRIBUTES_FLASH        NORMAL_OUTER_INNER_WRITE_THROUGH_READ_ALLOCATE_NON_TRANS 
  132#define MPU_CACHE_ATTRIBUTES_SRAM                                                                  \ 
  133        NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_TRANS 
 
  135#define MPU_CACHE_ATTRIBUTES_SRAM_NOCACHE NORMAL_OUTER_INNER_NON_CACHEABLE 
  138#define MPU_MAIR_ATTR_FLASH         MPU_CACHE_ATTRIBUTES_FLASH 
  139#define MPU_MAIR_INDEX_FLASH        0 
  140#define MPU_MAIR_ATTR_SRAM          MPU_CACHE_ATTRIBUTES_SRAM 
  141#define MPU_MAIR_INDEX_SRAM         1 
  142#define MPU_MAIR_ATTR_SRAM_NOCACHE  MPU_CACHE_ATTRIBUTES_SRAM_NOCACHE 
  143#define MPU_MAIR_INDEX_SRAM_NOCACHE 2 
  144#define MPU_MAIR_ATTR_DEVICE        DEVICE_nGnRnE 
  145#define MPU_MAIR_INDEX_DEVICE       3 
  151#define MPU_MAIR_ATTRS                                                                             \ 
  152        ((MPU_MAIR_ATTR_FLASH << (MPU_MAIR_INDEX_FLASH * 8)) |                                     \ 
  153         (MPU_MAIR_ATTR_SRAM << (MPU_MAIR_INDEX_SRAM * 8)) |                                       \ 
  154         (MPU_MAIR_ATTR_SRAM_NOCACHE << (MPU_MAIR_INDEX_SRAM_NOCACHE * 8)) |                       \ 
  155         (MPU_MAIR_ATTR_DEVICE << (MPU_MAIR_INDEX_DEVICE * 8))) 
 
  166#if defined(CONFIG_AARCH32_ARMV8_R) 
  168#define ARM_MPU_REGION_INIT(p_name, p_base, p_size, p_attr)                                        \ 
  172                .attr = p_attr(p_base + p_size),                                                   \ 
  175#define REGION_RAM_ATTR(limit)                                                                     \ 
  177                .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk,              \ 
  178                .mair_idx = MPU_MAIR_INDEX_SRAM,                                \ 
  179                .r_limit = limit - 1,                                            \ 
  182#define REGION_RAM_TEXT_ATTR(limit)                                                                \ 
  184                .rbar = P_RO_U_RO_Msk | NON_SHAREABLE_Msk,                         \ 
  185                .mair_idx = MPU_MAIR_INDEX_SRAM,                                \ 
  186                .r_limit = limit - 1,                                            \ 
  189#define REGION_RAM_RO_ATTR(limit)                                                                  \ 
  191                .rbar = NOT_EXEC | P_RO_U_RO_Msk | NON_SHAREABLE_Msk,              \ 
  192                .mair_idx = MPU_MAIR_INDEX_SRAM,                                \ 
  193                .r_limit = limit - 1,                                            \ 
  195#define REGION_RAM_NOCACHE_ATTR(limit)                                                             \ 
  197                .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk,              \ 
  198                .mair_idx = MPU_MAIR_INDEX_SRAM_NOCACHE,                        \ 
  199                .r_limit = limit - 1,                                            \ 
  201#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE) 
  205#define REGION_FLASH_ATTR(limit)                                                                   \ 
  207                .rbar = P_RW_U_RW_Msk | NON_SHAREABLE_Msk,                         \ 
  208                .mair_idx = MPU_MAIR_INDEX_FLASH,                               \ 
  209                .r_limit = limit - 1,                                            \ 
  212#define REGION_FLASH_ATTR(limit)                                                                   \ 
  214                .rbar = RO_Msk | NON_SHAREABLE_Msk,                                \ 
  215                .mair_idx = MPU_MAIR_INDEX_FLASH,                               \ 
  216                .r_limit = limit - 1,                                            \ 
  220#define REGION_DEVICE_ATTR(limit)                                                                  \ 
  222                .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk,              \ 
  223                .mair_idx = MPU_MAIR_INDEX_DEVICE,                              \ 
  224                .r_limit = limit - 1,                                            \ 
  228#define ARM_MPU_REGION_INIT(p_name, p_base, p_size, p_attr)                                        \ 
  232                .attr = p_attr(p_base, p_size),                                                    \ 
 
  240#define REGION_RAM_ATTR(base, size)                                                                \ 
  242                .rbar = IF_ENABLED(CONFIG_XIP, (NOT_EXEC |)) P_RW_U_NA_Msk |                       \ 
  244                .mair_idx = MPU_MAIR_INDEX_SRAM,                                \ 
  245                .r_limit = REGION_LIMIT_ADDR(base, size),                        \ 
 
  249#define REGION_RAM_NOCACHE_ATTR(base, size)                                                        \ 
  251                .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk,              \ 
  252                .mair_idx = MPU_MAIR_INDEX_SRAM_NOCACHE,                        \ 
  253                .r_limit = REGION_LIMIT_ADDR(base, size),                        \ 
 
  256#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE) 
  260#define REGION_FLASH_ATTR(base, size)                                                              \ 
  262                .rbar = P_RW_U_RW_Msk | NON_SHAREABLE_Msk,                         \ 
  263                .mair_idx = MPU_MAIR_INDEX_FLASH,                               \ 
  264                .r_limit = REGION_LIMIT_ADDR(base, size),                        \ 
  267#define REGION_FLASH_ATTR(base, size)                                                              \ 
  269                .rbar = RO_Msk | NON_SHAREABLE_Msk,                                \ 
  270                .mair_idx = MPU_MAIR_INDEX_FLASH,                               \ 
  271                .r_limit = REGION_LIMIT_ADDR(base, size),                        \ 
 
  275#define REGION_DEVICE_ATTR(base, size)                                                             \ 
  277                .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk,              \ 
  278                .mair_idx = MPU_MAIR_INDEX_DEVICE,                              \ 
  279                .r_limit = REGION_LIMIT_ADDR(base, size),                        \ 
 
  312#define K_MEM_PARTITION_P_RW_U_RW                                                                  \ 
  313        ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM}) 
 
  314#define K_MEM_PARTITION_P_RW_U_NA                                                                  \ 
  315        ((k_mem_partition_attr_t){(P_RW_U_NA_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM}) 
 
  316#define K_MEM_PARTITION_P_RO_U_RO                                                                  \ 
  317        ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM}) 
 
  318#define K_MEM_PARTITION_P_RO_U_NA                                                                  \ 
  319        ((k_mem_partition_attr_t){(P_RO_U_NA_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM}) 
 
  322#define K_MEM_PARTITION_P_RWX_U_RWX ((k_mem_partition_attr_t){(P_RW_U_RW_Msk), MPU_MAIR_INDEX_SRAM}) 
  323#define K_MEM_PARTITION_P_RX_U_RX   ((k_mem_partition_attr_t){(P_RO_U_RO_Msk), MPU_MAIR_INDEX_SRAM}) 
  333#define K_MEM_PARTITION_IS_WRITABLE(attr)                                                          \ 
  335                int __is_writable__;                                                               \ 
  336                switch (attr.rbar & MPU_RBAR_AP_Msk) {                                             \ 
  337                case P_RW_U_RW_Msk:                                                                \ 
  338                case P_RW_U_NA_Msk:                                                                \ 
  339                        __is_writable__ = 1;                                                       \ 
  342                        __is_writable__ = 0;                                                       \ 
 
  356#define K_MEM_PARTITION_IS_EXECUTABLE(attr) (!((attr.rbar) & (NOT_EXEC))) 
  361#define K_MEM_PARTITION_P_RW_U_RW_NOCACHE                                                          \ 
  362        ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk),                \ 
  363                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  364#define K_MEM_PARTITION_P_RW_U_NA_NOCACHE                                                          \ 
  365        ((k_mem_partition_attr_t){(P_RW_U_NA_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk),                \ 
  366                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  367#define K_MEM_PARTITION_P_RO_U_RO_NOCACHE                                                          \ 
  368        ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk),                \ 
  369                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  370#define K_MEM_PARTITION_P_RO_U_NA_NOCACHE                                                          \ 
  371        ((k_mem_partition_attr_t){(P_RO_U_NA_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk),                \ 
  372                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  375#define K_MEM_PARTITION_P_RWX_U_RWX_NOCACHE                                                        \ 
  376        ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | OUTER_SHAREABLE_Msk),                           \ 
  377                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  378#define K_MEM_PARTITION_P_RX_U_RX_NOCACHE                                                          \ 
  379        ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | OUTER_SHAREABLE_Msk),                           \ 
  380                                  MPU_MAIR_INDEX_SRAM_NOCACHE}) 
 
  384#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size)                                               \ 
  385        BUILD_ASSERT((size > 0) &&                                                                 \ 
  386                             ((uint32_t)start % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0U) && \ 
  387                             ((size) % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0),             \ 
  388                     "The start and size of the partition must align with the minimum MPU "        \ 
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Definition arm_mpu_v7m.h:135
uint8_t rbar
Definition arm_mpu_v8.h:285
uint32_t r_limit
Definition arm_mpu_v8.h:289
uint8_t mair_idx
Definition arm_mpu_v8.h:287
Definition arm_mpu_v7m.h:143
uint16_t rbar
Definition arm_mpu_v8.h:296
uint16_t mair_idx
Definition arm_mpu_v8.h:297