Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
arm_mpu.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Linaro Limited.
3 * Copyright (c) 2018 Nordic Semiconductor ASA.
4 * Copyright (c) 2021 Arm Limited (or its affiliates). All rights reserved.
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8#ifndef ZEPHYR_INCLUDE_ARCH_ARM64_CORTEX_R_MPU_ARM_MPU_H_
9#define ZEPHYR_INCLUDE_ARCH_ARM64_CORTEX_R_MPU_ARM_MPU_H_
10
11#ifndef _ASMLANGUAGE
12/*
13 * Convenience macros to represent the ARMv8-R64-specific configuration
14 * for memory access permission and cache-ability attribution.
15 */
16/* MPU MPUIR Register Definitions */
17#define MPU_IR_REGION_Msk (0xFFU)
18/* MPU RBAR Register attribute msk Definitions */
19#define MPU_RBAR_BASE_Pos 6U
20#define MPU_RBAR_BASE_Msk (0x3FFFFFFFFFFFFFFUL << MPU_RBAR_BASE_Pos)
21#define MPU_RBAR_SH_Pos 4U
22#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos)
23#define MPU_RBAR_AP_Pos 2U
24#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos)
25/* RBAR_EL1 XN */
26#define MPU_RBAR_XN_Pos 1U
27#define MPU_RBAR_XN_Msk (0x1UL << MPU_RBAR_XN_Pos)
28
29/* MPU PLBAR_ELx Register Definitions */
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)
35
36/* PRBAR_ELx: Attribute flag for not-allowing execution (eXecute Never) */
37#define NOT_EXEC MPU_RBAR_XN_Msk /* PRBAR_EL1 */
38
39/* PRBAR_ELx: Attribute flag for access permissions */
40/* Privileged Read Write, Unprivileged No Access */
41#define P_RW_U_NA 0x0U
42#define P_RW_U_NA_Msk ((P_RW_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
43/* Privileged Read Write, Unprivileged Read Write */
44#define P_RW_U_RW 0x1U
45#define P_RW_U_RW_Msk ((P_RW_U_RW << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
46/* Privileged Read Only, Unprivileged No Access */
47#define P_RO_U_NA 0x2U
48#define P_RO_U_NA_Msk ((P_RO_U_NA << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
49/* Privileged Read Only, Unprivileged Read Only */
50#define P_RO_U_RO 0x3U
51#define P_RO_U_RO_Msk ((P_RO_U_RO << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk)
52
53/* PRBAR_ELx: Attribute flags for share-ability */
54#define NON_SHAREABLE 0x0U
55#define NON_SHAREABLE_Msk \
56 ((NON_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
57#define OUTER_SHAREABLE 0x2U
58#define OUTER_SHAREABLE_Msk \
59 ((OUTER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
60#define INNER_SHAREABLE 0x3U
61#define INNER_SHAREABLE_Msk \
62 ((INNER_SHAREABLE << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk)
63
64/* MPIR_ELx Attribute flags for cache-ability */
65
66/* Memory Attributes for Device Memory
67 * 1.Gathering (G/nG)
68 * Determines whether multiple accesses can be merged into a single
69 * bus transaction.
70 * nG: Number/size of accesses on the bus = number/size of accesses
71 * in code.
72 *
73 * 2.Reordering (R/nR)
74 * Determines whether accesses to the same device can be reordered.
75 * nR: Accesses to the same IMPLEMENTATION DEFINED block size will
76 * appear on the bus in program order.
77 *
78 * 3 Early Write Acknowledgment (E/nE)
79 * Indicates to the memory system whether a buffer can send
80 * acknowledgements.
81 * nE: The response should come from the end slave, not buffering in
82 * the interconnect.
83 */
84#define DEVICE_nGnRnE 0x0U
85#define DEVICE_nGnRE 0x4U
86#define DEVICE_nGRE 0x8U
87#define DEVICE_GRE 0xCU
88
89/* Read/Write Allocation Configurations for Cacheable Memory */
90#define R_NON_W_NON 0x0U /* Do not allocate Read/Write */
91#define R_NON_W_ALLOC 0x1U /* Do not allocate Read, Allocate Write */
92#define R_ALLOC_W_NON 0x2U /* Allocate Read, Do not allocate Write */
93#define R_ALLOC_W_ALLOC 0x3U /* Allocate Read/Write */
94
95/* Memory Attributes for Normal Memory */
96#define NORMAL_O_WT_NT 0x80U /* Normal, Outer Write-through non-transient */
97#define NORMAL_O_WB_NT 0xC0U /* Normal, Outer Write-back non-transient */
98#define NORMAL_O_NON_C 0x40U /* Normal, Outer Non-Cacheable */
99
100#define NORMAL_I_WT_NT 0x08U /* Normal, Inner Write-through non-transient */
101#define NORMAL_I_WB_NT 0x0CU /* Normal, Inner Write-back non-transient */
102#define NORMAL_I_NON_C 0x04U /* Normal, Inner Non-Cacheable */
103
104/* Global MAIR configurations */
105#define MPU_MAIR_INDEX_DEVICE 0U
106#define MPU_MAIR_ATTR_DEVICE (DEVICE_nGnRnE)
107
108#define MPU_MAIR_INDEX_FLASH 1U
109#define MPU_MAIR_ATTR_FLASH \
110 ((NORMAL_O_WT_NT | (R_ALLOC_W_NON << 4)) | \
111 (NORMAL_I_WT_NT | R_ALLOC_W_NON))
112
113#define MPU_MAIR_INDEX_SRAM 2U
114#define MPU_MAIR_ATTR_SRAM \
115 ((NORMAL_O_WB_NT | (R_ALLOC_W_ALLOC << 4)) | \
116 (NORMAL_I_WB_NT | R_ALLOC_W_ALLOC))
117
118#define MPU_MAIR_INDEX_SRAM_NOCACHE 3U
119#define MPU_MAIR_ATTR_SRAM_NOCACHE \
120 ((NORMAL_O_NON_C | (R_NON_W_NON << 4)) | \
121 (NORMAL_I_NON_C | R_NON_W_NON))
122
123#define MPU_MAIR_ATTRS \
124 ((MPU_MAIR_ATTR_DEVICE << (MPU_MAIR_INDEX_DEVICE * 8)) | \
125 (MPU_MAIR_ATTR_FLASH << (MPU_MAIR_INDEX_FLASH * 8)) | \
126 (MPU_MAIR_ATTR_SRAM << (MPU_MAIR_INDEX_SRAM * 8)) | \
127 (MPU_MAIR_ATTR_SRAM_NOCACHE << (MPU_MAIR_INDEX_SRAM_NOCACHE * 8)))
128
129/* Some helper defines for common regions.
130 *
131 * Note that the ARMv8-R MPU architecture requires that the
132 * enabled MPU regions are non-overlapping. Therefore, it is
133 * recommended to use these helper defines only for configuring
134 * fixed MPU regions at build-time.
135 */
136#define REGION_DEVICE_ATTR \
137 { \
138 /* AP, XN, SH */ \
139 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
140 /* Cache-ability */ \
141 .mair_idx = MPU_MAIR_INDEX_DEVICE, \
142 }
143
144#define REGION_RAM_ATTR \
145 { \
146 /* AP, XN, SH */ \
147 .rbar = NOT_EXEC | P_RW_U_NA_Msk | NON_SHAREABLE_Msk, \
148 /* Cache-ability */ \
149 .mair_idx = MPU_MAIR_INDEX_SRAM, \
150 }
151
152#define REGION_RAM_TEXT_ATTR \
153 { \
154 /* AP, XN, SH */ \
155 .rbar = P_RO_U_NA_Msk | NON_SHAREABLE_Msk, \
156 /* Cache-ability */ \
157 .mair_idx = MPU_MAIR_INDEX_SRAM, \
158 }
159
160#define REGION_RAM_RO_ATTR \
161 { \
162 /* AP, XN, SH */ \
163 .rbar = NOT_EXEC | P_RO_U_NA_Msk | NON_SHAREABLE_Msk, \
164 /* Cache-ability */ \
165 .mair_idx = MPU_MAIR_INDEX_SRAM, \
166 }
167
168#if defined(CONFIG_MPU_ALLOW_FLASH_WRITE)
169/* Note that the access permissions allow for un-privileged writes
170 */
171#define REGION_FLASH_ATTR \
172 { \
173 .rbar = P_RW_U_RW_Msk | NON_SHAREABLE_Msk, /* AP, XN, SH */ \
174 /* Cache-ability */ \
175 .mair_idx = MPU_MAIR_INDEX_FLASH, \
176 }
177#else /* CONFIG_MPU_ALLOW_FLASH_WRITE */
178#define REGION_FLASH_ATTR \
179 { \
180 .rbar = P_RO_U_RO_Msk | NON_SHAREABLE_Msk, /* AP, XN, SH */ \
181 /* Cache-ability */ \
182 .mair_idx = MPU_MAIR_INDEX_FLASH, \
183 }
184#endif /* CONFIG_MPU_ALLOW_FLASH_WRITE */
185
186struct arm_mpu_region_attr {
187 /* Attributes belonging to PRBAR */
188 uint8_t rbar : 5;
189 /* MAIR index for attribute indirection */
190 uint8_t mair_idx : 3;
191};
192
193/* Region definition data structure */
194struct arm_mpu_region {
195 /* Region Base Address */
197 /* Region limit Address */
199 /* Region Name */
200 const char *name;
201 /* Region Attributes */
203};
204
205/* MPU configuration data structure */
206struct arm_mpu_config {
207 /* Number of regions */
209 /* Regions */
210 const struct arm_mpu_region *mpu_regions;
211};
212
213#define MPU_REGION_ENTRY(_name, _base, _limit, _attr) \
214 { \
215 .name = _name, \
216 .base = _base, \
217 .limit = _limit, \
218 .attr = _attr, \
219 }
220
221/* Reference to the MPU configuration.
222 *
223 * This struct is defined and populated for each SoC (in the SoC definition),
224 * and holds the build-time configuration information for the fixed MPU
225 * regions enabled during kernel initialization. Dynamic MPU regions (e.g.
226 * for Thread Stack, Stack Guards, etc.) are programmed during runtime, thus,
227 * not kept here.
228 */
229extern const struct arm_mpu_config mpu_config;
230
231#endif /* _ASMLANGUAGE */
232
233#endif /* ZEPHYR_INCLUDE_ARCH_ARM64_CORTEX_R_MPU_ARM_MPU_H_ */
const struct arm_mpu_config mpu_config
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT64_TYPE__ uint64_t
Definition: stdint.h:61
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
Definition: arm_mpu.h:40
uint32_t num_regions
Definition: arm_mpu.h:42
const struct arm_mpu_region * mpu_regions
Definition: arm_mpu.h:44
Definition: arm_mpu_v7m.h:141
uint8_t rbar
Definition: arm_mpu_v8m.h:154
uint8_t mair_idx
Definition: arm_mpu_v8m.h:156
Definition: arm_mpu.h:26
const char * name
Definition: arm_mpu.h:30
uint64_t limit
Definition: arm_mpu.h:198
uint64_t base
Definition: arm_mpu.h:196
arm_mpu_region_attr_t attr
Definition: arm_mpu.h:36