Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only
2 : : /*
3 : : * Copyright (c) 2006, Intel Corporation.
4 : : *
5 : : * Copyright (C) 2006-2008 Intel Corporation
6 : : * Author: Ashok Raj <ashok.raj@intel.com>
7 : : * Author: Shaohua Li <shaohua.li@intel.com>
8 : : * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
9 : : *
10 : : * This file implements early detection/parsing of Remapping Devices
11 : : * reported to OS through BIOS via DMA remapping reporting (DMAR) ACPI
12 : : * tables.
13 : : *
14 : : * These routines are used by both DMA-remapping and Interrupt-remapping
15 : : */
16 : :
17 : : #define pr_fmt(fmt) "DMAR: " fmt
18 : :
19 : : #include <linux/pci.h>
20 : : #include <linux/dmar.h>
21 : : #include <linux/iova.h>
22 : : #include <linux/intel-iommu.h>
23 : : #include <linux/timer.h>
24 : : #include <linux/irq.h>
25 : : #include <linux/interrupt.h>
26 : : #include <linux/tboot.h>
27 : : #include <linux/dmi.h>
28 : : #include <linux/slab.h>
29 : : #include <linux/iommu.h>
30 : : #include <linux/numa.h>
31 : : #include <linux/limits.h>
32 : : #include <asm/irq_remapping.h>
33 : : #include <asm/iommu_table.h>
34 : :
35 : : #include "irq_remapping.h"
36 : :
37 : : typedef int (*dmar_res_handler_t)(struct acpi_dmar_header *, void *);
38 : : struct dmar_res_callback {
39 : : dmar_res_handler_t cb[ACPI_DMAR_TYPE_RESERVED];
40 : : void *arg[ACPI_DMAR_TYPE_RESERVED];
41 : : bool ignore_unhandled;
42 : : bool print_entry;
43 : : };
44 : :
45 : : /*
46 : : * Assumptions:
47 : : * 1) The hotplug framework guarentees that DMAR unit will be hot-added
48 : : * before IO devices managed by that unit.
49 : : * 2) The hotplug framework guarantees that DMAR unit will be hot-removed
50 : : * after IO devices managed by that unit.
51 : : * 3) Hotplug events are rare.
52 : : *
53 : : * Locking rules for DMA and interrupt remapping related global data structures:
54 : : * 1) Use dmar_global_lock in process context
55 : : * 2) Use RCU in interrupt context
56 : : */
57 : : DECLARE_RWSEM(dmar_global_lock);
58 : : LIST_HEAD(dmar_drhd_units);
59 : :
60 : : struct acpi_table_header * __initdata dmar_tbl;
61 : : static int dmar_dev_scope_status = 1;
62 : : static unsigned long dmar_seq_ids[BITS_TO_LONGS(DMAR_UNITS_SUPPORTED)];
63 : :
64 : : static int alloc_iommu(struct dmar_drhd_unit *drhd);
65 : : static void free_iommu(struct intel_iommu *iommu);
66 : :
67 : : extern const struct iommu_ops intel_iommu_ops;
68 : :
69 : 0 : static void dmar_register_drhd_unit(struct dmar_drhd_unit *drhd)
70 : : {
71 : : /*
72 : : * add INCLUDE_ALL at the tail, so scan the list will find it at
73 : : * the very end.
74 : : */
75 : 0 : if (drhd->include_all)
76 : 0 : list_add_tail_rcu(&drhd->list, &dmar_drhd_units);
77 : : else
78 : 0 : list_add_rcu(&drhd->list, &dmar_drhd_units);
79 : : }
80 : :
81 : 0 : void *dmar_alloc_dev_scope(void *start, void *end, int *cnt)
82 : : {
83 : 0 : struct acpi_dmar_device_scope *scope;
84 : :
85 : 0 : *cnt = 0;
86 [ # # ]: 0 : while (start < end) {
87 : 0 : scope = start;
88 [ # # ]: 0 : if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_NAMESPACE ||
89 [ # # ]: 0 : scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
90 : : scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE)
91 : 0 : (*cnt)++;
92 [ # # ]: 0 : else if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_IOAPIC &&
93 : : scope->entry_type != ACPI_DMAR_SCOPE_TYPE_HPET) {
94 : 0 : pr_warn("Unsupported device scope\n");
95 : : }
96 : 0 : start += scope->length;
97 : : }
98 [ # # ]: 0 : if (*cnt == 0)
99 : : return NULL;
100 : :
101 : 0 : return kcalloc(*cnt, sizeof(struct dmar_dev_scope), GFP_KERNEL);
102 : : }
103 : :
104 : 0 : void dmar_free_dev_scope(struct dmar_dev_scope **devices, int *cnt)
105 : : {
106 : 0 : int i;
107 : 0 : struct device *tmp_dev;
108 : :
109 [ # # # # ]: 0 : if (*devices && *cnt) {
110 [ # # # # : 0 : for_each_active_dev_scope(*devices, *cnt, i, tmp_dev)
# # ]
111 : 0 : put_device(tmp_dev);
112 : 0 : kfree(*devices);
113 : : }
114 : :
115 : 0 : *devices = NULL;
116 : 0 : *cnt = 0;
117 : 0 : }
118 : :
119 : : /* Optimize out kzalloc()/kfree() for normal cases */
120 : : static char dmar_pci_notify_info_buf[64];
121 : :
122 : : static struct dmar_pci_notify_info *
123 : 0 : dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event)
124 : : {
125 : 0 : int level = 0;
126 : 0 : size_t size;
127 : 0 : struct pci_dev *tmp;
128 : 0 : struct dmar_pci_notify_info *info;
129 : :
130 [ # # ]: 0 : BUG_ON(dev->is_virtfn);
131 : :
132 : : /*
133 : : * Ignore devices that have a domain number higher than what can
134 : : * be looked up in DMAR, e.g. VMD subdevices with domain 0x10000
135 : : */
136 [ # # ]: 0 : if (pci_domain_nr(dev->bus) > U16_MAX)
137 : : return NULL;
138 : :
139 : : /* Only generate path[] for device addition event */
140 [ # # ]: 0 : if (event == BUS_NOTIFY_ADD_DEVICE)
141 [ # # ]: 0 : for (tmp = dev; tmp; tmp = tmp->bus->self)
142 : 0 : level++;
143 : :
144 [ # # ]: 0 : size = struct_size(info, path, level);
145 [ # # ]: 0 : if (size <= sizeof(dmar_pci_notify_info_buf)) {
146 : : info = (struct dmar_pci_notify_info *)dmar_pci_notify_info_buf;
147 : : } else {
148 : 0 : info = kzalloc(size, GFP_KERNEL);
149 [ # # ]: 0 : if (!info) {
150 [ # # ]: 0 : pr_warn("Out of memory when allocating notify_info "
151 : : "for %s.\n", pci_name(dev));
152 [ # # ]: 0 : if (dmar_dev_scope_status == 0)
153 : 0 : dmar_dev_scope_status = -ENOMEM;
154 : 0 : return NULL;
155 : : }
156 : : }
157 : :
158 : 0 : info->event = event;
159 : 0 : info->dev = dev;
160 [ # # ]: 0 : info->seg = pci_domain_nr(dev->bus);
161 : 0 : info->level = level;
162 [ # # ]: 0 : if (event == BUS_NOTIFY_ADD_DEVICE) {
163 [ # # ]: 0 : for (tmp = dev; tmp; tmp = tmp->bus->self) {
164 : 0 : level--;
165 : 0 : info->path[level].bus = tmp->bus->number;
166 : 0 : info->path[level].device = PCI_SLOT(tmp->devfn);
167 : 0 : info->path[level].function = PCI_FUNC(tmp->devfn);
168 [ # # ]: 0 : if (pci_is_root_bus(tmp->bus))
169 : 0 : info->bus = tmp->bus->number;
170 : : }
171 : : }
172 : :
173 : : return info;
174 : : }
175 : :
176 : 0 : static inline void dmar_free_pci_notify_info(struct dmar_pci_notify_info *info)
177 : : {
178 : 0 : if ((void *)info != dmar_pci_notify_info_buf)
179 : 0 : kfree(info);
180 : : }
181 : :
182 : 0 : static bool dmar_match_pci_path(struct dmar_pci_notify_info *info, int bus,
183 : : struct acpi_dmar_pci_path *path, int count)
184 : : {
185 : 0 : int i;
186 : :
187 [ # # ]: 0 : if (info->bus != bus)
188 : 0 : goto fallback;
189 [ # # ]: 0 : if (info->level != count)
190 : 0 : goto fallback;
191 : :
192 [ # # ]: 0 : for (i = 0; i < count; i++) {
193 [ # # ]: 0 : if (path[i].device != info->path[i].device ||
194 [ # # ]: 0 : path[i].function != info->path[i].function)
195 : 0 : goto fallback;
196 : : }
197 : :
198 : : return true;
199 : :
200 : 0 : fallback:
201 : :
202 [ # # ]: 0 : if (count != 1)
203 : : return false;
204 : :
205 : 0 : i = info->level - 1;
206 [ # # ]: 0 : if (bus == info->path[i].bus &&
207 [ # # ]: 0 : path[0].device == info->path[i].device &&
208 [ # # ]: 0 : path[0].function == info->path[i].function) {
209 : 0 : pr_info(FW_BUG "RMRR entry for device %02x:%02x.%x is broken - applying workaround\n",
210 : : bus, path[0].device, path[0].function);
211 : 0 : return true;
212 : : }
213 : :
214 : : return false;
215 : : }
216 : :
217 : : /* Return: > 0 if match found, 0 if no match found, < 0 if error happens */
218 : 0 : int dmar_insert_dev_scope(struct dmar_pci_notify_info *info,
219 : : void *start, void*end, u16 segment,
220 : : struct dmar_dev_scope *devices,
221 : : int devices_cnt)
222 : : {
223 : 0 : int i, level;
224 : 0 : struct device *tmp, *dev = &info->dev->dev;
225 : 0 : struct acpi_dmar_device_scope *scope;
226 : 0 : struct acpi_dmar_pci_path *path;
227 : :
228 [ # # ]: 0 : if (segment != info->seg)
229 : : return 0;
230 : :
231 [ # # ]: 0 : for (; start < end; start += scope->length) {
232 : 0 : scope = start;
233 [ # # ]: 0 : if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_ENDPOINT &&
234 : : scope->entry_type != ACPI_DMAR_SCOPE_TYPE_BRIDGE)
235 : 0 : continue;
236 : :
237 : 0 : path = (struct acpi_dmar_pci_path *)(scope + 1);
238 : 0 : level = (scope->length - sizeof(*scope)) / sizeof(*path);
239 [ # # ]: 0 : if (!dmar_match_pci_path(info, scope->bus, path, level))
240 : 0 : continue;
241 : :
242 : : /*
243 : : * We expect devices with endpoint scope to have normal PCI
244 : : * headers, and devices with bridge scope to have bridge PCI
245 : : * headers. However PCI NTB devices may be listed in the
246 : : * DMAR table with bridge scope, even though they have a
247 : : * normal PCI header. NTB devices are identified by class
248 : : * "BRIDGE_OTHER" (0680h) - we don't declare a socpe mismatch
249 : : * for this special case.
250 : : */
251 [ # # ]: 0 : if ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT &&
252 [ # # # # ]: 0 : info->dev->hdr_type != PCI_HEADER_TYPE_NORMAL) ||
253 : 0 : (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE &&
254 [ # # ]: 0 : (info->dev->hdr_type == PCI_HEADER_TYPE_NORMAL &&
255 [ # # ]: 0 : info->dev->class >> 16 != PCI_BASE_CLASS_BRIDGE))) {
256 [ # # ]: 0 : pr_warn("Device scope type does not match for %s\n",
257 : : pci_name(info->dev));
258 : 0 : return -EINVAL;
259 : : }
260 : :
261 [ # # # # ]: 0 : for_each_dev_scope(devices, devices_cnt, i, tmp)
262 [ # # ]: 0 : if (tmp == NULL) {
263 : 0 : devices[i].bus = info->dev->bus->number;
264 : 0 : devices[i].devfn = info->dev->devfn;
265 : 0 : rcu_assign_pointer(devices[i].dev,
266 : : get_device(dev));
267 : 0 : return 1;
268 : : }
269 : 0 : BUG_ON(i >= devices_cnt);
270 : : }
271 : :
272 : : return 0;
273 : : }
274 : :
275 : 0 : int dmar_remove_dev_scope(struct dmar_pci_notify_info *info, u16 segment,
276 : : struct dmar_dev_scope *devices, int count)
277 : : {
278 : 0 : int index;
279 : 0 : struct device *tmp;
280 : :
281 [ # # ]: 0 : if (info->seg != segment)
282 : : return 0;
283 : :
284 [ # # # # : 0 : for_each_active_dev_scope(devices, count, index, tmp)
# # ]
285 [ # # ]: 0 : if (tmp == &info->dev->dev) {
286 : 0 : RCU_INIT_POINTER(devices[index].dev, NULL);
287 : 0 : synchronize_rcu();
288 : 0 : put_device(tmp);
289 : 0 : return 1;
290 : : }
291 : :
292 : : return 0;
293 : : }
294 : :
295 : 0 : static int dmar_pci_bus_add_dev(struct dmar_pci_notify_info *info)
296 : : {
297 : 0 : int ret = 0;
298 : 0 : struct dmar_drhd_unit *dmaru;
299 : 0 : struct acpi_dmar_hardware_unit *drhd;
300 : :
301 [ # # ]: 0 : for_each_drhd_unit(dmaru) {
302 [ # # ]: 0 : if (dmaru->include_all)
303 : 0 : continue;
304 : :
305 : 0 : drhd = container_of(dmaru->hdr,
306 : : struct acpi_dmar_hardware_unit, header);
307 : 0 : ret = dmar_insert_dev_scope(info, (void *)(drhd + 1),
308 : 0 : ((void *)drhd) + drhd->header.length,
309 : 0 : dmaru->segment,
310 : : dmaru->devices, dmaru->devices_cnt);
311 [ # # ]: 0 : if (ret)
312 : : break;
313 : : }
314 [ # # ]: 0 : if (ret >= 0)
315 : 0 : ret = dmar_iommu_notify_scope_dev(info);
316 [ # # # # ]: 0 : if (ret < 0 && dmar_dev_scope_status == 0)
317 : 0 : dmar_dev_scope_status = ret;
318 : :
319 : 0 : return ret;
320 : : }
321 : :
322 : 0 : static void dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
323 : : {
324 : 0 : struct dmar_drhd_unit *dmaru;
325 : :
326 [ # # ]: 0 : for_each_drhd_unit(dmaru)
327 [ # # ]: 0 : if (dmar_remove_dev_scope(info, dmaru->segment,
328 : : dmaru->devices, dmaru->devices_cnt))
329 : : break;
330 : 0 : dmar_iommu_notify_scope_dev(info);
331 : 0 : }
332 : :
333 : 0 : static int dmar_pci_bus_notifier(struct notifier_block *nb,
334 : : unsigned long action, void *data)
335 : : {
336 : 0 : struct pci_dev *pdev = to_pci_dev(data);
337 : 0 : struct dmar_pci_notify_info *info;
338 : :
339 : : /* Only care about add/remove events for physical functions.
340 : : * For VFs we actually do the lookup based on the corresponding
341 : : * PF in device_to_iommu() anyway. */
342 [ # # ]: 0 : if (pdev->is_virtfn)
343 : : return NOTIFY_DONE;
344 : 0 : if (action != BUS_NOTIFY_ADD_DEVICE &&
345 [ # # ]: 0 : action != BUS_NOTIFY_REMOVED_DEVICE)
346 : : return NOTIFY_DONE;
347 : :
348 : 0 : info = dmar_alloc_pci_notify_info(pdev, action);
349 [ # # ]: 0 : if (!info)
350 : : return NOTIFY_DONE;
351 : :
352 : 0 : down_write(&dmar_global_lock);
353 [ # # ]: 0 : if (action == BUS_NOTIFY_ADD_DEVICE)
354 : 0 : dmar_pci_bus_add_dev(info);
355 [ # # ]: 0 : else if (action == BUS_NOTIFY_REMOVED_DEVICE)
356 : 0 : dmar_pci_bus_del_dev(info);
357 : 0 : up_write(&dmar_global_lock);
358 : :
359 [ # # ]: 0 : dmar_free_pci_notify_info(info);
360 : :
361 : : return NOTIFY_OK;
362 : : }
363 : :
364 : : static struct notifier_block dmar_pci_bus_nb = {
365 : : .notifier_call = dmar_pci_bus_notifier,
366 : : .priority = INT_MIN,
367 : : };
368 : :
369 : : static struct dmar_drhd_unit *
370 : 0 : dmar_find_dmaru(struct acpi_dmar_hardware_unit *drhd)
371 : : {
372 : 0 : struct dmar_drhd_unit *dmaru;
373 : :
374 [ # # # # : 0 : list_for_each_entry_rcu(dmaru, &dmar_drhd_units, list,
# # # # ]
375 : : dmar_rcu_check())
376 [ # # # # : 0 : if (dmaru->segment == drhd->segment &&
# # # # ]
377 [ # # # # : 0 : dmaru->reg_base_addr == drhd->address)
# # # # ]
378 : : return dmaru;
379 : :
380 : : return NULL;
381 : : }
382 : :
383 : : /**
384 : : * dmar_parse_one_drhd - parses exactly one DMA remapping hardware definition
385 : : * structure which uniquely represent one DMA remapping hardware unit
386 : : * present in the platform
387 : : */
388 : 0 : static int dmar_parse_one_drhd(struct acpi_dmar_header *header, void *arg)
389 : : {
390 : 0 : struct acpi_dmar_hardware_unit *drhd;
391 : 0 : struct dmar_drhd_unit *dmaru;
392 : 0 : int ret;
393 : :
394 : 0 : drhd = (struct acpi_dmar_hardware_unit *)header;
395 : 0 : dmaru = dmar_find_dmaru(drhd);
396 [ # # ]: 0 : if (dmaru)
397 : 0 : goto out;
398 : :
399 : 0 : dmaru = kzalloc(sizeof(*dmaru) + header->length, GFP_KERNEL);
400 [ # # ]: 0 : if (!dmaru)
401 : : return -ENOMEM;
402 : :
403 : : /*
404 : : * If header is allocated from slab by ACPI _DSM method, we need to
405 : : * copy the content because the memory buffer will be freed on return.
406 : : */
407 : 0 : dmaru->hdr = (void *)(dmaru + 1);
408 : 0 : memcpy(dmaru->hdr, header, header->length);
409 : 0 : dmaru->reg_base_addr = drhd->address;
410 : 0 : dmaru->segment = drhd->segment;
411 : 0 : dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */
412 : 0 : dmaru->devices = dmar_alloc_dev_scope((void *)(drhd + 1),
413 : 0 : ((void *)drhd) + drhd->header.length,
414 : : &dmaru->devices_cnt);
415 [ # # # # ]: 0 : if (dmaru->devices_cnt && dmaru->devices == NULL) {
416 : 0 : kfree(dmaru);
417 : 0 : return -ENOMEM;
418 : : }
419 : :
420 : 0 : ret = alloc_iommu(dmaru);
421 [ # # ]: 0 : if (ret) {
422 : 0 : dmar_free_dev_scope(&dmaru->devices,
423 : : &dmaru->devices_cnt);
424 : 0 : kfree(dmaru);
425 : 0 : return ret;
426 : : }
427 [ # # ]: 0 : dmar_register_drhd_unit(dmaru);
428 : :
429 : 0 : out:
430 [ # # ]: 0 : if (arg)
431 : 0 : (*(int *)arg)++;
432 : :
433 : : return 0;
434 : : }
435 : :
436 : 0 : static void dmar_free_drhd(struct dmar_drhd_unit *dmaru)
437 : : {
438 [ # # # # ]: 0 : if (dmaru->devices && dmaru->devices_cnt)
439 : 0 : dmar_free_dev_scope(&dmaru->devices, &dmaru->devices_cnt);
440 [ # # ]: 0 : if (dmaru->iommu)
441 : 0 : free_iommu(dmaru->iommu);
442 : 0 : kfree(dmaru);
443 : 0 : }
444 : :
445 : 0 : static int __init dmar_parse_one_andd(struct acpi_dmar_header *header,
446 : : void *arg)
447 : : {
448 : 0 : struct acpi_dmar_andd *andd = (void *)header;
449 : :
450 : : /* Check for NUL termination within the designated length */
451 [ # # ]: 0 : if (strnlen(andd->device_name, header->length - 8) == header->length - 8) {
452 : 0 : pr_warn(FW_BUG
453 : : "Your BIOS is broken; ANDD object name is not NUL-terminated\n"
454 : : "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
455 : : dmi_get_system_info(DMI_BIOS_VENDOR),
456 : : dmi_get_system_info(DMI_BIOS_VERSION),
457 : : dmi_get_system_info(DMI_PRODUCT_VERSION));
458 : 0 : add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
459 : 0 : return -EINVAL;
460 : : }
461 : 0 : pr_info("ANDD device: %x name: %s\n", andd->device_number,
462 : : andd->device_name);
463 : :
464 : 0 : return 0;
465 : : }
466 : :
467 : : #ifdef CONFIG_ACPI_NUMA
468 : 0 : static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
469 : : {
470 : 0 : struct acpi_dmar_rhsa *rhsa;
471 : 0 : struct dmar_drhd_unit *drhd;
472 : :
473 : 0 : rhsa = (struct acpi_dmar_rhsa *)header;
474 [ # # ]: 0 : for_each_drhd_unit(drhd) {
475 [ # # ]: 0 : if (drhd->reg_base_addr == rhsa->base_address) {
476 : 0 : int node = acpi_map_pxm_to_node(rhsa->proximity_domain);
477 : :
478 [ # # ]: 0 : if (!node_online(node))
479 : 0 : node = NUMA_NO_NODE;
480 : 0 : drhd->iommu->node = node;
481 : 0 : return 0;
482 : : }
483 : : }
484 : 0 : pr_warn(FW_BUG
485 : : "Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n"
486 : : "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
487 : : rhsa->base_address,
488 : : dmi_get_system_info(DMI_BIOS_VENDOR),
489 : : dmi_get_system_info(DMI_BIOS_VERSION),
490 : : dmi_get_system_info(DMI_PRODUCT_VERSION));
491 : 0 : add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
492 : :
493 : 0 : return 0;
494 : : }
495 : : #else
496 : : #define dmar_parse_one_rhsa dmar_res_noop
497 : : #endif
498 : :
499 : : static void
500 : 0 : dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
501 : : {
502 : 0 : struct acpi_dmar_hardware_unit *drhd;
503 : 0 : struct acpi_dmar_reserved_memory *rmrr;
504 : 0 : struct acpi_dmar_atsr *atsr;
505 : 0 : struct acpi_dmar_rhsa *rhsa;
506 : :
507 [ # # # # : 0 : switch (header->type) {
# ]
508 : 0 : case ACPI_DMAR_TYPE_HARDWARE_UNIT:
509 : 0 : drhd = container_of(header, struct acpi_dmar_hardware_unit,
510 : : header);
511 : 0 : pr_info("DRHD base: %#016Lx flags: %#x\n",
512 : : (unsigned long long)drhd->address, drhd->flags);
513 : 0 : break;
514 : 0 : case ACPI_DMAR_TYPE_RESERVED_MEMORY:
515 : 0 : rmrr = container_of(header, struct acpi_dmar_reserved_memory,
516 : : header);
517 : 0 : pr_info("RMRR base: %#016Lx end: %#016Lx\n",
518 : : (unsigned long long)rmrr->base_address,
519 : : (unsigned long long)rmrr->end_address);
520 : 0 : break;
521 : 0 : case ACPI_DMAR_TYPE_ROOT_ATS:
522 : 0 : atsr = container_of(header, struct acpi_dmar_atsr, header);
523 : 0 : pr_info("ATSR flags: %#x\n", atsr->flags);
524 : 0 : break;
525 : 0 : case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
526 : 0 : rhsa = container_of(header, struct acpi_dmar_rhsa, header);
527 : 0 : pr_info("RHSA base: %#016Lx proximity domain: %#x\n",
528 : : (unsigned long long)rhsa->base_address,
529 : : rhsa->proximity_domain);
530 : 0 : break;
531 : : case ACPI_DMAR_TYPE_NAMESPACE:
532 : : /* We don't print this here because we need to sanity-check
533 : : it first. So print it in dmar_parse_one_andd() instead. */
534 : : break;
535 : : }
536 : 0 : }
537 : :
538 : : /**
539 : : * dmar_table_detect - checks to see if the platform supports DMAR devices
540 : : */
541 : 30 : static int __init dmar_table_detect(void)
542 : : {
543 : 30 : acpi_status status = AE_OK;
544 : :
545 : : /* if we could find DMAR table, then there are DMAR devices */
546 : 30 : status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl);
547 : :
548 [ - + - - ]: 30 : if (ACPI_SUCCESS(status) && !dmar_tbl) {
549 : 0 : pr_warn("Unable to map DMAR\n");
550 : 0 : status = AE_NOT_FOUND;
551 : : }
552 : :
553 [ + - ]: 30 : return ACPI_SUCCESS(status) ? 0 : -ENOENT;
554 : : }
555 : :
556 : 0 : static int dmar_walk_remapping_entries(struct acpi_dmar_header *start,
557 : : size_t len, struct dmar_res_callback *cb)
558 : : {
559 : 0 : struct acpi_dmar_header *iter, *next;
560 : 0 : struct acpi_dmar_header *end = ((void *)start) + len;
561 : :
562 [ # # ]: 0 : for (iter = start; iter < end; iter = next) {
563 : 0 : next = (void *)iter + iter->length;
564 [ # # ]: 0 : if (iter->length == 0) {
565 : : /* Avoid looping forever on bad ACPI tables */
566 : : pr_debug(FW_BUG "Invalid 0-length structure\n");
567 : : break;
568 [ # # ]: 0 : } else if (next > end) {
569 : : /* Avoid passing table end */
570 : 0 : pr_warn(FW_BUG "Record passes table end\n");
571 : 0 : return -EINVAL;
572 : : }
573 : :
574 [ # # ]: 0 : if (cb->print_entry)
575 : 0 : dmar_table_print_dmar_entry(iter);
576 : :
577 [ # # ]: 0 : if (iter->type >= ACPI_DMAR_TYPE_RESERVED) {
578 : : /* continue for forward compatibility */
579 : : pr_debug("Unknown DMAR structure type %d\n",
580 : : iter->type);
581 [ # # ]: 0 : } else if (cb->cb[iter->type]) {
582 : 0 : int ret;
583 : :
584 : 0 : ret = cb->cb[iter->type](iter, cb->arg[iter->type]);
585 [ # # ]: 0 : if (ret)
586 : 0 : return ret;
587 [ # # ]: 0 : } else if (!cb->ignore_unhandled) {
588 : 0 : pr_warn("No handler for DMAR structure type %d\n",
589 : : iter->type);
590 : 0 : return -EINVAL;
591 : : }
592 : : }
593 : :
594 : : return 0;
595 : : }
596 : :
597 : 0 : static inline int dmar_walk_dmar_table(struct acpi_table_dmar *dmar,
598 : : struct dmar_res_callback *cb)
599 : : {
600 : 0 : return dmar_walk_remapping_entries((void *)(dmar + 1),
601 : 0 : dmar->header.length - sizeof(*dmar), cb);
602 : : }
603 : :
604 : : /**
605 : : * parse_dmar_table - parses the DMA reporting table
606 : : */
607 : : static int __init
608 : 0 : parse_dmar_table(void)
609 : : {
610 : 0 : struct acpi_table_dmar *dmar;
611 : 0 : int drhd_count = 0;
612 : 0 : int ret;
613 : 0 : struct dmar_res_callback cb = {
614 : : .print_entry = true,
615 : : .ignore_unhandled = true,
616 : : .arg[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &drhd_count,
617 : : .cb[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &dmar_parse_one_drhd,
618 : : .cb[ACPI_DMAR_TYPE_RESERVED_MEMORY] = &dmar_parse_one_rmrr,
619 : : .cb[ACPI_DMAR_TYPE_ROOT_ATS] = &dmar_parse_one_atsr,
620 : : .cb[ACPI_DMAR_TYPE_HARDWARE_AFFINITY] = &dmar_parse_one_rhsa,
621 : : .cb[ACPI_DMAR_TYPE_NAMESPACE] = &dmar_parse_one_andd,
622 : : };
623 : :
624 : : /*
625 : : * Do it again, earlier dmar_tbl mapping could be mapped with
626 : : * fixed map.
627 : : */
628 : 0 : dmar_table_detect();
629 : :
630 : : /*
631 : : * ACPI tables may not be DMA protected by tboot, so use DMAR copy
632 : : * SINIT saved in SinitMleData in TXT heap (which is DMA protected)
633 : : */
634 : 0 : dmar_tbl = tboot_get_dmar_table(dmar_tbl);
635 : :
636 : 0 : dmar = (struct acpi_table_dmar *)dmar_tbl;
637 [ # # ]: 0 : if (!dmar)
638 : : return -ENODEV;
639 : :
640 [ # # ]: 0 : if (dmar->width < PAGE_SHIFT - 1) {
641 : 0 : pr_warn("Invalid DMAR haw\n");
642 : 0 : return -EINVAL;
643 : : }
644 : :
645 : 0 : pr_info("Host address width %d\n", dmar->width + 1);
646 : 0 : ret = dmar_walk_dmar_table(dmar, &cb);
647 [ # # # # ]: 0 : if (ret == 0 && drhd_count == 0)
648 : 0 : pr_warn(FW_BUG "No DRHD structure found in DMAR table\n");
649 : :
650 : : return ret;
651 : : }
652 : :
653 : 0 : static int dmar_pci_device_match(struct dmar_dev_scope devices[],
654 : : int cnt, struct pci_dev *dev)
655 : : {
656 : 0 : int index;
657 : 0 : struct device *tmp;
658 : :
659 [ # # ]: 0 : while (dev) {
660 [ # # # # : 0 : for_each_active_dev_scope(devices, cnt, index, tmp)
# # ]
661 [ # # # # ]: 0 : if (dev_is_pci(tmp) && dev == to_pci_dev(tmp))
662 : : return 1;
663 : :
664 : : /* Check our parent */
665 : 0 : dev = dev->bus->self;
666 : : }
667 : :
668 : : return 0;
669 : : }
670 : :
671 : : struct dmar_drhd_unit *
672 : 0 : dmar_find_matched_drhd_unit(struct pci_dev *dev)
673 : : {
674 : 0 : struct dmar_drhd_unit *dmaru;
675 : 0 : struct acpi_dmar_hardware_unit *drhd;
676 : :
677 : 0 : dev = pci_physfn(dev);
678 : :
679 : 0 : rcu_read_lock();
680 [ # # ]: 0 : for_each_drhd_unit(dmaru) {
681 : 0 : drhd = container_of(dmaru->hdr,
682 : : struct acpi_dmar_hardware_unit,
683 : : header);
684 : :
685 [ # # # # ]: 0 : if (dmaru->include_all &&
686 [ # # ]: 0 : drhd->segment == pci_domain_nr(dev->bus))
687 : 0 : goto out;
688 : :
689 [ # # ]: 0 : if (dmar_pci_device_match(dmaru->devices,
690 : : dmaru->devices_cnt, dev))
691 : 0 : goto out;
692 : : }
693 : : dmaru = NULL;
694 : 0 : out:
695 : 0 : rcu_read_unlock();
696 : :
697 : 0 : return dmaru;
698 : : }
699 : :
700 : 0 : static void __init dmar_acpi_insert_dev_scope(u8 device_number,
701 : : struct acpi_device *adev)
702 : : {
703 : 0 : struct dmar_drhd_unit *dmaru;
704 : 0 : struct acpi_dmar_hardware_unit *drhd;
705 : 0 : struct acpi_dmar_device_scope *scope;
706 : 0 : struct device *tmp;
707 : 0 : int i;
708 : 0 : struct acpi_dmar_pci_path *path;
709 : :
710 [ # # ]: 0 : for_each_drhd_unit(dmaru) {
711 : 0 : drhd = container_of(dmaru->hdr,
712 : : struct acpi_dmar_hardware_unit,
713 : : header);
714 : :
715 : 0 : for (scope = (void *)(drhd + 1);
716 [ # # ]: 0 : (unsigned long)scope < ((unsigned long)drhd) + drhd->header.length;
717 : 0 : scope = ((void *)scope) + scope->length) {
718 [ # # ]: 0 : if (scope->entry_type != ACPI_DMAR_SCOPE_TYPE_NAMESPACE)
719 : 0 : continue;
720 [ # # ]: 0 : if (scope->enumeration_id != device_number)
721 : 0 : continue;
722 : :
723 : 0 : path = (void *)(scope + 1);
724 [ # # ]: 0 : pr_info("ACPI device \"%s\" under DMAR at %llx as %02x:%02x.%d\n",
725 : : dev_name(&adev->dev), dmaru->reg_base_addr,
726 : : scope->bus, path->device, path->function);
727 [ # # # # ]: 0 : for_each_dev_scope(dmaru->devices, dmaru->devices_cnt, i, tmp)
728 [ # # ]: 0 : if (tmp == NULL) {
729 : 0 : dmaru->devices[i].bus = scope->bus;
730 : 0 : dmaru->devices[i].devfn = PCI_DEVFN(path->device,
731 : : path->function);
732 : 0 : rcu_assign_pointer(dmaru->devices[i].dev,
733 : : get_device(&adev->dev));
734 : 0 : return;
735 : : }
736 : 0 : BUG_ON(i >= dmaru->devices_cnt);
737 : : }
738 : : }
739 [ # # ]: 0 : pr_warn("No IOMMU scope found for ANDD enumeration ID %d (%s)\n",
740 : : device_number, dev_name(&adev->dev));
741 : : }
742 : :
743 : 0 : static int __init dmar_acpi_dev_scope_init(void)
744 : : {
745 : 0 : struct acpi_dmar_andd *andd;
746 : :
747 [ # # ]: 0 : if (dmar_tbl == NULL)
748 : : return -ENODEV;
749 : :
750 : 0 : for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
751 [ # # ]: 0 : ((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length;
752 : 0 : andd = ((void *)andd) + andd->header.length) {
753 [ # # ]: 0 : if (andd->header.type == ACPI_DMAR_TYPE_NAMESPACE) {
754 : 0 : acpi_handle h;
755 : 0 : struct acpi_device *adev;
756 : :
757 [ # # ]: 0 : if (!ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT,
758 : : andd->device_name,
759 : : &h))) {
760 : 0 : pr_err("Failed to find handle for ACPI object %s\n",
761 : : andd->device_name);
762 : 0 : continue;
763 : : }
764 [ # # ]: 0 : if (acpi_bus_get_device(h, &adev)) {
765 : 0 : pr_err("Failed to get device for ACPI object %s\n",
766 : : andd->device_name);
767 : 0 : continue;
768 : : }
769 : 0 : dmar_acpi_insert_dev_scope(andd->device_number, adev);
770 : : }
771 : : }
772 : : return 0;
773 : : }
774 : :
775 : 0 : int __init dmar_dev_scope_init(void)
776 : : {
777 : 0 : struct pci_dev *dev = NULL;
778 : 0 : struct dmar_pci_notify_info *info;
779 : :
780 [ # # ]: 0 : if (dmar_dev_scope_status != 1)
781 : : return dmar_dev_scope_status;
782 : :
783 [ # # ]: 0 : if (list_empty(&dmar_drhd_units)) {
784 : 0 : dmar_dev_scope_status = -ENODEV;
785 : : } else {
786 : 0 : dmar_dev_scope_status = 0;
787 : :
788 : 0 : dmar_acpi_dev_scope_init();
789 : :
790 [ # # ]: 0 : for_each_pci_dev(dev) {
791 [ # # ]: 0 : if (dev->is_virtfn)
792 : 0 : continue;
793 : :
794 : 0 : info = dmar_alloc_pci_notify_info(dev,
795 : : BUS_NOTIFY_ADD_DEVICE);
796 [ # # ]: 0 : if (!info) {
797 : 0 : return dmar_dev_scope_status;
798 : : } else {
799 : 0 : dmar_pci_bus_add_dev(info);
800 [ # # ]: 0 : dmar_free_pci_notify_info(info);
801 : : }
802 : : }
803 : : }
804 : :
805 : 0 : return dmar_dev_scope_status;
806 : : }
807 : :
808 : 0 : void __init dmar_register_bus_notifier(void)
809 : : {
810 : 0 : bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
811 : 0 : }
812 : :
813 : :
814 : 0 : int __init dmar_table_init(void)
815 : : {
816 : 0 : static int dmar_table_initialized;
817 : 0 : int ret;
818 : :
819 [ # # ]: 0 : if (dmar_table_initialized == 0) {
820 : 0 : ret = parse_dmar_table();
821 [ # # ]: 0 : if (ret < 0) {
822 [ # # ]: 0 : if (ret != -ENODEV)
823 : 0 : pr_info("Parse DMAR table failure.\n");
824 [ # # ]: 0 : } else if (list_empty(&dmar_drhd_units)) {
825 : 0 : pr_info("No DMAR devices found\n");
826 : 0 : ret = -ENODEV;
827 : : }
828 : :
829 [ # # ]: 0 : if (ret < 0)
830 : 0 : dmar_table_initialized = ret;
831 : : else
832 : 0 : dmar_table_initialized = 1;
833 : : }
834 : :
835 : 0 : return dmar_table_initialized < 0 ? dmar_table_initialized : 0;
836 : : }
837 : :
838 : 0 : static void warn_invalid_dmar(u64 addr, const char *message)
839 : : {
840 [ # # ]: 0 : pr_warn_once(FW_BUG
841 : : "Your BIOS is broken; DMAR reported at address %llx%s!\n"
842 : : "BIOS vendor: %s; Ver: %s; Product Version: %s\n",
843 : : addr, message,
844 : : dmi_get_system_info(DMI_BIOS_VENDOR),
845 : : dmi_get_system_info(DMI_BIOS_VERSION),
846 : : dmi_get_system_info(DMI_PRODUCT_VERSION));
847 : 0 : add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
848 : 0 : }
849 : :
850 : : static int __ref
851 : 0 : dmar_validate_one_drhd(struct acpi_dmar_header *entry, void *arg)
852 : : {
853 : 0 : struct acpi_dmar_hardware_unit *drhd;
854 : 0 : void __iomem *addr;
855 : 0 : u64 cap, ecap;
856 : :
857 : 0 : drhd = (void *)entry;
858 [ # # ]: 0 : if (!drhd->address) {
859 : 0 : warn_invalid_dmar(0, "");
860 : 0 : return -EINVAL;
861 : : }
862 : :
863 [ # # ]: 0 : if (arg)
864 : 0 : addr = ioremap(drhd->address, VTD_PAGE_SIZE);
865 : : else
866 : 0 : addr = early_ioremap(drhd->address, VTD_PAGE_SIZE);
867 [ # # ]: 0 : if (!addr) {
868 : 0 : pr_warn("Can't validate DRHD address: %llx\n", drhd->address);
869 : 0 : return -EINVAL;
870 : : }
871 : :
872 : 0 : cap = dmar_readq(addr + DMAR_CAP_REG);
873 : 0 : ecap = dmar_readq(addr + DMAR_ECAP_REG);
874 : :
875 [ # # ]: 0 : if (arg)
876 : 0 : iounmap(addr);
877 : : else
878 : 0 : early_iounmap(addr, VTD_PAGE_SIZE);
879 : :
880 [ # # ]: 0 : if (cap == (uint64_t)-1 && ecap == (uint64_t)-1) {
881 : 0 : warn_invalid_dmar(drhd->address, " returns all ones");
882 : 0 : return -EINVAL;
883 : : }
884 : :
885 : : return 0;
886 : : }
887 : :
888 : 30 : int __init detect_intel_iommu(void)
889 : : {
890 : 30 : int ret;
891 : 30 : struct dmar_res_callback validate_drhd_cb = {
892 : : .cb[ACPI_DMAR_TYPE_HARDWARE_UNIT] = &dmar_validate_one_drhd,
893 : : .ignore_unhandled = true,
894 : : };
895 : :
896 : 30 : down_write(&dmar_global_lock);
897 : 30 : ret = dmar_table_detect();
898 [ - + ]: 30 : if (!ret)
899 : 0 : ret = dmar_walk_dmar_table((struct acpi_table_dmar *)dmar_tbl,
900 : : &validate_drhd_cb);
901 [ - + - - : 30 : if (!ret && !no_iommu && !iommu_detected && !dmar_disabled) {
- - - - ]
902 : 0 : iommu_detected = 1;
903 : : /* Make sure ACS will be enabled */
904 : 0 : pci_request_acs();
905 : : }
906 : :
907 : : #ifdef CONFIG_X86
908 [ - + ]: 30 : if (!ret) {
909 : 0 : x86_init.iommu.iommu_init = intel_iommu_init;
910 : 0 : x86_platform.iommu_shutdown = intel_iommu_shutdown;
911 : : }
912 : :
913 : : #endif
914 : :
915 [ - + ]: 30 : if (dmar_tbl) {
916 : 0 : acpi_put_table(dmar_tbl);
917 : 0 : dmar_tbl = NULL;
918 : : }
919 : 30 : up_write(&dmar_global_lock);
920 : :
921 [ - + ]: 30 : return ret ? ret : 1;
922 : : }
923 : :
924 : 0 : static void unmap_iommu(struct intel_iommu *iommu)
925 : : {
926 : 0 : iounmap(iommu->reg);
927 : 0 : release_mem_region(iommu->reg_phys, iommu->reg_size);
928 : 0 : }
929 : :
930 : : /**
931 : : * map_iommu: map the iommu's registers
932 : : * @iommu: the iommu to map
933 : : * @phys_addr: the physical address of the base resgister
934 : : *
935 : : * Memory map the iommu's registers. Start w/ a single page, and
936 : : * possibly expand if that turns out to be insufficent.
937 : : */
938 : 0 : static int map_iommu(struct intel_iommu *iommu, u64 phys_addr)
939 : : {
940 : 0 : int map_size, err=0;
941 : :
942 : 0 : iommu->reg_phys = phys_addr;
943 : 0 : iommu->reg_size = VTD_PAGE_SIZE;
944 : :
945 [ # # ]: 0 : if (!request_mem_region(iommu->reg_phys, iommu->reg_size, iommu->name)) {
946 : 0 : pr_err("Can't reserve memory\n");
947 : 0 : err = -EBUSY;
948 : 0 : goto out;
949 : : }
950 : :
951 : 0 : iommu->reg = ioremap(iommu->reg_phys, iommu->reg_size);
952 [ # # ]: 0 : if (!iommu->reg) {
953 : 0 : pr_err("Can't map the region\n");
954 : 0 : err = -ENOMEM;
955 : 0 : goto release;
956 : : }
957 : :
958 : 0 : iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
959 : 0 : iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
960 : :
961 [ # # # # ]: 0 : if (iommu->cap == (uint64_t)-1 && iommu->ecap == (uint64_t)-1) {
962 : 0 : err = -EINVAL;
963 : 0 : warn_invalid_dmar(phys_addr, " returns all ones");
964 : 0 : goto unmap;
965 : : }
966 : :
967 : : /* the registers might be more than one page */
968 : 0 : map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
969 : : cap_max_fault_reg_offset(iommu->cap));
970 : 0 : map_size = VTD_PAGE_ALIGN(map_size);
971 [ # # ]: 0 : if (map_size > iommu->reg_size) {
972 : 0 : iounmap(iommu->reg);
973 : 0 : release_mem_region(iommu->reg_phys, iommu->reg_size);
974 : 0 : iommu->reg_size = map_size;
975 [ # # ]: 0 : if (!request_mem_region(iommu->reg_phys, iommu->reg_size,
976 : : iommu->name)) {
977 : 0 : pr_err("Can't reserve memory\n");
978 : 0 : err = -EBUSY;
979 : 0 : goto out;
980 : : }
981 : 0 : iommu->reg = ioremap(iommu->reg_phys, iommu->reg_size);
982 [ # # ]: 0 : if (!iommu->reg) {
983 : 0 : pr_err("Can't map the region\n");
984 : 0 : err = -ENOMEM;
985 : 0 : goto release;
986 : : }
987 : : }
988 : 0 : err = 0;
989 : 0 : goto out;
990 : :
991 : : unmap:
992 : 0 : iounmap(iommu->reg);
993 : 0 : release:
994 : 0 : release_mem_region(iommu->reg_phys, iommu->reg_size);
995 : 0 : out:
996 : 0 : return err;
997 : : }
998 : :
999 : 0 : static int dmar_alloc_seq_id(struct intel_iommu *iommu)
1000 : : {
1001 : 0 : iommu->seq_id = find_first_zero_bit(dmar_seq_ids,
1002 : : DMAR_UNITS_SUPPORTED);
1003 [ # # ]: 0 : if (iommu->seq_id >= DMAR_UNITS_SUPPORTED) {
1004 : 0 : iommu->seq_id = -1;
1005 : : } else {
1006 : 0 : set_bit(iommu->seq_id, dmar_seq_ids);
1007 : 0 : sprintf(iommu->name, "dmar%d", iommu->seq_id);
1008 : : }
1009 : :
1010 : 0 : return iommu->seq_id;
1011 : : }
1012 : :
1013 : 0 : static void dmar_free_seq_id(struct intel_iommu *iommu)
1014 : : {
1015 : 0 : if (iommu->seq_id >= 0) {
1016 : 0 : clear_bit(iommu->seq_id, dmar_seq_ids);
1017 : 0 : iommu->seq_id = -1;
1018 : : }
1019 : : }
1020 : :
1021 : 0 : static int alloc_iommu(struct dmar_drhd_unit *drhd)
1022 : : {
1023 : 0 : struct intel_iommu *iommu;
1024 : 0 : u32 ver, sts;
1025 : 0 : int agaw = 0;
1026 : 0 : int msagaw = 0;
1027 : 0 : int err;
1028 : :
1029 [ # # ]: 0 : if (!drhd->reg_base_addr) {
1030 : 0 : warn_invalid_dmar(0, "");
1031 : 0 : return -EINVAL;
1032 : : }
1033 : :
1034 : 0 : iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
1035 [ # # ]: 0 : if (!iommu)
1036 : : return -ENOMEM;
1037 : :
1038 [ # # ]: 0 : if (dmar_alloc_seq_id(iommu) < 0) {
1039 : 0 : pr_err("Failed to allocate seq_id\n");
1040 : 0 : err = -ENOSPC;
1041 : 0 : goto error;
1042 : : }
1043 : :
1044 : 0 : err = map_iommu(iommu, drhd->reg_base_addr);
1045 [ # # ]: 0 : if (err) {
1046 : 0 : pr_err("Failed to map %s\n", iommu->name);
1047 : 0 : goto error_free_seq_id;
1048 : : }
1049 : :
1050 : 0 : err = -EINVAL;
1051 : 0 : agaw = iommu_calculate_agaw(iommu);
1052 [ # # ]: 0 : if (agaw < 0) {
1053 : 0 : pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
1054 : : iommu->seq_id);
1055 : 0 : goto err_unmap;
1056 : : }
1057 : 0 : msagaw = iommu_calculate_max_sagaw(iommu);
1058 [ # # ]: 0 : if (msagaw < 0) {
1059 : 0 : pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
1060 : : iommu->seq_id);
1061 : 0 : goto err_unmap;
1062 : : }
1063 : 0 : iommu->agaw = agaw;
1064 : 0 : iommu->msagaw = msagaw;
1065 : 0 : iommu->segment = drhd->segment;
1066 : :
1067 : 0 : iommu->node = NUMA_NO_NODE;
1068 : :
1069 : 0 : ver = readl(iommu->reg + DMAR_VER_REG);
1070 : 0 : pr_info("%s: reg_base_addr %llx ver %d:%d cap %llx ecap %llx\n",
1071 : : iommu->name,
1072 : : (unsigned long long)drhd->reg_base_addr,
1073 : : DMAR_VER_MAJOR(ver), DMAR_VER_MINOR(ver),
1074 : : (unsigned long long)iommu->cap,
1075 : : (unsigned long long)iommu->ecap);
1076 : :
1077 : : /* Reflect status in gcmd */
1078 : 0 : sts = readl(iommu->reg + DMAR_GSTS_REG);
1079 [ # # ]: 0 : if (sts & DMA_GSTS_IRES)
1080 : 0 : iommu->gcmd |= DMA_GCMD_IRE;
1081 [ # # ]: 0 : if (sts & DMA_GSTS_TES)
1082 : 0 : iommu->gcmd |= DMA_GCMD_TE;
1083 [ # # ]: 0 : if (sts & DMA_GSTS_QIES)
1084 : 0 : iommu->gcmd |= DMA_GCMD_QIE;
1085 : :
1086 : 0 : raw_spin_lock_init(&iommu->register_lock);
1087 : :
1088 [ # # ]: 0 : if (intel_iommu_enabled) {
1089 : 0 : err = iommu_device_sysfs_add(&iommu->iommu, NULL,
1090 : : intel_iommu_groups,
1091 : : "%s", iommu->name);
1092 [ # # ]: 0 : if (err)
1093 : 0 : goto err_unmap;
1094 : :
1095 : 0 : iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
1096 : :
1097 : 0 : err = iommu_device_register(&iommu->iommu);
1098 [ # # ]: 0 : if (err)
1099 : 0 : goto err_unmap;
1100 : : }
1101 : :
1102 : 0 : drhd->iommu = iommu;
1103 : :
1104 : 0 : return 0;
1105 : :
1106 : 0 : err_unmap:
1107 : 0 : unmap_iommu(iommu);
1108 : 0 : error_free_seq_id:
1109 [ # # ]: 0 : dmar_free_seq_id(iommu);
1110 : 0 : error:
1111 : 0 : kfree(iommu);
1112 : 0 : return err;
1113 : : }
1114 : :
1115 : 0 : static void free_iommu(struct intel_iommu *iommu)
1116 : : {
1117 [ # # ]: 0 : if (intel_iommu_enabled) {
1118 : 0 : iommu_device_unregister(&iommu->iommu);
1119 : 0 : iommu_device_sysfs_remove(&iommu->iommu);
1120 : : }
1121 : :
1122 [ # # ]: 0 : if (iommu->irq) {
1123 [ # # ]: 0 : if (iommu->pr_irq) {
1124 : 0 : free_irq(iommu->pr_irq, iommu);
1125 : 0 : dmar_free_hwirq(iommu->pr_irq);
1126 : 0 : iommu->pr_irq = 0;
1127 : : }
1128 : 0 : free_irq(iommu->irq, iommu);
1129 : 0 : dmar_free_hwirq(iommu->irq);
1130 : 0 : iommu->irq = 0;
1131 : : }
1132 : :
1133 [ # # ]: 0 : if (iommu->qi) {
1134 : 0 : free_page((unsigned long)iommu->qi->desc);
1135 : 0 : kfree(iommu->qi->desc_status);
1136 : 0 : kfree(iommu->qi);
1137 : : }
1138 : :
1139 [ # # ]: 0 : if (iommu->reg)
1140 : 0 : unmap_iommu(iommu);
1141 : :
1142 [ # # ]: 0 : dmar_free_seq_id(iommu);
1143 : 0 : kfree(iommu);
1144 : 0 : }
1145 : :
1146 : : /*
1147 : : * Reclaim all the submitted descriptors which have completed its work.
1148 : : */
1149 : 0 : static inline void reclaim_free_desc(struct q_inval *qi)
1150 : : {
1151 [ # # ]: 0 : while (qi->desc_status[qi->free_tail] == QI_DONE ||
1152 : : qi->desc_status[qi->free_tail] == QI_ABORT) {
1153 : 0 : qi->desc_status[qi->free_tail] = QI_FREE;
1154 : 0 : qi->free_tail = (qi->free_tail + 1) % QI_LENGTH;
1155 : 0 : qi->free_cnt++;
1156 : : }
1157 : : }
1158 : :
1159 : 0 : static int qi_check_fault(struct intel_iommu *iommu, int index)
1160 : : {
1161 : 0 : u32 fault;
1162 : 0 : int head, tail;
1163 : 0 : struct q_inval *qi = iommu->qi;
1164 : 0 : int wait_index = (index + 1) % QI_LENGTH;
1165 [ # # ]: 0 : int shift = qi_shift(iommu);
1166 : :
1167 [ # # ]: 0 : if (qi->desc_status[wait_index] == QI_ABORT)
1168 : : return -EAGAIN;
1169 : :
1170 : 0 : fault = readl(iommu->reg + DMAR_FSTS_REG);
1171 : :
1172 : : /*
1173 : : * If IQE happens, the head points to the descriptor associated
1174 : : * with the error. No new descriptors are fetched until the IQE
1175 : : * is cleared.
1176 : : */
1177 [ # # ]: 0 : if (fault & DMA_FSTS_IQE) {
1178 : 0 : head = readl(iommu->reg + DMAR_IQH_REG);
1179 [ # # ]: 0 : if ((head >> shift) == index) {
1180 : 0 : struct qi_desc *desc = qi->desc + head;
1181 : :
1182 : : /*
1183 : : * desc->qw2 and desc->qw3 are either reserved or
1184 : : * used by software as private data. We won't print
1185 : : * out these two qw's for security consideration.
1186 : : */
1187 : 0 : pr_err("VT-d detected invalid descriptor: qw0 = %llx, qw1 = %llx\n",
1188 : : (unsigned long long)desc->qw0,
1189 : : (unsigned long long)desc->qw1);
1190 : 0 : memcpy(desc, qi->desc + (wait_index << shift),
1191 : 0 : 1 << shift);
1192 : 0 : writel(DMA_FSTS_IQE, iommu->reg + DMAR_FSTS_REG);
1193 : 0 : return -EINVAL;
1194 : : }
1195 : : }
1196 : :
1197 : : /*
1198 : : * If ITE happens, all pending wait_desc commands are aborted.
1199 : : * No new descriptors are fetched until the ITE is cleared.
1200 : : */
1201 [ # # ]: 0 : if (fault & DMA_FSTS_ITE) {
1202 : 0 : head = readl(iommu->reg + DMAR_IQH_REG);
1203 : 0 : head = ((head >> shift) - 1 + QI_LENGTH) % QI_LENGTH;
1204 : 0 : head |= 1;
1205 : 0 : tail = readl(iommu->reg + DMAR_IQT_REG);
1206 : 0 : tail = ((tail >> shift) - 1 + QI_LENGTH) % QI_LENGTH;
1207 : :
1208 : 0 : writel(DMA_FSTS_ITE, iommu->reg + DMAR_FSTS_REG);
1209 : :
1210 : 0 : do {
1211 [ # # ]: 0 : if (qi->desc_status[head] == QI_IN_USE)
1212 : 0 : qi->desc_status[head] = QI_ABORT;
1213 : 0 : head = (head - 2 + QI_LENGTH) % QI_LENGTH;
1214 [ # # ]: 0 : } while (head != tail);
1215 : :
1216 [ # # ]: 0 : if (qi->desc_status[wait_index] == QI_ABORT)
1217 : : return -EAGAIN;
1218 : : }
1219 : :
1220 [ # # ]: 0 : if (fault & DMA_FSTS_ICE)
1221 : 0 : writel(DMA_FSTS_ICE, iommu->reg + DMAR_FSTS_REG);
1222 : :
1223 : : return 0;
1224 : : }
1225 : :
1226 : : /*
1227 : : * Submit the queued invalidation descriptor to the remapping
1228 : : * hardware unit and wait for its completion.
1229 : : */
1230 : 0 : int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
1231 : : {
1232 : 0 : int rc;
1233 : 0 : struct q_inval *qi = iommu->qi;
1234 : 0 : int offset, shift, length;
1235 : 0 : struct qi_desc wait_desc;
1236 : 0 : int wait_index, index;
1237 : 0 : unsigned long flags;
1238 : :
1239 [ # # ]: 0 : if (!qi)
1240 : : return 0;
1241 : :
1242 : 0 : restart:
1243 : 0 : rc = 0;
1244 : :
1245 : 0 : raw_spin_lock_irqsave(&qi->q_lock, flags);
1246 : 0 : while (qi->free_cnt < 3) {
1247 : 0 : raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1248 : 0 : cpu_relax();
1249 [ # # ]: 0 : raw_spin_lock_irqsave(&qi->q_lock, flags);
1250 : : }
1251 : :
1252 : 0 : index = qi->free_head;
1253 : 0 : wait_index = (index + 1) % QI_LENGTH;
1254 [ # # ]: 0 : shift = qi_shift(iommu);
1255 : 0 : length = 1 << shift;
1256 : :
1257 : 0 : qi->desc_status[index] = qi->desc_status[wait_index] = QI_IN_USE;
1258 : :
1259 : 0 : offset = index << shift;
1260 : 0 : memcpy(qi->desc + offset, desc, length);
1261 : 0 : wait_desc.qw0 = QI_IWD_STATUS_DATA(QI_DONE) |
1262 : : QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
1263 [ # # ]: 0 : wait_desc.qw1 = virt_to_phys(&qi->desc_status[wait_index]);
1264 : 0 : wait_desc.qw2 = 0;
1265 : 0 : wait_desc.qw3 = 0;
1266 : :
1267 : 0 : offset = wait_index << shift;
1268 : 0 : memcpy(qi->desc + offset, &wait_desc, length);
1269 : :
1270 : 0 : qi->free_head = (qi->free_head + 2) % QI_LENGTH;
1271 : 0 : qi->free_cnt -= 2;
1272 : :
1273 : : /*
1274 : : * update the HW tail register indicating the presence of
1275 : : * new descriptors.
1276 : : */
1277 : 0 : writel(qi->free_head << shift, iommu->reg + DMAR_IQT_REG);
1278 : :
1279 [ # # ]: 0 : while (qi->desc_status[wait_index] != QI_DONE) {
1280 : : /*
1281 : : * We will leave the interrupts disabled, to prevent interrupt
1282 : : * context to queue another cmd while a cmd is already submitted
1283 : : * and waiting for completion on this cpu. This is to avoid
1284 : : * a deadlock where the interrupt context can wait indefinitely
1285 : : * for free slots in the queue.
1286 : : */
1287 : 0 : rc = qi_check_fault(iommu, index);
1288 [ # # ]: 0 : if (rc)
1289 : : break;
1290 : :
1291 : 0 : raw_spin_unlock(&qi->q_lock);
1292 : 0 : cpu_relax();
1293 : 0 : raw_spin_lock(&qi->q_lock);
1294 : : }
1295 : :
1296 : 0 : qi->desc_status[index] = QI_DONE;
1297 : :
1298 : 0 : reclaim_free_desc(qi);
1299 : 0 : raw_spin_unlock_irqrestore(&qi->q_lock, flags);
1300 : :
1301 [ # # ]: 0 : if (rc == -EAGAIN)
1302 : 0 : goto restart;
1303 : :
1304 : : return rc;
1305 : : }
1306 : :
1307 : : /*
1308 : : * Flush the global interrupt entry cache.
1309 : : */
1310 : 0 : void qi_global_iec(struct intel_iommu *iommu)
1311 : : {
1312 : 0 : struct qi_desc desc;
1313 : :
1314 : 0 : desc.qw0 = QI_IEC_TYPE;
1315 : 0 : desc.qw1 = 0;
1316 : 0 : desc.qw2 = 0;
1317 : 0 : desc.qw3 = 0;
1318 : :
1319 : : /* should never fail */
1320 : 0 : qi_submit_sync(&desc, iommu);
1321 : 0 : }
1322 : :
1323 : 0 : void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
1324 : : u64 type)
1325 : : {
1326 : 0 : struct qi_desc desc;
1327 : :
1328 : 0 : desc.qw0 = QI_CC_FM(fm) | QI_CC_SID(sid) | QI_CC_DID(did)
1329 : 0 : | QI_CC_GRAN(type) | QI_CC_TYPE;
1330 : 0 : desc.qw1 = 0;
1331 : 0 : desc.qw2 = 0;
1332 : 0 : desc.qw3 = 0;
1333 : :
1334 : 0 : qi_submit_sync(&desc, iommu);
1335 : 0 : }
1336 : :
1337 : 0 : void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
1338 : : unsigned int size_order, u64 type)
1339 : : {
1340 : 0 : u8 dw = 0, dr = 0;
1341 : :
1342 : 0 : struct qi_desc desc;
1343 : 0 : int ih = 0;
1344 : :
1345 [ # # ]: 0 : if (cap_write_drain(iommu->cap))
1346 : 0 : dw = 1;
1347 : :
1348 [ # # ]: 0 : if (cap_read_drain(iommu->cap))
1349 : 0 : dr = 1;
1350 : :
1351 : 0 : desc.qw0 = QI_IOTLB_DID(did) | QI_IOTLB_DR(dr) | QI_IOTLB_DW(dw)
1352 : 0 : | QI_IOTLB_GRAN(type) | QI_IOTLB_TYPE;
1353 : 0 : desc.qw1 = QI_IOTLB_ADDR(addr) | QI_IOTLB_IH(ih)
1354 : 0 : | QI_IOTLB_AM(size_order);
1355 : 0 : desc.qw2 = 0;
1356 : 0 : desc.qw3 = 0;
1357 : :
1358 : 0 : qi_submit_sync(&desc, iommu);
1359 : 0 : }
1360 : :
1361 : 0 : void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid,
1362 : : u16 qdep, u64 addr, unsigned mask)
1363 : : {
1364 : 0 : struct qi_desc desc;
1365 : :
1366 [ # # ]: 0 : if (mask) {
1367 : 0 : addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1)) - 1;
1368 : 0 : desc.qw1 = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE;
1369 : : } else
1370 : 0 : desc.qw1 = QI_DEV_IOTLB_ADDR(addr);
1371 : :
1372 [ # # ]: 0 : if (qdep >= QI_DEV_IOTLB_MAX_INVS)
1373 : 0 : qdep = 0;
1374 : :
1375 : 0 : desc.qw0 = QI_DEV_IOTLB_SID(sid) | QI_DEV_IOTLB_QDEP(qdep) |
1376 : 0 : QI_DIOTLB_TYPE | QI_DEV_IOTLB_PFSID(pfsid);
1377 : 0 : desc.qw2 = 0;
1378 : 0 : desc.qw3 = 0;
1379 : :
1380 : 0 : qi_submit_sync(&desc, iommu);
1381 : 0 : }
1382 : :
1383 : : /* PASID-based IOTLB invalidation */
1384 : 0 : void qi_flush_piotlb(struct intel_iommu *iommu, u16 did, u32 pasid, u64 addr,
1385 : : unsigned long npages, bool ih)
1386 : : {
1387 : 0 : struct qi_desc desc = {.qw2 = 0, .qw3 = 0};
1388 : :
1389 : : /*
1390 : : * npages == -1 means a PASID-selective invalidation, otherwise,
1391 : : * a positive value for Page-selective-within-PASID invalidation.
1392 : : * 0 is not a valid input.
1393 : : */
1394 [ # # # # ]: 0 : if (WARN_ON(!npages)) {
1395 : 0 : pr_err("Invalid input npages = %ld\n", npages);
1396 : 0 : return;
1397 : : }
1398 : :
1399 [ # # ]: 0 : if (npages == -1) {
1400 : 0 : desc.qw0 = QI_EIOTLB_PASID(pasid) |
1401 : 0 : QI_EIOTLB_DID(did) |
1402 : 0 : QI_EIOTLB_GRAN(QI_GRAN_NONG_PASID) |
1403 : : QI_EIOTLB_TYPE;
1404 : 0 : desc.qw1 = 0;
1405 : : } else {
1406 [ # # # # : 0 : int mask = ilog2(__roundup_pow_of_two(npages));
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
1407 : 0 : unsigned long align = (1ULL << (VTD_PAGE_SHIFT + mask));
1408 : :
1409 [ # # # # ]: 0 : if (WARN_ON_ONCE(!ALIGN(addr, align)))
1410 : 0 : addr &= ~(align - 1);
1411 : :
1412 : 0 : desc.qw0 = QI_EIOTLB_PASID(pasid) |
1413 : 0 : QI_EIOTLB_DID(did) |
1414 : 0 : QI_EIOTLB_GRAN(QI_GRAN_PSI_PASID) |
1415 : : QI_EIOTLB_TYPE;
1416 : 0 : desc.qw1 = QI_EIOTLB_ADDR(addr) |
1417 : 0 : QI_EIOTLB_IH(ih) |
1418 : 0 : QI_EIOTLB_AM(mask);
1419 : : }
1420 : :
1421 : 0 : qi_submit_sync(&desc, iommu);
1422 : : }
1423 : :
1424 : : /*
1425 : : * Disable Queued Invalidation interface.
1426 : : */
1427 : 0 : void dmar_disable_qi(struct intel_iommu *iommu)
1428 : : {
1429 : 0 : unsigned long flags;
1430 : 0 : u32 sts;
1431 : 0 : cycles_t start_time = get_cycles();
1432 : :
1433 [ # # ]: 0 : if (!ecap_qis(iommu->ecap))
1434 : : return;
1435 : :
1436 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flags);
1437 : :
1438 : 0 : sts = readl(iommu->reg + DMAR_GSTS_REG);
1439 [ # # ]: 0 : if (!(sts & DMA_GSTS_QIES))
1440 : 0 : goto end;
1441 : :
1442 : : /*
1443 : : * Give a chance to HW to complete the pending invalidation requests.
1444 : : */
1445 [ # # ]: 0 : while ((readl(iommu->reg + DMAR_IQT_REG) !=
1446 : 0 : readl(iommu->reg + DMAR_IQH_REG)) &&
1447 [ # # ]: 0 : (DMAR_OPERATION_TIMEOUT > (get_cycles() - start_time)))
1448 : 0 : cpu_relax();
1449 : :
1450 : 0 : iommu->gcmd &= ~DMA_GCMD_QIE;
1451 : 0 : writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
1452 : :
1453 [ # # # # ]: 0 : IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl,
1454 : : !(sts & DMA_GSTS_QIES), sts);
1455 : 0 : end:
1456 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
1457 : : }
1458 : :
1459 : : /*
1460 : : * Enable queued invalidation.
1461 : : */
1462 : 0 : static void __dmar_enable_qi(struct intel_iommu *iommu)
1463 : : {
1464 : 0 : u32 sts;
1465 : 0 : unsigned long flags;
1466 : 0 : struct q_inval *qi = iommu->qi;
1467 [ # # ]: 0 : u64 val = virt_to_phys(qi->desc);
1468 : :
1469 : 0 : qi->free_head = qi->free_tail = 0;
1470 : 0 : qi->free_cnt = QI_LENGTH;
1471 : :
1472 : : /*
1473 : : * Set DW=1 and QS=1 in IQA_REG when Scalable Mode capability
1474 : : * is present.
1475 : : */
1476 [ # # ]: 0 : if (ecap_smts(iommu->ecap))
1477 : 0 : val |= (1 << 11) | 1;
1478 : :
1479 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flags);
1480 : :
1481 : : /* write zero to the tail reg */
1482 : 0 : writel(0, iommu->reg + DMAR_IQT_REG);
1483 : :
1484 : 0 : dmar_writeq(iommu->reg + DMAR_IQA_REG, val);
1485 : :
1486 : 0 : iommu->gcmd |= DMA_GCMD_QIE;
1487 : 0 : writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG);
1488 : :
1489 : : /* Make sure hardware complete it */
1490 [ # # # # ]: 0 : IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts);
1491 : :
1492 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flags);
1493 : 0 : }
1494 : :
1495 : : /*
1496 : : * Enable Queued Invalidation interface. This is a must to support
1497 : : * interrupt-remapping. Also used by DMA-remapping, which replaces
1498 : : * register based IOTLB invalidation.
1499 : : */
1500 : 0 : int dmar_enable_qi(struct intel_iommu *iommu)
1501 : : {
1502 : 0 : struct q_inval *qi;
1503 : 0 : struct page *desc_page;
1504 : :
1505 [ # # ]: 0 : if (!ecap_qis(iommu->ecap))
1506 : : return -ENOENT;
1507 : :
1508 : : /*
1509 : : * queued invalidation is already setup and enabled.
1510 : : */
1511 [ # # ]: 0 : if (iommu->qi)
1512 : : return 0;
1513 : :
1514 : 0 : iommu->qi = kmalloc(sizeof(*qi), GFP_ATOMIC);
1515 [ # # ]: 0 : if (!iommu->qi)
1516 : : return -ENOMEM;
1517 : :
1518 : 0 : qi = iommu->qi;
1519 : :
1520 : : /*
1521 : : * Need two pages to accommodate 256 descriptors of 256 bits each
1522 : : * if the remapping hardware supports scalable mode translation.
1523 : : */
1524 : 0 : desc_page = alloc_pages_node(iommu->node, GFP_ATOMIC | __GFP_ZERO,
1525 [ # # ]: 0 : !!ecap_smts(iommu->ecap));
1526 [ # # ]: 0 : if (!desc_page) {
1527 : 0 : kfree(qi);
1528 : 0 : iommu->qi = NULL;
1529 : 0 : return -ENOMEM;
1530 : : }
1531 : :
1532 : 0 : qi->desc = page_address(desc_page);
1533 : :
1534 : 0 : qi->desc_status = kcalloc(QI_LENGTH, sizeof(int), GFP_ATOMIC);
1535 [ # # ]: 0 : if (!qi->desc_status) {
1536 : 0 : free_page((unsigned long) qi->desc);
1537 : 0 : kfree(qi);
1538 : 0 : iommu->qi = NULL;
1539 : 0 : return -ENOMEM;
1540 : : }
1541 : :
1542 : 0 : raw_spin_lock_init(&qi->q_lock);
1543 : :
1544 : 0 : __dmar_enable_qi(iommu);
1545 : :
1546 : 0 : return 0;
1547 : : }
1548 : :
1549 : : /* iommu interrupt handling. Most stuff are MSI-like. */
1550 : :
1551 : : enum faulttype {
1552 : : DMA_REMAP,
1553 : : INTR_REMAP,
1554 : : UNKNOWN,
1555 : : };
1556 : :
1557 : : static const char *dma_remap_fault_reasons[] =
1558 : : {
1559 : : "Software",
1560 : : "Present bit in root entry is clear",
1561 : : "Present bit in context entry is clear",
1562 : : "Invalid context entry",
1563 : : "Access beyond MGAW",
1564 : : "PTE Write access is not set",
1565 : : "PTE Read access is not set",
1566 : : "Next page table ptr is invalid",
1567 : : "Root table address invalid",
1568 : : "Context table ptr is invalid",
1569 : : "non-zero reserved fields in RTP",
1570 : : "non-zero reserved fields in CTP",
1571 : : "non-zero reserved fields in PTE",
1572 : : "PCE for translation request specifies blocking",
1573 : : };
1574 : :
1575 : : static const char * const dma_remap_sm_fault_reasons[] = {
1576 : : "SM: Invalid Root Table Address",
1577 : : "SM: TTM 0 for request with PASID",
1578 : : "SM: TTM 0 for page group request",
1579 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x33-0x37 */
1580 : : "SM: Error attempting to access Root Entry",
1581 : : "SM: Present bit in Root Entry is clear",
1582 : : "SM: Non-zero reserved field set in Root Entry",
1583 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x3B-0x3F */
1584 : : "SM: Error attempting to access Context Entry",
1585 : : "SM: Present bit in Context Entry is clear",
1586 : : "SM: Non-zero reserved field set in the Context Entry",
1587 : : "SM: Invalid Context Entry",
1588 : : "SM: DTE field in Context Entry is clear",
1589 : : "SM: PASID Enable field in Context Entry is clear",
1590 : : "SM: PASID is larger than the max in Context Entry",
1591 : : "SM: PRE field in Context-Entry is clear",
1592 : : "SM: RID_PASID field error in Context-Entry",
1593 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x49-0x4F */
1594 : : "SM: Error attempting to access the PASID Directory Entry",
1595 : : "SM: Present bit in Directory Entry is clear",
1596 : : "SM: Non-zero reserved field set in PASID Directory Entry",
1597 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x53-0x57 */
1598 : : "SM: Error attempting to access PASID Table Entry",
1599 : : "SM: Present bit in PASID Table Entry is clear",
1600 : : "SM: Non-zero reserved field set in PASID Table Entry",
1601 : : "SM: Invalid Scalable-Mode PASID Table Entry",
1602 : : "SM: ERE field is clear in PASID Table Entry",
1603 : : "SM: SRE field is clear in PASID Table Entry",
1604 : : "Unknown", "Unknown",/* 0x5E-0x5F */
1605 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x60-0x67 */
1606 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x68-0x6F */
1607 : : "SM: Error attempting to access first-level paging entry",
1608 : : "SM: Present bit in first-level paging entry is clear",
1609 : : "SM: Non-zero reserved field set in first-level paging entry",
1610 : : "SM: Error attempting to access FL-PML4 entry",
1611 : : "SM: First-level entry address beyond MGAW in Nested translation",
1612 : : "SM: Read permission error in FL-PML4 entry in Nested translation",
1613 : : "SM: Read permission error in first-level paging entry in Nested translation",
1614 : : "SM: Write permission error in first-level paging entry in Nested translation",
1615 : : "SM: Error attempting to access second-level paging entry",
1616 : : "SM: Read/Write permission error in second-level paging entry",
1617 : : "SM: Non-zero reserved field set in second-level paging entry",
1618 : : "SM: Invalid second-level page table pointer",
1619 : : "SM: A/D bit update needed in second-level entry when set up in no snoop",
1620 : : "Unknown", "Unknown", "Unknown", /* 0x7D-0x7F */
1621 : : "SM: Address in first-level translation is not canonical",
1622 : : "SM: U/S set 0 for first-level translation with user privilege",
1623 : : "SM: No execute permission for request with PASID and ER=1",
1624 : : "SM: Address beyond the DMA hardware max",
1625 : : "SM: Second-level entry address beyond the max",
1626 : : "SM: No write permission for Write/AtomicOp request",
1627 : : "SM: No read permission for Read/AtomicOp request",
1628 : : "SM: Invalid address-interrupt address",
1629 : : "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", /* 0x88-0x8F */
1630 : : "SM: A/D bit update needed in first-level entry when set up in no snoop",
1631 : : };
1632 : :
1633 : : static const char *irq_remap_fault_reasons[] =
1634 : : {
1635 : : "Detected reserved fields in the decoded interrupt-remapped request",
1636 : : "Interrupt index exceeded the interrupt-remapping table size",
1637 : : "Present field in the IRTE entry is clear",
1638 : : "Error accessing interrupt-remapping table pointed by IRTA_REG",
1639 : : "Detected reserved fields in the IRTE entry",
1640 : : "Blocked a compatibility format interrupt request",
1641 : : "Blocked an interrupt request due to source-id verification failure",
1642 : : };
1643 : :
1644 : 0 : static const char *dmar_get_fault_reason(u8 fault_reason, int *fault_type)
1645 : : {
1646 [ # # ]: 0 : if (fault_reason >= 0x20 && (fault_reason - 0x20 <
1647 : : ARRAY_SIZE(irq_remap_fault_reasons))) {
1648 : 0 : *fault_type = INTR_REMAP;
1649 : 0 : return irq_remap_fault_reasons[fault_reason - 0x20];
1650 [ # # # # ]: 0 : } else if (fault_reason >= 0x30 && (fault_reason - 0x30 <
1651 : : ARRAY_SIZE(dma_remap_sm_fault_reasons))) {
1652 : 0 : *fault_type = DMA_REMAP;
1653 : 0 : return dma_remap_sm_fault_reasons[fault_reason - 0x30];
1654 [ # # ]: 0 : } else if (fault_reason < ARRAY_SIZE(dma_remap_fault_reasons)) {
1655 : 0 : *fault_type = DMA_REMAP;
1656 : 0 : return dma_remap_fault_reasons[fault_reason];
1657 : : } else {
1658 : : *fault_type = UNKNOWN;
1659 : : return "Unknown";
1660 : : }
1661 : : }
1662 : :
1663 : :
1664 : 0 : static inline int dmar_msi_reg(struct intel_iommu *iommu, int irq)
1665 : : {
1666 : 0 : if (iommu->irq == irq)
1667 : : return DMAR_FECTL_REG;
1668 [ # # # # : 0 : else if (iommu->pr_irq == irq)
# # # # ]
1669 : : return DMAR_PECTL_REG;
1670 : : else
1671 : 0 : BUG();
1672 : : }
1673 : :
1674 : 0 : void dmar_msi_unmask(struct irq_data *data)
1675 : : {
1676 [ # # ]: 0 : struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
1677 [ # # ]: 0 : int reg = dmar_msi_reg(iommu, data->irq);
1678 : 0 : unsigned long flag;
1679 : :
1680 : : /* unmask it */
1681 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1682 : 0 : writel(0, iommu->reg + reg);
1683 : : /* Read a reg to force flush the post write */
1684 : 0 : readl(iommu->reg + reg);
1685 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1686 : 0 : }
1687 : :
1688 : 0 : void dmar_msi_mask(struct irq_data *data)
1689 : : {
1690 [ # # ]: 0 : struct intel_iommu *iommu = irq_data_get_irq_handler_data(data);
1691 [ # # ]: 0 : int reg = dmar_msi_reg(iommu, data->irq);
1692 : 0 : unsigned long flag;
1693 : :
1694 : : /* mask it */
1695 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1696 : 0 : writel(DMA_FECTL_IM, iommu->reg + reg);
1697 : : /* Read a reg to force flush the post write */
1698 : 0 : readl(iommu->reg + reg);
1699 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1700 : 0 : }
1701 : :
1702 : 0 : void dmar_msi_write(int irq, struct msi_msg *msg)
1703 : : {
1704 : 0 : struct intel_iommu *iommu = irq_get_handler_data(irq);
1705 [ # # ]: 0 : int reg = dmar_msi_reg(iommu, irq);
1706 : 0 : unsigned long flag;
1707 : :
1708 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1709 : 0 : writel(msg->data, iommu->reg + reg + 4);
1710 : 0 : writel(msg->address_lo, iommu->reg + reg + 8);
1711 : 0 : writel(msg->address_hi, iommu->reg + reg + 12);
1712 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1713 : 0 : }
1714 : :
1715 : 0 : void dmar_msi_read(int irq, struct msi_msg *msg)
1716 : : {
1717 : 0 : struct intel_iommu *iommu = irq_get_handler_data(irq);
1718 [ # # ]: 0 : int reg = dmar_msi_reg(iommu, irq);
1719 : 0 : unsigned long flag;
1720 : :
1721 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1722 : 0 : msg->data = readl(iommu->reg + reg + 4);
1723 : 0 : msg->address_lo = readl(iommu->reg + reg + 8);
1724 : 0 : msg->address_hi = readl(iommu->reg + reg + 12);
1725 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1726 : 0 : }
1727 : :
1728 : 0 : static int dmar_fault_do_one(struct intel_iommu *iommu, int type,
1729 : : u8 fault_reason, int pasid, u16 source_id,
1730 : : unsigned long long addr)
1731 : : {
1732 : 0 : const char *reason;
1733 : 0 : int fault_type;
1734 : :
1735 [ # # ]: 0 : reason = dmar_get_fault_reason(fault_reason, &fault_type);
1736 : :
1737 : 0 : if (fault_type == INTR_REMAP)
1738 : 0 : pr_err("[INTR-REMAP] Request device [%02x:%02x.%d] fault index %llx [fault reason %02d] %s\n",
1739 : : source_id >> 8, PCI_SLOT(source_id & 0xFF),
1740 : : PCI_FUNC(source_id & 0xFF), addr >> 48,
1741 : : fault_reason, reason);
1742 : : else
1743 [ # # ]: 0 : pr_err("[%s] Request device [%02x:%02x.%d] PASID %x fault addr %llx [fault reason %02d] %s\n",
1744 : : type ? "DMA Read" : "DMA Write",
1745 : : source_id >> 8, PCI_SLOT(source_id & 0xFF),
1746 : : PCI_FUNC(source_id & 0xFF), pasid, addr,
1747 : : fault_reason, reason);
1748 : 0 : return 0;
1749 : : }
1750 : :
1751 : : #define PRIMARY_FAULT_REG_LEN (16)
1752 : 0 : irqreturn_t dmar_fault(int irq, void *dev_id)
1753 : : {
1754 : 0 : struct intel_iommu *iommu = dev_id;
1755 : 0 : int reg, fault_index;
1756 : 0 : u32 fault_status;
1757 : 0 : unsigned long flag;
1758 : 0 : static DEFINE_RATELIMIT_STATE(rs,
1759 : : DEFAULT_RATELIMIT_INTERVAL,
1760 : : DEFAULT_RATELIMIT_BURST);
1761 : :
1762 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1763 : 0 : fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1764 [ # # # # ]: 0 : if (fault_status && __ratelimit(&rs))
1765 : 0 : pr_err("DRHD: handling fault status reg %x\n", fault_status);
1766 : :
1767 : : /* TBD: ignore advanced fault log currently */
1768 [ # # ]: 0 : if (!(fault_status & DMA_FSTS_PPF))
1769 : 0 : goto unlock_exit;
1770 : :
1771 : 0 : fault_index = dma_fsts_fault_record_index(fault_status);
1772 : 0 : reg = cap_fault_reg_offset(iommu->cap);
1773 : 0 : while (1) {
1774 : : /* Disable printing, simply clear the fault when ratelimited */
1775 : 0 : bool ratelimited = !__ratelimit(&rs);
1776 : 0 : u8 fault_reason;
1777 : 0 : u16 source_id;
1778 : 0 : u64 guest_addr;
1779 : 0 : int type, pasid;
1780 : 0 : u32 data;
1781 : 0 : bool pasid_present;
1782 : :
1783 : : /* highest 32 bits */
1784 : 0 : data = readl(iommu->reg + reg +
1785 : 0 : fault_index * PRIMARY_FAULT_REG_LEN + 12);
1786 [ # # ]: 0 : if (!(data & DMA_FRCD_F))
1787 : : break;
1788 : :
1789 [ # # ]: 0 : if (!ratelimited) {
1790 : 0 : fault_reason = dma_frcd_fault_reason(data);
1791 : 0 : type = dma_frcd_type(data);
1792 : :
1793 : 0 : pasid = dma_frcd_pasid_value(data);
1794 : 0 : data = readl(iommu->reg + reg +
1795 : 0 : fault_index * PRIMARY_FAULT_REG_LEN + 8);
1796 : 0 : source_id = dma_frcd_source_id(data);
1797 : :
1798 : 0 : pasid_present = dma_frcd_pasid_present(data);
1799 : 0 : guest_addr = dmar_readq(iommu->reg + reg +
1800 : : fault_index * PRIMARY_FAULT_REG_LEN);
1801 : 0 : guest_addr = dma_frcd_page_addr(guest_addr);
1802 : : }
1803 : :
1804 : : /* clear the fault */
1805 : 0 : writel(DMA_FRCD_F, iommu->reg + reg +
1806 : 0 : fault_index * PRIMARY_FAULT_REG_LEN + 12);
1807 : :
1808 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1809 : :
1810 [ # # ]: 0 : if (!ratelimited)
1811 : : /* Using pasid -1 if pasid is not present */
1812 [ # # ]: 0 : dmar_fault_do_one(iommu, type, fault_reason,
1813 : : pasid_present ? pasid : -1,
1814 : : source_id, guest_addr);
1815 : :
1816 : 0 : fault_index++;
1817 [ # # ]: 0 : if (fault_index >= cap_num_fault_regs(iommu->cap))
1818 : 0 : fault_index = 0;
1819 : 0 : raw_spin_lock_irqsave(&iommu->register_lock, flag);
1820 : : }
1821 : :
1822 : 0 : writel(DMA_FSTS_PFO | DMA_FSTS_PPF | DMA_FSTS_PRO,
1823 : 0 : iommu->reg + DMAR_FSTS_REG);
1824 : :
1825 : 0 : unlock_exit:
1826 : 0 : raw_spin_unlock_irqrestore(&iommu->register_lock, flag);
1827 : 0 : return IRQ_HANDLED;
1828 : : }
1829 : :
1830 : 0 : int dmar_set_interrupt(struct intel_iommu *iommu)
1831 : : {
1832 : 0 : int irq, ret;
1833 : :
1834 : : /*
1835 : : * Check if the fault interrupt is already initialized.
1836 : : */
1837 [ # # ]: 0 : if (iommu->irq)
1838 : : return 0;
1839 : :
1840 : 0 : irq = dmar_alloc_hwirq(iommu->seq_id, iommu->node, iommu);
1841 [ # # ]: 0 : if (irq > 0) {
1842 : 0 : iommu->irq = irq;
1843 : : } else {
1844 : 0 : pr_err("No free IRQ vectors\n");
1845 : 0 : return -EINVAL;
1846 : : }
1847 : :
1848 : 0 : ret = request_irq(irq, dmar_fault, IRQF_NO_THREAD, iommu->name, iommu);
1849 [ # # ]: 0 : if (ret)
1850 : 0 : pr_err("Can't request irq\n");
1851 : : return ret;
1852 : : }
1853 : :
1854 : 0 : int __init enable_drhd_fault_handling(void)
1855 : : {
1856 : 0 : struct dmar_drhd_unit *drhd;
1857 : 0 : struct intel_iommu *iommu;
1858 : :
1859 : : /*
1860 : : * Enable fault control interrupt.
1861 : : */
1862 [ # # ]: 0 : for_each_iommu(iommu, drhd) {
1863 : 0 : u32 fault_status;
1864 : 0 : int ret = dmar_set_interrupt(iommu);
1865 : :
1866 [ # # ]: 0 : if (ret) {
1867 : 0 : pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n",
1868 : : (unsigned long long)drhd->reg_base_addr, ret);
1869 : 0 : return -1;
1870 : : }
1871 : :
1872 : : /*
1873 : : * Clear any previous faults.
1874 : : */
1875 : 0 : dmar_fault(iommu->irq, iommu);
1876 : 0 : fault_status = readl(iommu->reg + DMAR_FSTS_REG);
1877 : 0 : writel(fault_status, iommu->reg + DMAR_FSTS_REG);
1878 : : }
1879 : :
1880 : : return 0;
1881 : : }
1882 : :
1883 : : /*
1884 : : * Re-enable Queued Invalidation interface.
1885 : : */
1886 : 0 : int dmar_reenable_qi(struct intel_iommu *iommu)
1887 : : {
1888 [ # # ]: 0 : if (!ecap_qis(iommu->ecap))
1889 : : return -ENOENT;
1890 : :
1891 [ # # ]: 0 : if (!iommu->qi)
1892 : : return -ENOENT;
1893 : :
1894 : : /*
1895 : : * First disable queued invalidation.
1896 : : */
1897 : 0 : dmar_disable_qi(iommu);
1898 : : /*
1899 : : * Then enable queued invalidation again. Since there is no pending
1900 : : * invalidation requests now, it's safe to re-enable queued
1901 : : * invalidation.
1902 : : */
1903 : 0 : __dmar_enable_qi(iommu);
1904 : :
1905 : 0 : return 0;
1906 : : }
1907 : :
1908 : : /*
1909 : : * Check interrupt remapping support in DMAR table description.
1910 : : */
1911 : 0 : int __init dmar_ir_support(void)
1912 : : {
1913 : 0 : struct acpi_table_dmar *dmar;
1914 : 0 : dmar = (struct acpi_table_dmar *)dmar_tbl;
1915 [ # # ]: 0 : if (!dmar)
1916 : : return 0;
1917 : 0 : return dmar->flags & 0x1;
1918 : : }
1919 : :
1920 : : /* Check whether DMAR units are in use */
1921 : 30 : static inline bool dmar_in_use(void)
1922 : : {
1923 : 30 : return irq_remapping_enabled || intel_iommu_enabled;
1924 : : }
1925 : :
1926 : 30 : static int __init dmar_free_unused_resources(void)
1927 : : {
1928 : 30 : struct dmar_drhd_unit *dmaru, *dmaru_n;
1929 : :
1930 [ + - ]: 30 : if (dmar_in_use())
1931 : : return 0;
1932 : :
1933 [ - + - - ]: 30 : if (dmar_dev_scope_status != 1 && !list_empty(&dmar_drhd_units))
1934 : 0 : bus_unregister_notifier(&pci_bus_type, &dmar_pci_bus_nb);
1935 : :
1936 : 30 : down_write(&dmar_global_lock);
1937 [ - + ]: 30 : list_for_each_entry_safe(dmaru, dmaru_n, &dmar_drhd_units, list) {
1938 : 0 : list_del(&dmaru->list);
1939 : 0 : dmar_free_drhd(dmaru);
1940 : : }
1941 : 30 : up_write(&dmar_global_lock);
1942 : :
1943 : 30 : return 0;
1944 : : }
1945 : :
1946 : : late_initcall(dmar_free_unused_resources);
1947 : : IOMMU_INIT_POST(detect_intel_iommu);
1948 : :
1949 : : /*
1950 : : * DMAR Hotplug Support
1951 : : * For more details, please refer to Intel(R) Virtualization Technology
1952 : : * for Directed-IO Architecture Specifiction, Rev 2.2, Section 8.8
1953 : : * "Remapping Hardware Unit Hot Plug".
1954 : : */
1955 : : static guid_t dmar_hp_guid =
1956 : : GUID_INIT(0xD8C1A3A6, 0xBE9B, 0x4C9B,
1957 : : 0x91, 0xBF, 0xC3, 0xCB, 0x81, 0xFC, 0x5D, 0xAF);
1958 : :
1959 : : /*
1960 : : * Currently there's only one revision and BIOS will not check the revision id,
1961 : : * so use 0 for safety.
1962 : : */
1963 : : #define DMAR_DSM_REV_ID 0
1964 : : #define DMAR_DSM_FUNC_DRHD 1
1965 : : #define DMAR_DSM_FUNC_ATSR 2
1966 : : #define DMAR_DSM_FUNC_RHSA 3
1967 : :
1968 : 0 : static inline bool dmar_detect_dsm(acpi_handle handle, int func)
1969 : : {
1970 : 0 : return acpi_check_dsm(handle, &dmar_hp_guid, DMAR_DSM_REV_ID, 1 << func);
1971 : : }
1972 : :
1973 : 0 : static int dmar_walk_dsm_resource(acpi_handle handle, int func,
1974 : : dmar_res_handler_t handler, void *arg)
1975 : : {
1976 : 0 : int ret = -ENODEV;
1977 : 0 : union acpi_object *obj;
1978 : 0 : struct acpi_dmar_header *start;
1979 : 0 : struct dmar_res_callback callback;
1980 : 0 : static int res_type[] = {
1981 : : [DMAR_DSM_FUNC_DRHD] = ACPI_DMAR_TYPE_HARDWARE_UNIT,
1982 : : [DMAR_DSM_FUNC_ATSR] = ACPI_DMAR_TYPE_ROOT_ATS,
1983 : : [DMAR_DSM_FUNC_RHSA] = ACPI_DMAR_TYPE_HARDWARE_AFFINITY,
1984 : : };
1985 : :
1986 [ # # ]: 0 : if (!dmar_detect_dsm(handle, func))
1987 : : return 0;
1988 : :
1989 : 0 : obj = acpi_evaluate_dsm_typed(handle, &dmar_hp_guid, DMAR_DSM_REV_ID,
1990 : : func, NULL, ACPI_TYPE_BUFFER);
1991 [ # # ]: 0 : if (!obj)
1992 : : return -ENODEV;
1993 : :
1994 : 0 : memset(&callback, 0, sizeof(callback));
1995 : 0 : callback.cb[res_type[func]] = handler;
1996 : 0 : callback.arg[res_type[func]] = arg;
1997 : 0 : start = (struct acpi_dmar_header *)obj->buffer.pointer;
1998 : 0 : ret = dmar_walk_remapping_entries(start, obj->buffer.length, &callback);
1999 : :
2000 : 0 : ACPI_FREE(obj);
2001 : :
2002 : 0 : return ret;
2003 : : }
2004 : :
2005 : 0 : static int dmar_hp_add_drhd(struct acpi_dmar_header *header, void *arg)
2006 : : {
2007 : 0 : int ret;
2008 : 0 : struct dmar_drhd_unit *dmaru;
2009 : :
2010 : 0 : dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
2011 [ # # ]: 0 : if (!dmaru)
2012 : : return -ENODEV;
2013 : :
2014 : 0 : ret = dmar_ir_hotplug(dmaru, true);
2015 : 0 : if (ret == 0)
2016 : 0 : ret = dmar_iommu_hotplug(dmaru, true);
2017 : :
2018 : 0 : return ret;
2019 : : }
2020 : :
2021 : 0 : static int dmar_hp_remove_drhd(struct acpi_dmar_header *header, void *arg)
2022 : : {
2023 : 0 : int i, ret;
2024 : 0 : struct device *dev;
2025 : 0 : struct dmar_drhd_unit *dmaru;
2026 : :
2027 : 0 : dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
2028 [ # # ]: 0 : if (!dmaru)
2029 : : return 0;
2030 : :
2031 : : /*
2032 : : * All PCI devices managed by this unit should have been destroyed.
2033 : : */
2034 [ # # # # : 0 : if (!dmaru->include_all && dmaru->devices && dmaru->devices_cnt) {
# # ]
2035 [ # # # # : 0 : for_each_active_dev_scope(dmaru->devices,
# # ]
2036 : : dmaru->devices_cnt, i, dev)
2037 : : return -EBUSY;
2038 : : }
2039 : :
2040 : 0 : ret = dmar_ir_hotplug(dmaru, false);
2041 : 0 : if (ret == 0)
2042 : 0 : ret = dmar_iommu_hotplug(dmaru, false);
2043 : :
2044 : 0 : return ret;
2045 : : }
2046 : :
2047 : 0 : static int dmar_hp_release_drhd(struct acpi_dmar_header *header, void *arg)
2048 : : {
2049 : 0 : struct dmar_drhd_unit *dmaru;
2050 : :
2051 : 0 : dmaru = dmar_find_dmaru((struct acpi_dmar_hardware_unit *)header);
2052 [ # # ]: 0 : if (dmaru) {
2053 : 0 : list_del_rcu(&dmaru->list);
2054 : 0 : synchronize_rcu();
2055 : 0 : dmar_free_drhd(dmaru);
2056 : : }
2057 : :
2058 : 0 : return 0;
2059 : : }
2060 : :
2061 : 0 : static int dmar_hotplug_insert(acpi_handle handle)
2062 : : {
2063 : 0 : int ret;
2064 : 0 : int drhd_count = 0;
2065 : :
2066 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2067 : : &dmar_validate_one_drhd, (void *)1);
2068 [ # # ]: 0 : if (ret)
2069 : 0 : goto out;
2070 : :
2071 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2072 : : &dmar_parse_one_drhd, (void *)&drhd_count);
2073 [ # # # # ]: 0 : if (ret == 0 && drhd_count == 0) {
2074 : 0 : pr_warn(FW_BUG "No DRHD structures in buffer returned by _DSM method\n");
2075 : 0 : goto out;
2076 [ # # ]: 0 : } else if (ret) {
2077 : 0 : goto release_drhd;
2078 : : }
2079 : :
2080 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_RHSA,
2081 : : &dmar_parse_one_rhsa, NULL);
2082 [ # # ]: 0 : if (ret)
2083 : 0 : goto release_drhd;
2084 : :
2085 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
2086 : : &dmar_parse_one_atsr, NULL);
2087 [ # # ]: 0 : if (ret)
2088 : 0 : goto release_atsr;
2089 : :
2090 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2091 : : &dmar_hp_add_drhd, NULL);
2092 [ # # ]: 0 : if (!ret)
2093 : : return 0;
2094 : :
2095 : 0 : dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2096 : : &dmar_hp_remove_drhd, NULL);
2097 : 0 : release_atsr:
2098 : 0 : dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
2099 : : &dmar_release_one_atsr, NULL);
2100 : 0 : release_drhd:
2101 : 0 : dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2102 : : &dmar_hp_release_drhd, NULL);
2103 : : out:
2104 : : return ret;
2105 : : }
2106 : :
2107 : 0 : static int dmar_hotplug_remove(acpi_handle handle)
2108 : : {
2109 : 0 : int ret;
2110 : :
2111 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
2112 : : &dmar_check_one_atsr, NULL);
2113 [ # # ]: 0 : if (ret)
2114 : : return ret;
2115 : :
2116 : 0 : ret = dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2117 : : &dmar_hp_remove_drhd, NULL);
2118 [ # # ]: 0 : if (ret == 0) {
2119 [ # # ]: 0 : WARN_ON(dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_ATSR,
2120 : : &dmar_release_one_atsr, NULL));
2121 [ # # ]: 0 : WARN_ON(dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2122 : : &dmar_hp_release_drhd, NULL));
2123 : : } else {
2124 : 0 : dmar_walk_dsm_resource(handle, DMAR_DSM_FUNC_DRHD,
2125 : : &dmar_hp_add_drhd, NULL);
2126 : : }
2127 : :
2128 : : return ret;
2129 : : }
2130 : :
2131 : 0 : static acpi_status dmar_get_dsm_handle(acpi_handle handle, u32 lvl,
2132 : : void *context, void **retval)
2133 : : {
2134 : 0 : acpi_handle *phdl = retval;
2135 : :
2136 [ # # ]: 0 : if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) {
2137 : 0 : *phdl = handle;
2138 : 0 : return AE_CTRL_TERMINATE;
2139 : : }
2140 : :
2141 : : return AE_OK;
2142 : : }
2143 : :
2144 : 0 : static int dmar_device_hotplug(acpi_handle handle, bool insert)
2145 : : {
2146 : 0 : int ret;
2147 : 0 : acpi_handle tmp = NULL;
2148 : 0 : acpi_status status;
2149 : :
2150 [ # # ]: 0 : if (!dmar_in_use())
2151 : : return 0;
2152 : :
2153 [ # # ]: 0 : if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) {
2154 : 0 : tmp = handle;
2155 : : } else {
2156 : 0 : status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
2157 : : ACPI_UINT32_MAX,
2158 : : dmar_get_dsm_handle,
2159 : : NULL, NULL, &tmp);
2160 [ # # ]: 0 : if (ACPI_FAILURE(status)) {
2161 : 0 : pr_warn("Failed to locate _DSM method.\n");
2162 : 0 : return -ENXIO;
2163 : : }
2164 : : }
2165 [ # # ]: 0 : if (tmp == NULL)
2166 : : return 0;
2167 : :
2168 : 0 : down_write(&dmar_global_lock);
2169 [ # # ]: 0 : if (insert)
2170 : 0 : ret = dmar_hotplug_insert(tmp);
2171 : : else
2172 : 0 : ret = dmar_hotplug_remove(tmp);
2173 : 0 : up_write(&dmar_global_lock);
2174 : :
2175 : 0 : return ret;
2176 : : }
2177 : :
2178 : 0 : int dmar_device_add(acpi_handle handle)
2179 : : {
2180 : 0 : return dmar_device_hotplug(handle, true);
2181 : : }
2182 : :
2183 : 0 : int dmar_device_remove(acpi_handle handle)
2184 : : {
2185 : 0 : return dmar_device_hotplug(handle, false);
2186 : : }
2187 : :
2188 : : /*
2189 : : * dmar_platform_optin - Is %DMA_CTRL_PLATFORM_OPT_IN_FLAG set in DMAR table
2190 : : *
2191 : : * Returns true if the platform has %DMA_CTRL_PLATFORM_OPT_IN_FLAG set in
2192 : : * the ACPI DMAR table. This means that the platform boot firmware has made
2193 : : * sure no device can issue DMA outside of RMRR regions.
2194 : : */
2195 : 0 : bool dmar_platform_optin(void)
2196 : : {
2197 : 0 : struct acpi_table_dmar *dmar;
2198 : 0 : acpi_status status;
2199 : 0 : bool ret;
2200 : :
2201 : 0 : status = acpi_get_table(ACPI_SIG_DMAR, 0,
2202 : : (struct acpi_table_header **)&dmar);
2203 [ # # ]: 0 : if (ACPI_FAILURE(status))
2204 : : return false;
2205 : :
2206 : 0 : ret = !!(dmar->flags & DMAR_PLATFORM_OPT_IN);
2207 : 0 : acpi_put_table((struct acpi_table_header *)dmar);
2208 : :
2209 : 0 : return ret;
2210 : : }
2211 : : EXPORT_SYMBOL_GPL(dmar_platform_optin);
|