1 /*
2  * Copyright (c) 2017 Synopsys.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef ZEPHYR_INCLUDE_ARCH_ARC_V2_MPU_ARC_CORE_MPU_H_
7 #define ZEPHYR_INCLUDE_ARCH_ARC_V2_MPU_ARC_CORE_MPU_H_
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /*
14  * The defines below represent the region types. The MPU driver is responsible
15  * to allocate the region accordingly to the type and set the correct
16  * attributes.
17  *
18  * Each MPU is different and has a different set of attributes, hence instead
19  * of having the attributes at this level the arc_mpu_core defines the intent
20  * types.
21  * An intent type (i.e. THREAD_STACK_GUARD) can correspond to a different set
22  * of operations and attributes for each MPU and it is responsibility of the
23  * MPU driver to select the correct ones.
24  *
25  * The intent based configuration can't fail hence at this level no error
26  * is returned by the configuration functions.
27  * If one of the operations corresponding to an intent fails the error has to
28  * be managed inside the MPU driver and not escalated.
29  */
30 /* Thread Region Intent Type */
31 #define THREAD_STACK_USER_REGION 0x0
32 #define THREAD_STACK_REGION 0x1
33 #define THREAD_APP_DATA_REGION 0x2
34 #define THREAD_STACK_GUARD_REGION 0x3
35 #define THREAD_DOMAIN_PARTITION_REGION 0x4
36 
37 #if defined(CONFIG_ARC_CORE_MPU)
38 /* ARC Core MPU Driver API */
39 
40 /*
41  * This API has to be implemented by all the MPU drivers that have
42  * ARC_CORE_MPU support.
43  */
44 
45 /**
46  * @brief enable the MPU
47  */
48 void arc_core_mpu_enable(void);
49 
50 /**
51  * @brief disable the MPU
52  */
53 void arc_core_mpu_disable(void);
54 
55 /**
56  * @brief configure the thread's mpu regions
57  *
58  * @param thread the target thread
59  */
60 void arc_core_mpu_configure_thread(struct k_thread *thread);
61 
62 /*
63  * Before configure the MPU regions, MPU should be disabled
64  */
65 /**
66  * @brief configure the default region
67  *
68  * @param   region_attr region attribute of default region
69  */
70 void arc_core_mpu_default(uint32_t region_attr);
71 
72 /**
73  * @brief configure the MPU region
74  *
75  * @param   index   MPU region index
76  * @param   base    base address
77  * @param   size    size of region
78  * @param   region_attr region attribute
79  */
80 int arc_core_mpu_region(uint32_t index, uint32_t base, uint32_t size,
81 			 uint32_t region_attr);
82 
83 #endif /* CONFIG_ARC_CORE_MPU */
84 
85 #if defined(CONFIG_USERSPACE)
86 void arc_core_mpu_configure_mem_domain(struct k_thread *thread);
87 void arc_core_mpu_remove_mem_domain(struct k_mem_domain *mem_domain);
88 void arc_core_mpu_remove_mem_partition(struct k_mem_domain *domain,
89 			uint32_t partition_id);
90 int arc_core_mpu_get_max_domain_partition_regions(void);
91 int arc_core_mpu_buffer_validate(const void *addr, size_t size, int write);
92 
93 #endif
94 
95 void configure_mpu_thread(struct k_thread *thread);
96 
97 #ifdef __cplusplus
98 }
99 #endif
100 
101 #endif /* ZEPHYR_INCLUDE_ARCH_ARC_V2_MPU_ARC_CORE_MPU_H_ */
102