1 /*
2  * Copyright (c) 2017 Linaro Limited.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef ZEPHYR_INCLUDE_ARCH_ARM_MPU_ARM_MPU_H_
7 #define ZEPHYR_INCLUDE_ARCH_ARM_MPU_ARM_MPU_H_
8 
9 #if defined(CONFIG_CPU_CORTEX_M0PLUS) || defined(CONFIG_CPU_CORTEX_M3) ||                          \
10 	defined(CONFIG_CPU_CORTEX_M4) || defined(CONFIG_CPU_CORTEX_M7) || defined(CONFIG_ARMV7_R)
11 #include <zephyr/arch/arm/mpu/arm_mpu_v7m.h>
12 #elif defined(CONFIG_CPU_CORTEX_M23) || defined(CONFIG_CPU_CORTEX_M33) ||                          \
13 	defined(CONFIG_CPU_CORTEX_M55) || defined(CONFIG_CPU_CORTEX_M85) ||                        \
14 	defined(CONFIG_AARCH32_ARMV8_R)
15 #include <zephyr/arch/arm/mpu/arm_mpu_v8.h>
16 #else
17 #error "Unsupported ARM CPU"
18 #endif
19 
20 #ifndef _ASMLANGUAGE
21 
22 /* Region definition data structure */
23 struct arm_mpu_region {
24 	/* Region Base Address */
25 	uint32_t base;
26 	/* Region Name */
27 	const char *name;
28 #if defined(CONFIG_CPU_AARCH32_CORTEX_R)
29 	/* Region Size */
30 	uint32_t size;
31 #endif
32 	/* Region Attributes */
33 	arm_mpu_region_attr_t attr;
34 };
35 
36 /* MPU configuration data structure */
37 struct arm_mpu_config {
38 	/* Number of regions */
39 	uint32_t num_regions;
40 	/* Regions */
41 	const struct arm_mpu_region *mpu_regions;
42 };
43 
44 #if defined(CONFIG_ARMV7_R)
45 #define MPU_REGION_ENTRY(_name, _base, _size, _attr)                                               \
46 	{                                                                                          \
47 		.name = _name,                                                                     \
48 		.base = _base,                                                                     \
49 		.size = _size,                                                                     \
50 		.attr = _attr,                                                                     \
51 	}
52 #else
53 #define MPU_REGION_ENTRY(_name, _base, _attr)                                                      \
54 	{                                                                                          \
55 		.name = _name,                                                                     \
56 		.base = _base,                                                                     \
57 		.attr = _attr,                                                                     \
58 	}
59 #endif
60 
61 /* Reference to the MPU configuration.
62  *
63  * This struct is defined and populated for each SoC (in the SoC definition),
64  * and holds the build-time configuration information for the fixed MPU
65  * regions enabled during kernel initialization. Dynamic MPU regions (e.g.
66  * for Thread Stack, Stack Guards, etc.) are programmed during runtime, thus,
67  * not kept here.
68  */
69 extern const struct arm_mpu_config mpu_config;
70 
71 #endif /* _ASMLANGUAGE */
72 
73 #endif /* ZEPHYR_INCLUDE_ARCH_ARM_MPU_ARM_MPU_H_ */
74