6#ifndef ZEPHYR_INCLUDE_ARCH_ARM_MPU_NXP_MPU_H_
7#define ZEPHYR_INCLUDE_ARCH_ARM_MPU_NXP_MPU_H_
11#define NXP_MPU_REGION_NUMBER 12
20#define BM2_UM_SHIFT 12
21#define BM3_UM_SHIFT 18
27#define SM_SAME_AS_UM 3
31#define BM2_SM_SHIFT 15
32#define BM3_SM_SHIFT 21
34#define BM4_WE_SHIFT 24
35#define BM4_RE_SHIFT 25
37#if CONFIG_USB_KINETIS || CONFIG_UDC_KINETIS
38#define BM4_PERMISSIONS ((1 << BM4_RE_SHIFT) | (1 << BM4_WE_SHIFT))
40#define BM4_PERMISSIONS 0
44#define MPU_REGION_READ ((UM_READ << BM0_UM_SHIFT) | \
45 (UM_READ << BM1_UM_SHIFT) | \
46 (UM_READ << BM2_UM_SHIFT) | \
47 (UM_READ << BM3_UM_SHIFT))
50#define MPU_REGION_WRITE ((UM_WRITE << BM0_UM_SHIFT) | \
51 (UM_WRITE << BM1_UM_SHIFT) | \
52 (UM_WRITE << BM2_UM_SHIFT) | \
53 (UM_WRITE << BM3_UM_SHIFT))
56#define MPU_REGION_EXEC ((UM_EXEC << BM0_UM_SHIFT) | \
57 (UM_EXEC << BM1_UM_SHIFT) | \
58 (UM_EXEC << BM2_UM_SHIFT) | \
59 (UM_EXEC << BM3_UM_SHIFT))
62#define MPU_REGION_SU ((SM_SAME_AS_UM << BM0_SM_SHIFT) | \
63 (SM_SAME_AS_UM << BM1_SM_SHIFT) | \
64 (SM_SAME_AS_UM << BM2_SM_SHIFT) | \
65 (SM_SAME_AS_UM << BM3_SM_SHIFT))
67#define MPU_REGION_SU_RX ((SM_RX_ALLOW << BM0_SM_SHIFT) | \
68 (SM_RX_ALLOW << BM1_SM_SHIFT) | \
69 (SM_RX_ALLOW << BM2_SM_SHIFT) | \
70 (SM_RX_ALLOW << BM3_SM_SHIFT))
72#define MPU_REGION_SU_RW ((SM_RW_ALLOW << BM0_SM_SHIFT) | \
73 (SM_RW_ALLOW << BM1_SM_SHIFT) | \
74 (SM_RW_ALLOW << BM2_SM_SHIFT) | \
75 (SM_RW_ALLOW << BM3_SM_SHIFT))
77#define MPU_REGION_SU_RWX ((SM_RWX_ALLOW << BM0_SM_SHIFT) | \
78 (SM_RWX_ALLOW << BM1_SM_SHIFT) | \
79 (SM_RWX_ALLOW << BM2_SM_SHIFT) | \
80 (SM_RWX_ALLOW << BM3_SM_SHIFT))
83#define ENDADDR_ROUND(x) (x - 0x1F)
85#define REGION_USER_MODE_ATTR {(MPU_REGION_READ | \
90#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE)
91#define REGION_RAM_ATTR {((MPU_REGION_SU_RWX) | \
92 ((UM_READ | UM_WRITE | UM_EXEC) << BM3_UM_SHIFT) | \
95#define REGION_FLASH_ATTR {(MPU_REGION_SU_RWX)}
98#define REGION_RAM_ATTR {((MPU_REGION_SU_RW) | \
99 ((UM_READ | UM_WRITE) << BM3_UM_SHIFT) | \
102#define REGION_FLASH_ATTR {(MPU_REGION_READ | \
107#define REGION_IO_ATTR {(MPU_REGION_READ | \
112#define REGION_RO_ATTR {(MPU_REGION_READ | MPU_REGION_SU)}
114#define REGION_USER_RO_ATTR {(MPU_REGION_READ | \
120#define REGION_DEBUGGER_AND_DEVICE_ATTR {((MPU_REGION_SU) | \
121 ((UM_READ | UM_WRITE) << BM3_UM_SHIFT) | \
124#define REGION_DEBUG_ATTR {MPU_REGION_SU}
126#define REGION_BACKGROUND_ATTR {MPU_REGION_SU_RW}
148#define K_MEM_PARTITION_P_NA_U_NA ((k_mem_partition_attr_t) \
150#define K_MEM_PARTITION_P_RW_U_RW ((k_mem_partition_attr_t) \
151 {(MPU_REGION_READ | MPU_REGION_WRITE | MPU_REGION_SU)})
152#define K_MEM_PARTITION_P_RW_U_RO ((k_mem_partition_attr_t) \
153 {(MPU_REGION_READ | MPU_REGION_SU_RW)})
154#define K_MEM_PARTITION_P_RW_U_NA ((k_mem_partition_attr_t) \
155 {(MPU_REGION_SU_RW)})
156#define K_MEM_PARTITION_P_RO_U_RO ((k_mem_partition_attr_t) \
157 {(MPU_REGION_READ | MPU_REGION_SU)})
158#define K_MEM_PARTITION_P_RO_U_NA ((k_mem_partition_attr_t) \
159 {(MPU_REGION_SU_RX)})
162#define K_MEM_PARTITION_P_RWX_U_RWX ((k_mem_partition_attr_t) \
163 {(MPU_REGION_READ | MPU_REGION_WRITE | \
164 MPU_REGION_EXEC | MPU_REGION_SU)})
165#define K_MEM_PARTITION_P_RWX_U_RX ((k_mem_partition_attr_t) \
166 {(MPU_REGION_READ | MPU_REGION_EXEC | MPU_REGION_SU_RWX)})
167#define K_MEM_PARTITION_P_RX_U_RX ((k_mem_partition_attr_t) \
168 {(MPU_REGION_READ | MPU_REGION_EXEC | MPU_REGION_SU)})
178#define K_MEM_PARTITION_IS_WRITABLE(attr) \
180 int __is_writable__; \
181 switch (attr.ap_attr) { \
182 case MPU_REGION_WRITE: \
183 case MPU_REGION_SU_RW: \
184 __is_writable__ = 1; \
187 __is_writable__ = 0; \
201#define K_MEM_PARTITION_IS_EXECUTABLE(attr) \
203 int __is_executable__; \
204 switch (attr.ap_attr) { \
205 case MPU_REGION_SU_RX: \
206 case MPU_REGION_EXEC: \
207 __is_executable__ = 1; \
210 __is_executable__ = 0; \
228#define MPU_REGION_ENTRY(_name, _base, _end, _attr) \
258#define _ARCH_MEM_PARTITION_ALIGN_CHECK(start, size) \
259 BUILD_ASSERT((size) % \
260 CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0 && \
261 (size) >= CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE && \
262 (uint32_t)(start) % CONFIG_ARM_MPU_REGION_MIN_ALIGN_AND_SIZE == 0, \
263 "the size of the partition must align with minimum MPU \
265 " and greater than or equal to minimum MPU region size." \
266 "start address of the partition must align with minimum MPU \
const struct nxp_mpu_config mpu_config
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Definition arm_mpu_v7m.h:160
uint32_t ap_attr
Definition nxp_mpu.h:137
uint32_t sram_region
Definition nxp_mpu.h:243
const struct nxp_mpu_region * mpu_regions
Definition nxp_mpu.h:241
uint32_t num_regions
Definition nxp_mpu.h:239
uint32_t attr
Definition nxp_mpu.h:130
uint32_t base
Definition nxp_mpu.h:219
const char * name
Definition nxp_mpu.h:223
uint32_t end
Definition nxp_mpu.h:221
nxp_mpu_region_attr_t attr
Definition nxp_mpu.h:225