/root/src/xen/xen/include/asm/hvm/svm/amd-iommu-defs.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2007 Advanced Micro Devices, Inc. |
3 | | * Author: Leo Duran <leo.duran@amd.com> |
4 | | * Author: Wei Wang <wei.wang2@amd.com> - adapted to xen |
5 | | * |
6 | | * This program is free software; you can redistribute it and/or modify |
7 | | * it under the terms of the GNU General Public License as published by |
8 | | * the Free Software Foundation; either version 2 of the License, or |
9 | | * (at your option) any later version. |
10 | | * |
11 | | * This program is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | * GNU General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU General Public License |
17 | | * along with this program; If not, see <http://www.gnu.org/licenses/>. |
18 | | */ |
19 | | |
20 | | #ifndef _ASM_X86_64_AMD_IOMMU_DEFS_H |
21 | | #define _ASM_X86_64_AMD_IOMMU_DEFS_H |
22 | | |
23 | | /* IOMMU Command Buffer entries: in power of 2 increments, minimum of 256 */ |
24 | 0 | #define IOMMU_CMD_BUFFER_DEFAULT_ENTRIES 512 |
25 | | |
26 | | /* IOMMU Event Log entries: in power of 2 increments, minimum of 256 */ |
27 | 0 | #define IOMMU_EVENT_LOG_DEFAULT_ENTRIES 512 |
28 | | |
29 | | /* IOMMU PPR Log entries: in power of 2 increments, minimum of 256 */ |
30 | 0 | #define IOMMU_PPR_LOG_DEFAULT_ENTRIES 512 |
31 | | |
32 | 0 | #define PTE_PER_TABLE_SHIFT 9 |
33 | 0 | #define PTE_PER_TABLE_SIZE (1 << PTE_PER_TABLE_SHIFT) |
34 | 0 | #define PTE_PER_TABLE_MASK (~(PTE_PER_TABLE_SIZE - 1)) |
35 | | #define PTE_PER_TABLE_ALIGN(entries) \ |
36 | 0 | (((entries) + PTE_PER_TABLE_SIZE - 1) & PTE_PER_TABLE_MASK) |
37 | | #define PTE_PER_TABLE_ALLOC(entries) \ |
38 | | PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT) |
39 | | |
40 | | #define amd_offset_level_address(offset, level) \ |
41 | 0 | ((u64)(offset) << (12 + (PTE_PER_TABLE_SHIFT * \ |
42 | 0 | (level - IOMMU_PAGING_MODE_LEVEL_1)))) |
43 | | |
44 | | #define PCI_MIN_CAP_OFFSET 0x40 |
45 | | #define PCI_MAX_CAP_BLOCKS 48 |
46 | | #define PCI_CAP_PTR_MASK 0xFC |
47 | | |
48 | | /* IOMMU Capability */ |
49 | | #define PCI_CAP_ID_MASK 0x000000FF |
50 | | #define PCI_CAP_ID_SHIFT 0 |
51 | | #define PCI_CAP_NEXT_PTR_MASK 0x0000FF00 |
52 | | #define PCI_CAP_NEXT_PTR_SHIFT 8 |
53 | | #define PCI_CAP_TYPE_MASK 0x00070000 |
54 | | #define PCI_CAP_TYPE_SHIFT 16 |
55 | | #define PCI_CAP_REV_MASK 0x00F80000 |
56 | | #define PCI_CAP_REV_SHIFT 19 |
57 | | #define PCI_CAP_IOTLB_MASK 0x01000000 |
58 | 0 | #define PCI_CAP_IOTLB_SHIFT 24 |
59 | | #define PCI_CAP_HT_TUNNEL_MASK 0x02000000 |
60 | 0 | #define PCI_CAP_HT_TUNNEL_SHIFT 25 |
61 | | #define PCI_CAP_NP_CACHE_MASK 0x04000000 |
62 | | #define PCI_CAP_NP_CACHE_SHIFT 26 |
63 | 0 | #define PCI_CAP_EFRSUP_SHIFT 27 |
64 | | #define PCI_CAP_RESET_MASK 0x80000000 |
65 | | #define PCI_CAP_RESET_SHIFT 31 |
66 | | |
67 | | #define PCI_CAP_TYPE_IOMMU 0x3 |
68 | | |
69 | | #define PCI_CAP_MMIO_BAR_LOW_OFFSET 0x04 |
70 | | #define PCI_CAP_MMIO_BAR_HIGH_OFFSET 0x08 |
71 | | #define PCI_CAP_MMIO_BAR_LOW_MASK 0xFFFFC000 |
72 | 0 | #define IOMMU_MMIO_REGION_LENGTH 0x4000 |
73 | | |
74 | | #define PCI_CAP_RANGE_OFFSET 0x0C |
75 | | #define PCI_CAP_BUS_NUMBER_MASK 0x0000FF00 |
76 | | #define PCI_CAP_BUS_NUMBER_SHIFT 8 |
77 | | #define PCI_CAP_FIRST_DEVICE_MASK 0x00FF0000 |
78 | | #define PCI_CAP_FIRST_DEVICE_SHIFT 16 |
79 | | #define PCI_CAP_LAST_DEVICE_MASK 0xFF000000 |
80 | | #define PCI_CAP_LAST_DEVICE_SHIFT 24 |
81 | | |
82 | | #define PCI_CAP_UNIT_ID_MASK 0x0000001F |
83 | | #define PCI_CAP_UNIT_ID_SHIFT 0 |
84 | | #define PCI_CAP_MISC_INFO_OFFSET 0x10 |
85 | | #define PCI_CAP_MSI_NUMBER_MASK 0x0000001F |
86 | | #define PCI_CAP_MSI_NUMBER_SHIFT 0 |
87 | | |
88 | | /* Device Table */ |
89 | 0 | #define IOMMU_DEV_TABLE_BASE_LOW_OFFSET 0x00 |
90 | | #define IOMMU_DEV_TABLE_BASE_HIGH_OFFSET 0x04 |
91 | 0 | #define IOMMU_DEV_TABLE_SIZE_MASK 0x000001FF |
92 | 0 | #define IOMMU_DEV_TABLE_SIZE_SHIFT 0 |
93 | | |
94 | | #define IOMMU_DEV_TABLE_ENTRIES_PER_BUS 256 |
95 | 0 | #define IOMMU_DEV_TABLE_ENTRY_SIZE 32 |
96 | | #define IOMMU_DEV_TABLE_U32_PER_ENTRY (IOMMU_DEV_TABLE_ENTRY_SIZE / 4) |
97 | | |
98 | | #define IOMMU_DEV_TABLE_SYS_MGT_DMA_ABORTED 0x0 |
99 | | #define IOMMU_DEV_TABLE_SYS_MGT_MSG_FORWARDED 0x1 |
100 | | #define IOMMU_DEV_TABLE_SYS_MGT_INT_FORWARDED 0x2 |
101 | | #define IOMMU_DEV_TABLE_SYS_MGT_DMA_FORWARDED 0x3 |
102 | | |
103 | | #define IOMMU_DEV_TABLE_IO_CONTROL_ABORTED 0x0 |
104 | | #define IOMMU_DEV_TABLE_IO_CONTROL_FORWARDED 0x1 |
105 | | #define IOMMU_DEV_TABLE_IO_CONTROL_TRANSLATED 0x2 |
106 | | |
107 | | #define IOMMU_DEV_TABLE_INT_CONTROL_ABORTED 0x0 |
108 | | #define IOMMU_DEV_TABLE_INT_CONTROL_FORWARDED 0x1 |
109 | | #define IOMMU_DEV_TABLE_INT_CONTROL_TRANSLATED 0x2 |
110 | | |
111 | | /* DeviceTable Entry[31:0] */ |
112 | 0 | #define IOMMU_DEV_TABLE_VALID_MASK 0x00000001 |
113 | 0 | #define IOMMU_DEV_TABLE_VALID_SHIFT 0 |
114 | 0 | #define IOMMU_DEV_TABLE_TRANSLATION_VALID_MASK 0x00000002 |
115 | 0 | #define IOMMU_DEV_TABLE_TRANSLATION_VALID_SHIFT 1 |
116 | 0 | #define IOMMU_DEV_TABLE_PAGING_MODE_MASK 0x00000E00 |
117 | 0 | #define IOMMU_DEV_TABLE_PAGING_MODE_SHIFT 9 |
118 | 0 | #define IOMMU_DEV_TABLE_PAGE_TABLE_PTR_LOW_MASK 0xFFFFF000 |
119 | 0 | #define IOMMU_DEV_TABLE_PAGE_TABLE_PTR_LOW_SHIFT 12 |
120 | | |
121 | | /* DeviceTable Entry[63:32] */ |
122 | 0 | #define IOMMU_DEV_TABLE_GV_SHIFT 23 |
123 | 0 | #define IOMMU_DEV_TABLE_GV_MASK 0x800000 |
124 | 0 | #define IOMMU_DEV_TABLE_GLX_SHIFT 24 |
125 | 0 | #define IOMMU_DEV_TABLE_GLX_MASK 0x3000000 |
126 | 0 | #define IOMMU_DEV_TABLE_GCR3_1_SHIFT 26 |
127 | 0 | #define IOMMU_DEV_TABLE_GCR3_1_MASK 0x1c000000 |
128 | | |
129 | 0 | #define IOMMU_DEV_TABLE_PAGE_TABLE_PTR_HIGH_MASK 0x000FFFFF |
130 | 0 | #define IOMMU_DEV_TABLE_PAGE_TABLE_PTR_HIGH_SHIFT 0 |
131 | 0 | #define IOMMU_DEV_TABLE_IO_READ_PERMISSION_MASK 0x20000000 |
132 | 0 | #define IOMMU_DEV_TABLE_IO_READ_PERMISSION_SHIFT 29 |
133 | 0 | #define IOMMU_DEV_TABLE_IO_WRITE_PERMISSION_MASK 0x40000000 |
134 | 0 | #define IOMMU_DEV_TABLE_IO_WRITE_PERMISSION_SHIFT 30 |
135 | | |
136 | | /* DeviceTable Entry[95:64] */ |
137 | 0 | #define IOMMU_DEV_TABLE_DOMAIN_ID_MASK 0x0000FFFF |
138 | 0 | #define IOMMU_DEV_TABLE_DOMAIN_ID_SHIFT 0 |
139 | 0 | #define IOMMU_DEV_TABLE_GCR3_2_SHIFT 16 |
140 | 0 | #define IOMMU_DEV_TABLE_GCR3_2_MASK 0xFFFF0000 |
141 | | |
142 | | /* DeviceTable Entry[127:96] */ |
143 | 0 | #define IOMMU_DEV_TABLE_IOTLB_SUPPORT_MASK 0x00000001 |
144 | 0 | #define IOMMU_DEV_TABLE_IOTLB_SUPPORT_SHIFT 0 |
145 | | #define IOMMU_DEV_TABLE_SUPRESS_LOGGED_PAGES_MASK 0x00000002 |
146 | | #define IOMMU_DEV_TABLE_SUPRESS_LOGGED_PAGES_SHIFT 1 |
147 | | #define IOMMU_DEV_TABLE_SUPRESS_ALL_PAGES_MASK 0x00000004 |
148 | | #define IOMMU_DEV_TABLE_SUPRESS_ALL_PAGES_SHIFT 2 |
149 | | #define IOMMU_DEV_TABLE_IO_CONTROL_MASK 0x00000018 |
150 | | #define IOMMU_DEV_TABLE_IO_CONTROL_SHIFT 3 |
151 | | #define IOMMU_DEV_TABLE_IOTLB_CACHE_HINT_MASK 0x00000020 |
152 | | #define IOMMU_DEV_TABLE_IOTLB_CACHE_HINT_SHIFT 5 |
153 | | #define IOMMU_DEV_TABLE_SNOOP_DISABLE_MASK 0x00000040 |
154 | | #define IOMMU_DEV_TABLE_SNOOP_DISABLE_SHIFT 6 |
155 | 0 | #define IOMMU_DEV_TABLE_ALLOW_EXCLUSION_MASK 0x00000080 |
156 | 0 | #define IOMMU_DEV_TABLE_ALLOW_EXCLUSION_SHIFT 7 |
157 | 0 | #define IOMMU_DEV_TABLE_SYS_MGT_MSG_ENABLE_MASK 0x00000300 |
158 | 0 | #define IOMMU_DEV_TABLE_SYS_MGT_MSG_ENABLE_SHIFT 8 |
159 | | |
160 | | /* DeviceTable Entry[159:128] */ |
161 | 0 | #define IOMMU_DEV_TABLE_INT_VALID_MASK 0x00000001 |
162 | 0 | #define IOMMU_DEV_TABLE_INT_VALID_SHIFT 0 |
163 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_LENGTH_MASK 0x0000001E |
164 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_LENGTH_SHIFT 1 |
165 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_IGN_UNMAPPED_MASK 0x0000000020 |
166 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_IGN_UNMAPPED_SHIFT 5 |
167 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_PTR_LOW_MASK 0xFFFFFFC0 |
168 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_PTR_LOW_SHIFT 6 |
169 | 0 | #define IOMMU_DEV_TABLE_GCR3_3_SHIFT 11 |
170 | 0 | #define IOMMU_DEV_TABLE_GCR3_3_MASK 0xfffff800 |
171 | | |
172 | | /* DeviceTable Entry[191:160] */ |
173 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_PTR_HIGH_MASK 0x000FFFFF |
174 | 0 | #define IOMMU_DEV_TABLE_INT_TABLE_PTR_HIGH_SHIFT 0 |
175 | 0 | #define IOMMU_DEV_TABLE_IVHD_FLAGS_SHIFT 24 |
176 | 0 | #define IOMMU_DEV_TABLE_IVHD_FLAGS_MASK 0xC7000000 |
177 | 0 | #define IOMMU_DEV_TABLE_INT_CONTROL_MASK 0x30000000 |
178 | 0 | #define IOMMU_DEV_TABLE_INT_CONTROL_SHIFT 28 |
179 | | |
180 | | /* Command Buffer */ |
181 | 0 | #define IOMMU_CMD_BUFFER_BASE_LOW_OFFSET 0x08 |
182 | | #define IOMMU_CMD_BUFFER_BASE_HIGH_OFFSET 0x0C |
183 | 0 | #define IOMMU_CMD_BUFFER_HEAD_OFFSET 0x2000 |
184 | 0 | #define IOMMU_CMD_BUFFER_TAIL_OFFSET 0x2008 |
185 | 0 | #define IOMMU_CMD_BUFFER_LENGTH_MASK 0x0F000000 |
186 | 0 | #define IOMMU_CMD_BUFFER_LENGTH_SHIFT 24 |
187 | | |
188 | 0 | #define IOMMU_CMD_BUFFER_ENTRY_SIZE 16 |
189 | 0 | #define IOMMU_CMD_BUFFER_POWER_OF2_ENTRIES_PER_PAGE 8 |
190 | 0 | #define IOMMU_CMD_BUFFER_U32_PER_ENTRY (IOMMU_CMD_BUFFER_ENTRY_SIZE / 4) |
191 | | |
192 | 0 | #define IOMMU_CMD_OPCODE_MASK 0xF0000000 |
193 | 0 | #define IOMMU_CMD_OPCODE_SHIFT 28 |
194 | 0 | #define IOMMU_CMD_COMPLETION_WAIT 0x1 |
195 | 0 | #define IOMMU_CMD_INVALIDATE_DEVTAB_ENTRY 0x2 |
196 | 0 | #define IOMMU_CMD_INVALIDATE_IOMMU_PAGES 0x3 |
197 | 0 | #define IOMMU_CMD_INVALIDATE_IOTLB_PAGES 0x4 |
198 | 0 | #define IOMMU_CMD_INVALIDATE_INT_TABLE 0x5 |
199 | 0 | #define IOMMU_CMD_COMPLETE_PPR_REQUEST 0x7 |
200 | 0 | #define IOMMU_CMD_INVALIDATE_IOMMU_ALL 0x8 |
201 | | |
202 | | /* COMPLETION_WAIT command */ |
203 | | #define IOMMU_COMP_WAIT_DATA_BUFFER_SIZE 8 |
204 | | #define IOMMU_COMP_WAIT_DATA_BUFFER_ALIGNMENT 8 |
205 | | #define IOMMU_COMP_WAIT_S_FLAG_MASK 0x00000001 |
206 | 0 | #define IOMMU_COMP_WAIT_S_FLAG_SHIFT 0 |
207 | 0 | #define IOMMU_COMP_WAIT_I_FLAG_MASK 0x00000002 |
208 | 0 | #define IOMMU_COMP_WAIT_I_FLAG_SHIFT 1 |
209 | | #define IOMMU_COMP_WAIT_F_FLAG_MASK 0x00000004 |
210 | | #define IOMMU_COMP_WAIT_F_FLAG_SHIFT 2 |
211 | 0 | #define IOMMU_COMP_WAIT_ADDR_LOW_MASK 0xFFFFFFF8 |
212 | 0 | #define IOMMU_COMP_WAIT_ADDR_LOW_SHIFT 3 |
213 | 0 | #define IOMMU_COMP_WAIT_ADDR_HIGH_MASK 0x000FFFFF |
214 | 0 | #define IOMMU_COMP_WAIT_ADDR_HIGH_SHIFT 0 |
215 | | |
216 | | /* INVALIDATE_IOMMU_PAGES command */ |
217 | 0 | #define IOMMU_INV_IOMMU_PAGES_DOMAIN_ID_MASK 0x0000FFFF |
218 | 0 | #define IOMMU_INV_IOMMU_PAGES_DOMAIN_ID_SHIFT 0 |
219 | 0 | #define IOMMU_INV_IOMMU_PAGES_S_FLAG_MASK 0x00000001 |
220 | 0 | #define IOMMU_INV_IOMMU_PAGES_S_FLAG_SHIFT 0 |
221 | 0 | #define IOMMU_INV_IOMMU_PAGES_PDE_FLAG_MASK 0x00000002 |
222 | 0 | #define IOMMU_INV_IOMMU_PAGES_PDE_FLAG_SHIFT 1 |
223 | 0 | #define IOMMU_INV_IOMMU_PAGES_ADDR_LOW_MASK 0xFFFFF000 |
224 | 0 | #define IOMMU_INV_IOMMU_PAGES_ADDR_LOW_SHIFT 12 |
225 | 0 | #define IOMMU_INV_IOMMU_PAGES_ADDR_HIGH_MASK 0xFFFFFFFF |
226 | 0 | #define IOMMU_INV_IOMMU_PAGES_ADDR_HIGH_SHIFT 0 |
227 | | |
228 | | /* INVALIDATE_DEVTAB_ENTRY command */ |
229 | 0 | #define IOMMU_INV_DEVTAB_ENTRY_DEVICE_ID_MASK 0x0000FFFF |
230 | 0 | #define IOMMU_INV_DEVTAB_ENTRY_DEVICE_ID_SHIFT 0 |
231 | | |
232 | | /* INVALIDATE_INTERRUPT_TABLE command */ |
233 | 0 | #define IOMMU_INV_INT_TABLE_DEVICE_ID_MASK 0x0000FFFF |
234 | 0 | #define IOMMU_INV_INT_TABLE_DEVICE_ID_SHIFT 0 |
235 | | |
236 | | /* INVALIDATE_IOTLB_PAGES command */ |
237 | 0 | #define IOMMU_INV_IOTLB_PAGES_MAXPEND_MASK 0xff000000 |
238 | 0 | #define IOMMU_INV_IOTLB_PAGES_MAXPEND_SHIFT 24 |
239 | 0 | #define IOMMU_INV_IOTLB_PAGES_PASID1_MASK 0x00ff0000 |
240 | 0 | #define IOMMU_INV_IOTLB_PAGES_PASID1_SHIFT 16 |
241 | 0 | #define IOMMU_INV_IOTLB_PAGES_PASID2_MASK 0x0fff0000 |
242 | 0 | #define IOMMU_INV_IOTLB_PAGES_PASID2_SHIFT 16 |
243 | 0 | #define IOMMU_INV_IOTLB_PAGES_QUEUEID_MASK 0x0000ffff |
244 | 0 | #define IOMMU_INV_IOTLB_PAGES_QUEUEID_SHIFT 0 |
245 | 0 | #define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_MASK 0x0000FFFF |
246 | 0 | #define IOMMU_INV_IOTLB_PAGES_DEVICE_ID_SHIFT 0 |
247 | 0 | #define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_MASK 0xFFFFF000 |
248 | 0 | #define IOMMU_INV_IOTLB_PAGES_ADDR_LOW_SHIFT 12 |
249 | 0 | #define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_MASK 0xFFFFFFFF |
250 | 0 | #define IOMMU_INV_IOTLB_PAGES_ADDR_HIGH_SHIFT 0 |
251 | 0 | #define IOMMU_INV_IOTLB_PAGES_S_FLAG_MASK 0x00000001 |
252 | | #define IOMMU_INV_IOTLB_PAGES_S_FLAG_SHIFT 0 |
253 | | |
254 | | /* Event Log */ |
255 | 0 | #define IOMMU_EVENT_LOG_BASE_LOW_OFFSET 0x10 |
256 | | #define IOMMU_EVENT_LOG_BASE_HIGH_OFFSET 0x14 |
257 | 0 | #define IOMMU_EVENT_LOG_HEAD_OFFSET 0x2010 |
258 | 0 | #define IOMMU_EVENT_LOG_TAIL_OFFSET 0x2018 |
259 | 0 | #define IOMMU_EVENT_LOG_LENGTH_MASK 0x0F000000 |
260 | 0 | #define IOMMU_EVENT_LOG_LENGTH_SHIFT 24 |
261 | | #define IOMMU_EVENT_LOG_HEAD_MASK 0x0007FFF0 |
262 | | #define IOMMU_EVENT_LOG_HEAD_SHIFT 4 |
263 | | #define IOMMU_EVENT_LOG_TAIL_MASK 0x0007FFF0 |
264 | | #define IOMMU_EVENT_LOG_TAIL_SHIFT 4 |
265 | | |
266 | | #define IOMMU_EVENT_LOG_ENTRY_SIZE 16 |
267 | 0 | #define IOMMU_EVENT_LOG_POWER_OF2_ENTRIES_PER_PAGE 8 |
268 | | #define IOMMU_EVENT_LOG_U32_PER_ENTRY (IOMMU_EVENT_LOG_ENTRY_SIZE / 4) |
269 | | |
270 | 0 | #define IOMMU_EVENT_CODE_MASK 0xF0000000 |
271 | 0 | #define IOMMU_EVENT_CODE_SHIFT 28 |
272 | | #define IOMMU_EVENT_ILLEGAL_DEV_TABLE_ENTRY 0x1 |
273 | 0 | #define IOMMU_EVENT_IO_PAGE_FAULT 0x2 |
274 | | #define IOMMU_EVENT_DEV_TABLE_HW_ERROR 0x3 |
275 | | #define IOMMU_EVENT_PAGE_TABLE_HW_ERROR 0x4 |
276 | | #define IOMMU_EVENT_ILLEGAL_COMMAND_ERROR 0x5 |
277 | | #define IOMMU_EVENT_COMMAND_HW_ERROR 0x6 |
278 | | #define IOMMU_EVENT_IOTLB_INV_TIMEOUT 0x7 |
279 | | #define IOMMU_EVENT_INVALID_DEV_REQUEST 0x8 |
280 | | |
281 | 0 | #define IOMMU_EVENT_DOMAIN_ID_MASK 0x0000FFFF |
282 | 0 | #define IOMMU_EVENT_DOMAIN_ID_SHIFT 0 |
283 | | #define IOMMU_EVENT_DEVICE_ID_MASK 0x0000FFFF |
284 | | #define IOMMU_EVENT_DEVICE_ID_SHIFT 0 |
285 | 0 | #define IOMMU_EVENT_FLAGS_SHIFT 16 |
286 | 0 | #define IOMMU_EVENT_FLAGS_MASK 0x0FFF0000 |
287 | | |
288 | | /* PPR Log */ |
289 | | #define IOMMU_PPR_LOG_ENTRY_SIZE 16 |
290 | 0 | #define IOMMU_PPR_LOG_POWER_OF2_ENTRIES_PER_PAGE 8 |
291 | | #define IOMMU_PPR_LOG_U32_PER_ENTRY (IOMMU_PPR_LOG_ENTRY_SIZE / 4) |
292 | | |
293 | 0 | #define IOMMU_PPR_LOG_BASE_LOW_OFFSET 0x0038 |
294 | | #define IOMMU_PPR_LOG_BASE_HIGH_OFFSET 0x003C |
295 | | #define IOMMU_PPR_LOG_BASE_LOW_MASK 0xFFFFF000 |
296 | | #define IOMMU_PPR_LOG_BASE_LOW_SHIFT 12 |
297 | | #define IOMMU_PPR_LOG_BASE_HIGH_MASK 0x000FFFFF |
298 | | #define IOMMU_PPR_LOG_BASE_HIGH_SHIFT 0 |
299 | 0 | #define IOMMU_PPR_LOG_LENGTH_MASK 0x0F000000 |
300 | 0 | #define IOMMU_PPR_LOG_LENGTH_SHIFT 24 |
301 | | #define IOMMU_PPR_LOG_HEAD_MASK 0x0007FFF0 |
302 | | #define IOMMU_PPR_LOG_HEAD_SHIFT 4 |
303 | | #define IOMMU_PPR_LOG_TAIL_MASK 0x0007FFF0 |
304 | | #define IOMMU_PPR_LOG_TAIL_SHIFT 4 |
305 | 0 | #define IOMMU_PPR_LOG_HEAD_OFFSET 0x2030 |
306 | 0 | #define IOMMU_PPR_LOG_TAIL_OFFSET 0x2038 |
307 | | #define IOMMU_PPR_LOG_DEVICE_ID_MASK 0x0000FFFF |
308 | | #define IOMMU_PPR_LOG_DEVICE_ID_SHIFT 0 |
309 | 0 | #define IOMMU_PPR_LOG_CODE_MASK 0xF0000000 |
310 | 0 | #define IOMMU_PPR_LOG_CODE_SHIFT 28 |
311 | | |
312 | | #define IOMMU_LOG_ENTRY_TIMEOUT 1000 |
313 | | |
314 | | /* Control Register */ |
315 | 0 | #define IOMMU_CONTROL_MMIO_OFFSET 0x18 |
316 | | #define IOMMU_CONTROL_TRANSLATION_ENABLE_MASK 0x00000001 |
317 | 0 | #define IOMMU_CONTROL_TRANSLATION_ENABLE_SHIFT 0 |
318 | | #define IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_MASK 0x00000002 |
319 | 0 | #define IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT 1 |
320 | | #define IOMMU_CONTROL_EVENT_LOG_ENABLE_MASK 0x00000004 |
321 | 0 | #define IOMMU_CONTROL_EVENT_LOG_ENABLE_SHIFT 2 |
322 | 0 | #define IOMMU_CONTROL_EVENT_LOG_INT_MASK 0x00000008 |
323 | 0 | #define IOMMU_CONTROL_EVENT_LOG_INT_SHIFT 3 |
324 | | #define IOMMU_CONTROL_COMP_WAIT_INT_MASK 0x00000010 |
325 | 0 | #define IOMMU_CONTROL_COMP_WAIT_INT_SHIFT 4 |
326 | | #define IOMMU_CONTROL_INVALIDATION_TIMEOUT_MASK 0x000000E0 |
327 | | #define IOMMU_CONTROL_INVALIDATION_TIMEOUT_SHIFT 5 |
328 | | #define IOMMU_CONTROL_PASS_POSTED_WRITE_MASK 0x00000100 |
329 | 0 | #define IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT 8 |
330 | | #define IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_MASK 0x00000200 |
331 | 0 | #define IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT 9 |
332 | | #define IOMMU_CONTROL_COHERENT_MASK 0x00000400 |
333 | 0 | #define IOMMU_CONTROL_COHERENT_SHIFT 10 |
334 | | #define IOMMU_CONTROL_ISOCHRONOUS_MASK 0x00000800 |
335 | 0 | #define IOMMU_CONTROL_ISOCHRONOUS_SHIFT 11 |
336 | | #define IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_MASK 0x00001000 |
337 | 0 | #define IOMMU_CONTROL_COMMAND_BUFFER_ENABLE_SHIFT 12 |
338 | | #define IOMMU_CONTROL_PPR_LOG_ENABLE_MASK 0x00002000 |
339 | 0 | #define IOMMU_CONTROL_PPR_LOG_ENABLE_SHIFT 13 |
340 | 0 | #define IOMMU_CONTROL_PPR_LOG_INT_MASK 0x00004000 |
341 | 0 | #define IOMMU_CONTROL_PPR_LOG_INT_SHIFT 14 |
342 | | #define IOMMU_CONTROL_PPR_ENABLE_MASK 0x00008000 |
343 | 0 | #define IOMMU_CONTROL_PPR_ENABLE_SHIFT 15 |
344 | | #define IOMMU_CONTROL_GT_ENABLE_MASK 0x00010000 |
345 | 0 | #define IOMMU_CONTROL_GT_ENABLE_SHIFT 16 |
346 | | #define IOMMU_CONTROL_RESTART_MASK 0x80000000 |
347 | | #define IOMMU_CONTROL_RESTART_SHIFT 31 |
348 | | |
349 | | /* Exclusion Register */ |
350 | | #define IOMMU_EXCLUSION_BASE_LOW_OFFSET 0x20 |
351 | | #define IOMMU_EXCLUSION_BASE_HIGH_OFFSET 0x24 |
352 | | #define IOMMU_EXCLUSION_LIMIT_LOW_OFFSET 0x28 |
353 | | #define IOMMU_EXCLUSION_LIMIT_HIGH_OFFSET 0x2C |
354 | | #define IOMMU_EXCLUSION_BASE_LOW_MASK 0xFFFFF000 |
355 | | #define IOMMU_EXCLUSION_BASE_LOW_SHIFT 12 |
356 | | #define IOMMU_EXCLUSION_BASE_HIGH_MASK 0xFFFFFFFF |
357 | | #define IOMMU_EXCLUSION_BASE_HIGH_SHIFT 0 |
358 | 0 | #define IOMMU_EXCLUSION_RANGE_ENABLE_MASK 0x00000001 |
359 | 0 | #define IOMMU_EXCLUSION_RANGE_ENABLE_SHIFT 0 |
360 | 0 | #define IOMMU_EXCLUSION_ALLOW_ALL_MASK 0x00000002 |
361 | 0 | #define IOMMU_EXCLUSION_ALLOW_ALL_SHIFT 1 |
362 | 0 | #define IOMMU_EXCLUSION_LIMIT_LOW_MASK 0xFFFFF000 |
363 | 0 | #define IOMMU_EXCLUSION_LIMIT_LOW_SHIFT 12 |
364 | 0 | #define IOMMU_EXCLUSION_LIMIT_HIGH_MASK 0xFFFFFFFF |
365 | 0 | #define IOMMU_EXCLUSION_LIMIT_HIGH_SHIFT 0 |
366 | | |
367 | | /* Extended Feature Register*/ |
368 | 0 | #define IOMMU_EXT_FEATURE_MMIO_OFFSET 0x30 |
369 | 0 | #define IOMMU_EXT_FEATURE_PREFSUP_SHIFT 0x0 |
370 | 0 | #define IOMMU_EXT_FEATURE_PPRSUP_SHIFT 0x1 |
371 | | #define IOMMU_EXT_FEATURE_XTSUP_SHIFT 0x2 |
372 | | #define IOMMU_EXT_FEATURE_NXSUP_SHIFT 0x3 |
373 | 0 | #define IOMMU_EXT_FEATURE_GTSUP_SHIFT 0x4 |
374 | 0 | #define IOMMU_EXT_FEATURE_IASUP_SHIFT 0x6 |
375 | | #define IOMMU_EXT_FEATURE_GASUP_SHIFT 0x7 |
376 | | #define IOMMU_EXT_FEATURE_HESUP_SHIFT 0x8 |
377 | | #define IOMMU_EXT_FEATURE_PCSUP_SHIFT 0x9 |
378 | 0 | #define IOMMU_EXT_FEATURE_HATS_SHIFT 0x10 |
379 | 0 | #define IOMMU_EXT_FEATURE_HATS_MASK 0x00000C00 |
380 | 0 | #define IOMMU_EXT_FEATURE_GATS_SHIFT 0x12 |
381 | 0 | #define IOMMU_EXT_FEATURE_GATS_MASK 0x00003000 |
382 | 0 | #define IOMMU_EXT_FEATURE_GLXSUP_SHIFT 0x14 |
383 | 0 | #define IOMMU_EXT_FEATURE_GLXSUP_MASK 0x0000C000 |
384 | | |
385 | 0 | #define IOMMU_EXT_FEATURE_PASMAX_SHIFT 0x0 |
386 | 0 | #define IOMMU_EXT_FEATURE_PASMAX_MASK 0x0000001F |
387 | | |
388 | | /* Status Register*/ |
389 | 0 | #define IOMMU_STATUS_MMIO_OFFSET 0x2020 |
390 | 0 | #define IOMMU_STATUS_EVENT_OVERFLOW_MASK 0x00000001 |
391 | 0 | #define IOMMU_STATUS_EVENT_OVERFLOW_SHIFT 0 |
392 | 0 | #define IOMMU_STATUS_EVENT_LOG_INT_MASK 0x00000002 |
393 | | #define IOMMU_STATUS_EVENT_LOG_INT_SHIFT 1 |
394 | 0 | #define IOMMU_STATUS_COMP_WAIT_INT_MASK 0x00000004 |
395 | 0 | #define IOMMU_STATUS_COMP_WAIT_INT_SHIFT 2 |
396 | | #define IOMMU_STATUS_EVENT_LOG_RUN_MASK 0x00000008 |
397 | 0 | #define IOMMU_STATUS_EVENT_LOG_RUN_SHIFT 3 |
398 | | #define IOMMU_STATUS_CMD_BUFFER_RUN_MASK 0x00000010 |
399 | 0 | #define IOMMU_STATUS_CMD_BUFFER_RUN_SHIFT 4 |
400 | 0 | #define IOMMU_STATUS_PPR_LOG_OVERFLOW_MASK 0x00000020 |
401 | 0 | #define IOMMU_STATUS_PPR_LOG_OVERFLOW_SHIFT 5 |
402 | 0 | #define IOMMU_STATUS_PPR_LOG_INT_MASK 0x00000040 |
403 | | #define IOMMU_STATUS_PPR_LOG_INT_SHIFT 6 |
404 | | #define IOMMU_STATUS_PPR_LOG_RUN_MASK 0x00000080 |
405 | 0 | #define IOMMU_STATUS_PPR_LOG_RUN_SHIFT 7 |
406 | 0 | #define IOMMU_STATUS_GAPIC_LOG_OVERFLOW_MASK 0x00000100 |
407 | | #define IOMMU_STATUS_GAPIC_LOG_OVERFLOW_SHIFT 8 |
408 | 0 | #define IOMMU_STATUS_GAPIC_LOG_INT_MASK 0x00000200 |
409 | | #define IOMMU_STATUS_GAPIC_LOG_INT_SHIFT 9 |
410 | | #define IOMMU_STATUS_GAPIC_LOG_RUN_MASK 0x00000400 |
411 | | #define IOMMU_STATUS_GAPIC_LOG_RUN_SHIFT 10 |
412 | | |
413 | | /* I/O Page Table */ |
414 | 0 | #define IOMMU_PAGE_TABLE_ENTRY_SIZE 8 |
415 | | #define IOMMU_PAGE_TABLE_U32_PER_ENTRY (IOMMU_PAGE_TABLE_ENTRY_SIZE / 4) |
416 | | #define IOMMU_PAGE_TABLE_ALIGNMENT 4096 |
417 | | |
418 | | #define IOMMU_PTE_PRESENT_MASK 0x00000001 |
419 | | #define IOMMU_PTE_PRESENT_SHIFT 0 |
420 | | #define IOMMU_PTE_NEXT_LEVEL_MASK 0x00000E00 |
421 | | #define IOMMU_PTE_NEXT_LEVEL_SHIFT 9 |
422 | 0 | #define IOMMU_PTE_ADDR_LOW_MASK 0xFFFFF000 |
423 | 0 | #define IOMMU_PTE_ADDR_LOW_SHIFT 12 |
424 | 0 | #define IOMMU_PTE_ADDR_HIGH_MASK 0x000FFFFF |
425 | 0 | #define IOMMU_PTE_ADDR_HIGH_SHIFT 0 |
426 | | #define IOMMU_PTE_U_MASK 0x08000000 |
427 | | #define IOMMU_PTE_U_SHIFT 7 |
428 | 0 | #define IOMMU_PTE_FC_MASK 0x10000000 |
429 | 0 | #define IOMMU_PTE_FC_SHIFT 28 |
430 | | #define IOMMU_PTE_IO_READ_PERMISSION_MASK 0x20000000 |
431 | | #define IOMMU_PTE_IO_READ_PERMISSION_SHIFT 29 |
432 | | #define IOMMU_PTE_IO_WRITE_PERMISSION_MASK 0x40000000 |
433 | | #define IOMMU_PTE_IO_WRITE_PERMISSION_SHIFT 30 |
434 | | |
435 | | /* I/O Page Directory */ |
436 | | #define IOMMU_PAGE_DIRECTORY_ENTRY_SIZE 8 |
437 | | #define IOMMU_PAGE_DIRECTORY_ALIGNMENT 4096 |
438 | 0 | #define IOMMU_PDE_PRESENT_MASK 0x00000001 |
439 | 0 | #define IOMMU_PDE_PRESENT_SHIFT 0 |
440 | 0 | #define IOMMU_PDE_NEXT_LEVEL_MASK 0x00000E00 |
441 | 0 | #define IOMMU_PDE_NEXT_LEVEL_SHIFT 9 |
442 | 0 | #define IOMMU_PDE_ADDR_LOW_MASK 0xFFFFF000 |
443 | 0 | #define IOMMU_PDE_ADDR_LOW_SHIFT 12 |
444 | 0 | #define IOMMU_PDE_ADDR_HIGH_MASK 0x000FFFFF |
445 | 0 | #define IOMMU_PDE_ADDR_HIGH_SHIFT 0 |
446 | 0 | #define IOMMU_PDE_IO_READ_PERMISSION_MASK 0x20000000 |
447 | 0 | #define IOMMU_PDE_IO_READ_PERMISSION_SHIFT 29 |
448 | 0 | #define IOMMU_PDE_IO_WRITE_PERMISSION_MASK 0x40000000 |
449 | 0 | #define IOMMU_PDE_IO_WRITE_PERMISSION_SHIFT 30 |
450 | | |
451 | | /* Paging modes */ |
452 | | #define IOMMU_PAGING_MODE_DISABLED 0x0 |
453 | 0 | #define IOMMU_PAGING_MODE_LEVEL_0 0x0 |
454 | 0 | #define IOMMU_PAGING_MODE_LEVEL_1 0x1 |
455 | 0 | #define IOMMU_PAGING_MODE_LEVEL_2 0x2 |
456 | | #define IOMMU_PAGING_MODE_LEVEL_3 0x3 |
457 | 0 | #define IOMMU_PAGING_MODE_LEVEL_4 0x4 |
458 | | #define IOMMU_PAGING_MODE_LEVEL_5 0x5 |
459 | | #define IOMMU_PAGING_MODE_LEVEL_6 0x6 |
460 | | #define IOMMU_PAGING_MODE_LEVEL_7 0x7 |
461 | | |
462 | | /* Flags */ |
463 | 0 | #define IOMMU_CONTROL_DISABLED 0 |
464 | 0 | #define IOMMU_CONTROL_ENABLED 1 |
465 | | |
466 | | /* interrupt remapping table */ |
467 | 0 | #define INT_REMAP_ENTRY_REMAPEN_MASK 0x00000001 |
468 | 0 | #define INT_REMAP_ENTRY_REMAPEN_SHIFT 0 |
469 | 0 | #define INT_REMAP_ENTRY_SUPIOPF_MASK 0x00000002 |
470 | 0 | #define INT_REMAP_ENTRY_SUPIOPF_SHIFT 1 |
471 | 0 | #define INT_REMAP_ENTRY_INTTYPE_MASK 0x0000001C |
472 | 0 | #define INT_REMAP_ENTRY_INTTYPE_SHIFT 2 |
473 | 0 | #define INT_REMAP_ENTRY_REQEOI_MASK 0x00000020 |
474 | 0 | #define INT_REMAP_ENTRY_REQEOI_SHIFT 5 |
475 | 0 | #define INT_REMAP_ENTRY_DM_MASK 0x00000040 |
476 | 0 | #define INT_REMAP_ENTRY_DM_SHIFT 6 |
477 | 0 | #define INT_REMAP_ENTRY_DEST_MAST 0x0000FF00 |
478 | 0 | #define INT_REMAP_ENTRY_DEST_SHIFT 8 |
479 | 0 | #define INT_REMAP_ENTRY_VECTOR_MASK 0x00FF0000 |
480 | 0 | #define INT_REMAP_ENTRY_VECTOR_SHIFT 16 |
481 | | |
482 | 0 | #define INV_IOMMU_ALL_PAGES_ADDRESS ((1ULL << 63) - 1) |
483 | | |
484 | 0 | #define IOMMU_RING_BUFFER_PTR_MASK 0x0007FFF0 |
485 | 0 | #define IOMMU_RING_BUFFER_PTR_SHIFT 4 |
486 | | |
487 | 0 | #define IOMMU_CMD_DEVICE_ID_MASK 0x0000FFFF |
488 | 0 | #define IOMMU_CMD_DEVICE_ID_SHIFT 0 |
489 | | |
490 | | #define IOMMU_CMD_ADDR_LOW_MASK 0xFFFFF000 |
491 | | #define IOMMU_CMD_ADDR_LOW_SHIFT 12 |
492 | | #define IOMMU_CMD_ADDR_HIGH_MASK 0xFFFFFFFF |
493 | | #define IOMMU_CMD_ADDR_HIGH_SHIFT 0 |
494 | | |
495 | 0 | #define IOMMU_REG_BASE_ADDR_LOW_MASK 0xFFFFF000 |
496 | 0 | #define IOMMU_REG_BASE_ADDR_LOW_SHIFT 12 |
497 | 0 | #define IOMMU_REG_BASE_ADDR_HIGH_MASK 0x000FFFFF |
498 | 0 | #define IOMMU_REG_BASE_ADDR_HIGH_SHIFT 0 |
499 | | |
500 | | #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */ |