]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Include/Chipset/AArch64Mmu.h
ArmPkg: Added Aarch64 support
[mirror_edk2.git] / ArmPkg / Include / Chipset / AArch64Mmu.h
1 /** @file
2 *
3 * Copyright (c) 2011-2013, ARM Limited. All rights reserved.
4 *
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
9 *
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 *
13 **/
14
15 #ifndef __AARCH64_MMU_H_
16 #define __AARCH64_MMU_H_
17
18 //
19 // Memory Attribute Indirection register Definitions
20 //
21 #define MAIR_ATTR_DEVICE_MEMORY 0x0ULL
22 #define MAIR_ATTR_NORMAL_MEMORY_NON_CACHEABLE 0x44ULL
23 #define MAIR_ATTR_NORMAL_MEMORY_WRITE_THROUGH 0xBBULL
24 #define MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK 0xFFULL
25
26 #define MAIR_ATTR(n,value) ((value) << (((n) >> 2)*8))
27
28 //
29 // Long-descriptor Translation Table format
30 //
31
32 // Return the smallest offset from the table level.
33 // The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
34 #define TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel) (12 + ((3 - (TableLevel)) * 9))
35
36 #define TT_BLOCK_ENTRY_SIZE_AT_LEVEL(Level) (1 << TT_ADDRESS_OFFSET_AT_LEVEL(Level))
37
38 // Get the associated entry in the given Translation Table
39 #define TT_GET_ENTRY_FOR_ADDRESS(TranslationTable, Level, Address) \
40 ((UINTN)(TranslationTable) + ((((Address) >> TT_ADDRESS_OFFSET_AT_LEVEL(Level)) & (BIT9-1)) * sizeof(UINT64)))
41
42 // Return the smallest address granularity from the table level.
43 // The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
44 #define TT_ADDRESS_AT_LEVEL(TableLevel) (1 << TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel))
45
46 // There are 512 entries per table when 4K Granularity
47 #define TT_ENTRY_COUNT 512
48 #define TT_ALIGNMENT_BLOCK_ENTRY BIT12
49 #define TT_ALIGNMENT_DESCRIPTION_TABLE BIT12
50
51 #define TT_ADDRESS_MASK_BLOCK_ENTRY (0xFFFFFFFULL << 12)
52 #define TT_ADDRESS_MASK_DESCRIPTION_TABLE (0xFFFFFFFULL << 12)
53
54 #define TT_TYPE_MASK 0x3
55 #define TT_TYPE_TABLE_ENTRY 0x3
56 #define TT_TYPE_BLOCK_ENTRY 0x1
57 #define TT_TYPE_BLOCK_ENTRY_LEVEL3 0x3
58
59 #define TT_ATTR_INDX_MASK (0x7 << 2)
60 #define TT_ATTR_INDX_DEVICE_MEMORY (0x0 << 2)
61 #define TT_ATTR_INDX_MEMORY_NON_CACHEABLE (0x1 << 2)
62 #define TT_ATTR_INDX_MEMORY_WRITE_THROUGH (0x2 << 2)
63 #define TT_ATTR_INDX_MEMORY_WRITE_BACK (0x3 << 2)
64
65 #define TT_AP_MASK (0x3UL << 6)
66 #define TT_AP_NO_RW (0x0UL << 6)
67 #define TT_AP_RW_RW (0x1UL << 6)
68 #define TT_AP_NO_RO (0x2UL << 6)
69 #define TT_AP_RO_RO (0x3UL << 6)
70
71 #define TT_NS BIT5
72 #define TT_AF BIT10
73
74 #define TT_PXN_MASK BIT53
75 #define TT_UXN_MASK BIT54
76
77 #define TT_ATTRIBUTES_MASK ((0xFFFULL << 52) | (0x3FFULL << 2))
78
79 #define TT_TABLE_PXN BIT59
80 #define TT_TABLE_XN BIT60
81 #define TT_TABLE_NS BIT63
82
83 #define TT_TABLE_AP_MASK (BIT62 | BIT61)
84 #define TT_TABLE_AP_NO_PERMISSION (0x0ULL << 61)
85 #define TT_TABLE_AP_EL0_NO_ACCESS (0x1ULL << 61)
86 #define TT_TABLE_AP_NO_WRITE_ACCESS (0x2ULL << 61)
87
88 //
89 // Translation Control Register
90 //
91 #define TCR_T0SZ_MASK 0x3F
92
93 #define TCR_PS_4GB (0 << 16)
94 #define TCR_PS_64GB (1 << 16)
95 #define TCR_PS_1TB (2 << 16)
96 #define TCR_PS_4TB (3 << 16)
97 #define TCR_PS_16TB (4 << 16)
98 #define TCR_PS_256TB (5 << 16)
99
100 #define TCR_TG0_4KB (0 << 14)
101
102 #define TCR_IPS_4GB (0UL << 32)
103 #define TCR_IPS_64GB (1UL << 32)
104 #define TCR_IPS_1TB (2UL << 32)
105 #define TCR_IPS_4TB (3UL << 32)
106 #define TCR_IPS_16TB (4UL << 32)
107 #define TCR_IPS_256TB (5UL << 32)
108
109
110 #define TTBR_ASID_FIELD (48)
111 #define TTBR_ASID_MASK (0xFF << TTBR_ASID_FIELD)
112 #define TTBR_BADDR_MASK (0xFFFFFFFFFFFF ) // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits
113
114 #define TCR_EL1_T0SZ_FIELD (0)
115 #define TCR_EL1_EPD0_FIELD (7)
116 #define TCR_EL1_IRGN0_FIELD (8)
117 #define TCR_EL1_ORGN0_FIELD (10)
118 #define TCR_EL1_SH0_FIELD (12)
119 #define TCR_EL1_TG0_FIELD (14)
120 #define TCR_EL1_T1SZ_FIELD (16)
121 #define TCR_EL1_A1_FIELD (22)
122 #define TCR_EL1_EPD1_FIELD (23)
123 #define TCR_EL1_IRGN1_FIELD (24)
124 #define TCR_EL1_ORGN1_FIELD (26)
125 #define TCR_EL1_SH1_FIELD (28)
126 #define TCR_EL1_TG1_FIELD (30)
127 #define TCR_EL1_IPS_FIELD (32)
128 #define TCR_EL1_AS_FIELD (36)
129 #define TCR_EL1_TBI0_FIELD (37)
130 #define TCR_EL1_TBI1_FIELD (38)
131 #define TCR_EL1_T0SZ_MASK (0x1F << TCR_EL1_T0SZ_FIELD)
132 #define TCR_EL1_EPD0_MASK (0x1 << TCR_EL1_EPD0_FIELD)
133 #define TCR_EL1_IRGN0_MASK (0x3 << TCR_EL1_IRGN0_FIELD)
134 #define TCR_EL1_ORGN0_MASK (0x3 << TCR_EL1_ORGN0_FIELD)
135 #define TCR_EL1_SH0_MASK (0x3 << TCR_EL1_SH0_FIELD)
136 #define TCR_EL1_TG0_MASK (0x1 << TCR_EL1_TG0_FIELD)
137 #define TCR_EL1_T1SZ_MASK (0x1F << TCR_EL1_T1SZ_FIELD)
138 #define TCR_EL1_A1_MASK (0x1 << TCR_EL1_A1_FIELD)
139 #define TCR_EL1_EPD1_MASK (0x1 << TCR_EL1_EPD1_FIELD)
140 #define TCR_EL1_IRGN1_MASK (0x3 << TCR_EL1_IRGN1_FIELD)
141 #define TCR_EL1_ORGN1_MASK (0x3 << TCR_EL1_ORGN1_FIELD)
142 #define TCR_EL1_SH1_MASK (0x3 << TCR_EL1_SH1_FIELD)
143 #define TCR_EL1_TG1_MASK (0x1 << TCR_EL1_TG1_FIELD)
144 #define TCR_EL1_IPS_MASK (0x7 << TCR_EL1_IPS_FIELD)
145 #define TCR_EL1_AS_MASK (0x1 << TCR_EL1_AS_FIELD)
146 #define TCR_EL1_TBI0_MASK (0x1 << TCR_EL1_TBI0_FIELD)
147 #define TCR_EL1_TBI1_MASK (0x1 << TCR_EL1_TBI1_FIELD)
148
149
150 #define VTCR_EL23_T0SZ_FIELD (0)
151 #define VTCR_EL23_IRGN0_FIELD (8)
152 #define VTCR_EL23_ORGN0_FIELD (10)
153 #define VTCR_EL23_SH0_FIELD (12)
154 #define TCR_EL23_TG0_FIELD (14)
155 #define VTCR_EL23_PS_FIELD (16)
156 #define TCR_EL23_T0SZ_MASK (0x1F << VTCR_EL23_T0SZ_FIELD)
157 #define TCR_EL23_IRGN0_MASK (0x3 << VTCR_EL23_IRGN0_FIELD)
158 #define TCR_EL23_ORGN0_MASK (0x3 << VTCR_EL23_ORGN0_FIELD)
159 #define TCR_EL23_SH0_MASK (0x3 << VTCR_EL23_SH0_FIELD)
160 #define TCR_EL23_TG0_MASK (0x1 << TCR_EL23_TG0_FIELD)
161 #define TCR_EL23_PS_MASK (0x7 << VTCR_EL23_PS_FIELD)
162
163
164 #define VTCR_EL2_T0SZ_FIELD (0)
165 #define VTCR_EL2_SL0_FIELD (6)
166 #define VTCR_EL2_IRGN0_FIELD (8)
167 #define VTCR_EL2_ORGN0_FIELD (10)
168 #define VTCR_EL2_SH0_FIELD (12)
169 #define VTCR_EL2_TG0_FIELD (14)
170 #define VTCR_EL2_PS_FIELD (16)
171 #define VTCR_EL2_T0SZ_MASK (0x1F << VTCR_EL2_T0SZ_FIELD)
172 #define VTCR_EL2_SL0_MASK (0x1F << VTCR_EL2_SL0_FIELD)
173 #define VTCR_EL2_IRGN0_MASK (0x3 << VTCR_EL2_IRGN0_FIELD)
174 #define VTCR_EL2_ORGN0_MASK (0x3 << VTCR_EL2_ORGN0_FIELD)
175 #define VTCR_EL2_SH0_MASK (0x3 << VTCR_EL2_SH0_FIELD)
176 #define VTCR_EL2_TG0_MASK (0x1 << VTCR_EL2_TG0_FIELD)
177 #define VTCR_EL2_PS_MASK (0x7 << VTCR_EL2_PS_FIELD)
178
179
180 #define TCR_RGN_OUTER_NON_CACHEABLE (0x0 << 10)
181 #define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1 << 10)
182 #define TCR_RGN_OUTER_WRITE_THROUGH (0x2 << 10)
183 #define TCR_RGN_OUTER_WRITE_BACK_NO_ALLOC (0x3 << 10)
184
185 #define TCR_RGN_INNER_NON_CACHEABLE (0x0 << 8)
186 #define TCR_RGN_INNER_WRITE_BACK_ALLOC (0x1 << 8)
187 #define TCR_RGN_INNER_WRITE_THROUGH (0x2 << 8)
188 #define TCR_RGN_INNER_WRITE_BACK_NO_ALLOC (0x3 << 8)
189
190 #define TCR_SH_NON_SHAREABLE (0x0 << 12)
191 #define TCR_SH_OUTER_SHAREABLE (0x2 << 12)
192 #define TCR_SH_INNER_SHAREABLE (0x3 << 12)
193
194 #define TCR_PASZ_32BITS_4GB (0x0)
195 #define TCR_PASZ_36BITS_64GB (0x1)
196 #define TCR_PASZ_40BITS_1TB (0x2)
197 #define TCR_PASZ_42BITS_4TB (0x3)
198 #define TCR_PASZ_44BITS_16TB (0x4)
199 #define TCR_PASZ_48BITS_256TB (0x5)
200
201 // The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit
202 // Virtual address range for 512GB of virtual space sets T*SZ to 25
203 #define INPUT_ADDRESS_SIZE_TO_TxSZ(a) (64 - a)
204
205 // Uses LPAE Page Table format
206
207 #endif // __AARCH64_MMU_H_
208