Zephyr API Documentation
4.0.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
arm_mmu.h
Go to the documentation of this file.
1
/*
2
* ARMv7 MMU support
3
*
4
* Copyright (c) 2021 Weidmueller Interface GmbH & Co. KG
5
* SPDX-License-Identifier: Apache-2.0
6
*/
7
8
#ifndef ZEPHYR_INCLUDE_ARCH_AARCH32_ARM_MMU_H_
9
#define ZEPHYR_INCLUDE_ARCH_AARCH32_ARM_MMU_H_
10
11
#ifndef _ASMLANGUAGE
12
13
/*
14
* Comp.:
15
* ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition,
16
* ARM document ID DDI0406C Rev. d, March 2018
17
* Memory type definitions:
18
* Table B3-10, chap. B3.8.2, p. B3-1363f.
19
* Outer / inner cache attributes for cacheable memory:
20
* Table B3-11, chap. B3.8.2, p. B3-1364
21
*/
22
23
/*
24
* The following definitions are used when specifying a memory
25
* range to be mapped at boot time using the MMU_REGION_ENTRY
26
* macro.
27
*/
28
#define MT_STRONGLY_ORDERED BIT(0)
29
#define MT_DEVICE BIT(1)
30
#define MT_NORMAL BIT(2)
31
#define MT_MASK 0x7
32
33
#define MPERM_R BIT(3)
34
#define MPERM_W BIT(4)
35
#define MPERM_X BIT(5)
36
#define MPERM_UNPRIVILEGED BIT(6)
37
38
#define MATTR_NON_SECURE BIT(7)
39
#define MATTR_NON_GLOBAL BIT(8)
40
#define MATTR_SHARED BIT(9)
41
#define MATTR_CACHE_OUTER_WB_WA BIT(10)
42
#define MATTR_CACHE_OUTER_WT_nWA BIT(11)
43
#define MATTR_CACHE_OUTER_WB_nWA BIT(12)
44
#define MATTR_CACHE_INNER_WB_WA BIT(13)
45
#define MATTR_CACHE_INNER_WT_nWA BIT(14)
46
#define MATTR_CACHE_INNER_WB_nWA BIT(15)
47
48
#define MATTR_MAY_MAP_L1_SECTION BIT(16)
49
50
/*
51
* The following macros are used for adding constant entries
52
* mmu_regions array of the mmu_config struct. Use MMU_REGION_ENTRY
53
* for the specification of mappings whose PA and VA differ,
54
* the use of MMU_REGION_FLAT_ENTRY always results in an identity
55
* mapping, which are used for the mappings of the Zephyr image's
56
* code and data.
57
*/
58
#define MMU_REGION_ENTRY(_name, _base_pa, _base_va, _size, _attrs) \
59
{\
60
.name = _name, \
61
.base_pa = _base_pa, \
62
.base_va = _base_va, \
63
.size = _size, \
64
.attrs = _attrs, \
65
}
66
67
#define MMU_REGION_FLAT_ENTRY(name, adr, sz, attrs) \
68
MMU_REGION_ENTRY(name, adr, adr, sz, attrs)
69
70
/*
71
* @brief Auto generate mmu region entry for node_id
72
*
73
* Example usage:
74
*
75
* @code{.c}
76
* DT_FOREACH_STATUS_OKAY_VARGS(nxp_imx_gpio,
77
* MMU_REGION_DT_FLAT_ENTRY,
78
* (MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_NS))
79
* @endcode
80
*
81
* @note Since devicetree_generated.h does not include
82
* node_id##_P_reg_FOREACH_PROP_ELEM* definitions,
83
* we can't automate dts node with multiple reg
84
* entries.
85
*/
86
#define MMU_REGION_DT_FLAT_ENTRY(node_id, attrs) \
87
MMU_REGION_FLAT_ENTRY(DT_NODE_FULL_NAME(node_id), \
88
DT_REG_ADDR(node_id), \
89
DT_REG_SIZE(node_id), \
90
attrs),
91
92
/*
93
* @brief Auto generate mmu region entry for status = "okay"
94
* nodes compatible to a driver
95
*
96
* Example usage:
97
*
98
* @code{.c}
99
* MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY(nxp_imx_gpio,
100
* (MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_NS))
101
* @endcode
102
*
103
* @note This is a wrapper of @ref MMU_REGION_DT_FLAT_ENTRY
104
*/
105
#define MMU_REGION_DT_COMPAT_FOREACH_FLAT_ENTRY(compat, attr) \
106
DT_FOREACH_STATUS_OKAY_VARGS(compat, \
107
MMU_REGION_DT_FLAT_ENTRY, attr)
108
109
/* Region definition data structure */
110
struct
arm_mmu_region
{
111
/* Region Base Physical Address */
112
uintptr_t
base_pa
;
113
/* Region Base Virtual Address */
114
uintptr_t
base_va
;
115
/* Region size */
116
size_t
size
;
117
/* Region Name */
118
const
char
*
name
;
119
/* Region Attributes */
120
uint32_t
attrs
;
121
};
122
123
/* MMU configuration data structure */
124
struct
arm_mmu_config
{
125
/* Number of regions */
126
uint32_t
num_regions
;
127
/* Regions */
128
const
struct
arm_mmu_region
*
mmu_regions
;
129
};
130
131
/*
132
* Reference to the MMU configuration.
133
*
134
* This struct is defined and populated for each SoC (in the SoC definition),
135
* and holds the build-time configuration information for the fixed MMU
136
* regions enabled during kernel initialization.
137
*/
138
extern
const
struct
arm_mmu_config
mmu_config
;
139
140
int
z_arm_mmu_init(
void
);
141
142
#endif
/* _ASMLANGUAGE */
143
144
#endif
/* ZEPHYR_INCLUDE_ARCH_AARCH32_ARM_MMU_H_ */
mmu_config
const struct arm_mmu_config mmu_config
uint32_t
__UINT32_TYPE__ uint32_t
Definition
stdint.h:90
uintptr_t
__UINTPTR_TYPE__ uintptr_t
Definition
stdint.h:105
arm_mmu_config
Definition
arm_mmu.h:124
arm_mmu_config::mmu_regions
const struct arm_mmu_region * mmu_regions
Definition
arm_mmu.h:128
arm_mmu_config::num_regions
uint32_t num_regions
Definition
arm_mmu.h:126
arm_mmu_region
Definition
arm_mmu.h:110
arm_mmu_region::base_va
uintptr_t base_va
Definition
arm_mmu.h:114
arm_mmu_region::size
size_t size
Definition
arm_mmu.h:116
arm_mmu_region::base_pa
uintptr_t base_pa
Definition
arm_mmu.h:112
arm_mmu_region::name
const char * name
Definition
arm_mmu.h:118
arm_mmu_region::attrs
uint32_t attrs
Definition
arm_mmu.h:120
zephyr
arch
arm
mmu
arm_mmu.h
Generated on Sat Nov 16 2024 04:55:03 for Zephyr API Documentation by
1.12.0