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