15#if defined(CONFIG_AARCH32_ARMV8_R)
16#define MPU_IR_REGION_Msk (0xFFU)
17#define MPU_IR_REGION_Pos 8U
19#define MPU_RBAR_BASE_Pos 6U
20#define MPU_RBAR_BASE_Msk (0x3FFFFFFFFFFFFFFUL << MPU_RBAR_BASE_Pos)
21#define MPU_RBAR_SH_Pos 3U
22#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos)
23#define MPU_RBAR_AP_Pos 1U
24#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos)
26#define MPU_RBAR_XN_Pos 0U
27#define MPU_RBAR_XN_Msk (0x1UL << MPU_RBAR_XN_Pos)
30#define MPU_RLAR_LIMIT_Pos 6U
31#define MPU_RLAR_LIMIT_Msk (0x3FFFFFFFFFFFFFFUL << MPU_RLAR_LIMIT_Pos)
32#define MPU_RLAR_AttrIndx_Pos 1U
33#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos)
34#define MPU_RLAR_EN_Msk (0x1UL)
36#include <cmsis_core.h>
47#define P_RW_U_NA_Msk ((P_RW_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
53#define P_RW_U_RW_Msk ((P_RW_U_RW << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
55#define FULL_ACCESS 0x1
56#define FULL_ACCESS_Msk ((FULL_ACCESS << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
59#define P_RO_U_NA_Msk ((P_RO_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
62#define P_RO_U_RO_Msk ((P_RO_U_RO << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
65#define RO_Msk ((RO << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
68#define NOT_EXEC MPU_RBAR_XN_Msk
71#define PRIV_EXEC_NEVER (1)
74#define NON_SHAREABLE 0x0
75#define NON_SHAREABLE_Msk ((NON_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
76#define OUTER_SHAREABLE 0x2
77#define OUTER_SHAREABLE_Msk ((OUTER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
78#define INNER_SHAREABLE 0x3
79#define INNER_SHAREABLE_Msk ((INNER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
82#define REGION_LIMIT_ADDR(base, size) (((base & MPU_RBAR_BASE_Msk) + size - 1) & MPU_RLAR_LIMIT_Msk)
104#define DEVICE_nGnRnE 0x0U
105#define DEVICE_nGnRE 0x4U
106#define DEVICE_nGRE 0x8U
107#define DEVICE_GRE 0xCU
110#define R_NON_W_NON 0x0
111#define R_NON_W_ALLOC 0x1
112#define R_ALLOC_W_NON 0x2
113#define R_ALLOC_W_ALLOC 0x3
116#define NORMAL_O_WT_NT 0x80
117#define NORMAL_O_WB_NT 0xC0
118#define NORMAL_O_NON_C 0x40
120#define NORMAL_I_WT_NT 0x08
121#define NORMAL_I_WB_NT 0x0C
122#define NORMAL_I_NON_C 0x04
124#define NORMAL_OUTER_INNER_WRITE_THROUGH_READ_ALLOCATE_NON_TRANS \
125 ((NORMAL_O_WT_NT | (R_ALLOC_W_NON << 4)) | (NORMAL_I_WT_NT | R_ALLOC_W_NON))
127#define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_TRANS \
128 ((NORMAL_O_WB_NT | (R_ALLOC_W_ALLOC << 4)) | (NORMAL_I_WB_NT | R_ALLOC_W_ALLOC))
130#define NORMAL_OUTER_INNER_NON_CACHEABLE \
131 ((NORMAL_O_NON_C | (R_NON_W_NON << 4)) | (NORMAL_I_NON_C | R_NON_W_NON))
134#define MPU_CACHE_ATTRIBUTES_FLASH NORMAL_OUTER_INNER_WRITE_THROUGH_READ_ALLOCATE_NON_TRANS
136#define MPU_CACHE_ATTRIBUTES_SRAM \
137 NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_TRANS
139#define MPU_CACHE_ATTRIBUTES_SRAM_NOCACHE NORMAL_OUTER_INNER_NON_CACHEABLE
142#define MPU_MAIR_ATTR_FLASH MPU_CACHE_ATTRIBUTES_FLASH
143#define MPU_MAIR_INDEX_FLASH 0
144#define MPU_MAIR_ATTR_SRAM MPU_CACHE_ATTRIBUTES_SRAM
145#define MPU_MAIR_INDEX_SRAM 1
146#define MPU_MAIR_ATTR_SRAM_NOCACHE MPU_CACHE_ATTRIBUTES_SRAM_NOCACHE
147#define MPU_MAIR_INDEX_SRAM_NOCACHE 2
148#define MPU_MAIR_ATTR_DEVICE DEVICE_nGnRnE
149#define MPU_MAIR_INDEX_DEVICE 3
155#define MPU_MAIR_ATTRS \
156 ((MPU_MAIR_ATTR_FLASH << (MPU_MAIR_INDEX_FLASH * 8)) | \
157 (MPU_MAIR_ATTR_SRAM << (MPU_MAIR_INDEX_SRAM * 8)) | \
158 (MPU_MAIR_ATTR_SRAM_NOCACHE << (MPU_MAIR_INDEX_SRAM_NOCACHE * 8)) | \
159 (MPU_MAIR_ATTR_DEVICE << (MPU_MAIR_INDEX_DEVICE * 8)))
170#if defined(CONFIG_AARCH32_ARMV8_R)
172#define ARM_MPU_REGION_INIT(p_name, p_base, p_size, p_attr) \
176 .attr = p_attr(p_base + p_size), \
179#define REGION_RAM_ATTR(limit) \
181 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
182 .mair_idx = MPU_MAIR_INDEX_SRAM, \
183 .r_limit = limit - 1, \
186#define REGION_RAM_TEXT_ATTR(limit) \
188 .rbar = P_RO_U_RO_Msk | NON_SHAREABLE_Msk, \
189 .mair_idx = MPU_MAIR_INDEX_SRAM, \
190 .r_limit = limit - 1, \
193#define REGION_RAM_RO_ATTR(limit) \
195 .rbar = NOT_EXEC | P_RO_U_RO_Msk | NON_SHAREABLE_Msk, \
196 .mair_idx = MPU_MAIR_INDEX_SRAM, \
197 .r_limit = limit - 1, \
199#define REGION_RAM_NOCACHE_ATTR(limit) \
201 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
202 .mair_idx = MPU_MAIR_INDEX_SRAM_NOCACHE, \
203 .r_limit = limit - 1, \
205#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE)
209#define REGION_FLASH_ATTR(limit) \
211 .rbar = P_RW_U_RW_Msk | NON_SHAREABLE_Msk, \
212 .mair_idx = MPU_MAIR_INDEX_FLASH, \
213 .r_limit = limit - 1, \
216#define REGION_FLASH_ATTR(limit) \
218 .rbar = RO_Msk | NON_SHAREABLE_Msk, \
219 .mair_idx = MPU_MAIR_INDEX_FLASH, \
220 .r_limit = limit - 1, \
224#define REGION_DEVICE_ATTR(limit) \
226 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
227 .mair_idx = MPU_MAIR_INDEX_DEVICE, \
228 .r_limit = limit - 1, \
232#define ARM_MPU_REGION_INIT(p_name, p_base, p_size, p_attr) \
236 .attr = p_attr(p_base, p_size), \
244#define REGION_RAM_ATTR(base, size) \
246 .rbar = IF_ENABLED(CONFIG_XIP, (NOT_EXEC |)) P_RW_U_NA_Msk | \
248 .mair_idx = MPU_MAIR_INDEX_SRAM, \
249 .r_limit = REGION_LIMIT_ADDR(base, size), \
250 IF_ENABLED(CONFIG_ARM_MPU_PXN, (.pxn = !PRIV_EXEC_NEVER,)) \
253#if defined(CONFIG_ARM_MPU_PXN)
257#define REGION_RAM_ATTR_PXN(base, size) \
259 .rbar = P_RO_U_RO_Msk | NON_SHAREABLE_Msk, \
260 .mair_idx = MPU_MAIR_INDEX_SRAM, \
261 .r_limit = REGION_LIMIT_ADDR(base, size), \
262 .pxn = PRIV_EXEC_NEVER, \
266#define REGION_RAM_NOCACHE_ATTR(base, size) \
268 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
269 .mair_idx = MPU_MAIR_INDEX_SRAM_NOCACHE, \
270 .r_limit = REGION_LIMIT_ADDR(base, size), \
271 IF_ENABLED(CONFIG_ARM_MPU_PXN, (.pxn = PRIV_EXEC_NEVER,)) \
274#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE)
278#define REGION_FLASH_ATTR(base, size) \
280 .rbar = P_RW_U_RW_Msk | NON_SHAREABLE_Msk, \
281 .mair_idx = MPU_MAIR_INDEX_FLASH, \
282 .r_limit = REGION_LIMIT_ADDR(base, size), \
283 IF_ENABLED(CONFIG_ARM_MPU_PXN, (.pxn = !PRIV_EXEC_NEVER,)) \
287#define REGION_FLASH_ATTR(base, size) \
289 .rbar = RO_Msk | NON_SHAREABLE_Msk, \
290 .mair_idx = MPU_MAIR_INDEX_FLASH, \
291 .r_limit = REGION_LIMIT_ADDR(base, size), \
292 IF_ENABLED(CONFIG_ARM_MPU_PXN, (.pxn = !PRIV_EXEC_NEVER,)) \
297#define REGION_DEVICE_ATTR(base, size) \
299 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
300 .mair_idx = MPU_MAIR_INDEX_DEVICE, \
301 .r_limit = REGION_LIMIT_ADDR(base, size), \
302 IF_ENABLED(CONFIG_ARM_MPU_PXN, (.pxn = PRIV_EXEC_NEVER,)) \
315#ifdef CONFIG_ARM_MPU_PXN
327#ifdef CONFIG_ARM_MPU_PXN
345#define K_MEM_PARTITION_P_RW_U_RW \
346 ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM})
347#define K_MEM_PARTITION_P_RW_U_NA \
348 ((k_mem_partition_attr_t){(P_RW_U_NA_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM})
349#define K_MEM_PARTITION_P_RO_U_RO \
350 ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM})
351#define K_MEM_PARTITION_P_RO_U_NA \
352 ((k_mem_partition_attr_t){(P_RO_U_NA_Msk | NOT_EXEC), MPU_MAIR_INDEX_SRAM})
355#define K_MEM_PARTITION_P_RWX_U_RWX ((k_mem_partition_attr_t){(P_RW_U_RW_Msk), MPU_MAIR_INDEX_SRAM})
356#define K_MEM_PARTITION_P_RX_U_RX ((k_mem_partition_attr_t){(P_RO_U_RO_Msk), MPU_MAIR_INDEX_SRAM})
358#ifdef CONFIG_ARM_MPU_PXN
359#define K_MEM_PARTITION_P_R_U_RX \
360 ((k_mem_partition_attr_t){(P_RO_U_RO_Msk), MPU_MAIR_INDEX_SRAM, PRIV_EXEC_NEVER})
371#define K_MEM_PARTITION_IS_WRITABLE(attr) \
373 int __is_writable__; \
374 switch (attr.rbar & MPU_RBAR_AP_Msk) { \
375 case P_RW_U_RW_Msk: \
376 case P_RW_U_NA_Msk: \
377 __is_writable__ = 1; \
380 __is_writable__ = 0; \
394#define K_MEM_PARTITION_IS_EXECUTABLE(attr) (!((attr.rbar) & (NOT_EXEC)))
399#define K_MEM_PARTITION_P_RW_U_RW_NOCACHE \
400 ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk), \
401 MPU_MAIR_INDEX_SRAM_NOCACHE})
402#define K_MEM_PARTITION_P_RW_U_NA_NOCACHE \
403 ((k_mem_partition_attr_t){(P_RW_U_NA_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk), \
404 MPU_MAIR_INDEX_SRAM_NOCACHE})
405#define K_MEM_PARTITION_P_RO_U_RO_NOCACHE \
406 ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk), \
407 MPU_MAIR_INDEX_SRAM_NOCACHE})
408#define K_MEM_PARTITION_P_RO_U_NA_NOCACHE \
409 ((k_mem_partition_attr_t){(P_RO_U_NA_Msk | NOT_EXEC | OUTER_SHAREABLE_Msk), \
410 MPU_MAIR_INDEX_SRAM_NOCACHE})
413#define K_MEM_PARTITION_P_RWX_U_RWX_NOCACHE \
414 ((k_mem_partition_attr_t){(P_RW_U_RW_Msk | OUTER_SHAREABLE_Msk), \
415 MPU_MAIR_INDEX_SRAM_NOCACHE})
416#define K_MEM_PARTITION_P_RX_U_RX_NOCACHE \
417 ((k_mem_partition_attr_t){(P_RO_U_RO_Msk | OUTER_SHAREABLE_Msk), \
418 MPU_MAIR_INDEX_SRAM_NOCACHE})
422#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
423 BUILD_ASSERT((size > 0) && \
424 ((uint32_t)start % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0U) && \
425 ((size) % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0), \
426 "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:310
uint32_t r_limit
Definition arm_mpu_v8.h:314
uint8_t mair_idx
Definition arm_mpu_v8.h:312
Definition arm_mpu_v7m.h:143
uint16_t rbar
Definition arm_mpu_v8.h:325
uint16_t mair_idx
Definition arm_mpu_v8.h:326