1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/pci.h>
21#include <linux/acpi.h>
22#include <linux/list.h>
23#include <linux/slab.h>
24#include <linux/syscore_ops.h>
25#include <linux/interrupt.h>
26#include <linux/msi.h>
27#include <linux/amd-iommu.h>
28#include <linux/export.h>
29#include <asm/pci-direct.h>
30#include <asm/iommu.h>
31#include <asm/gart.h>
32#include <asm/x86_init.h>
33#include <asm/iommu_table.h>
34
35#include "amd_iommu_proto.h"
36#include "amd_iommu_types.h"
37
38
39
40
41#define IVRS_HEADER_LENGTH 48
42
43#define ACPI_IVHD_TYPE 0x10
44#define ACPI_IVMD_TYPE_ALL 0x20
45#define ACPI_IVMD_TYPE 0x21
46#define ACPI_IVMD_TYPE_RANGE 0x22
47
48#define IVHD_DEV_ALL 0x01
49#define IVHD_DEV_SELECT 0x02
50#define IVHD_DEV_SELECT_RANGE_START 0x03
51#define IVHD_DEV_RANGE_END 0x04
52#define IVHD_DEV_ALIAS 0x42
53#define IVHD_DEV_ALIAS_RANGE 0x43
54#define IVHD_DEV_EXT_SELECT 0x46
55#define IVHD_DEV_EXT_SELECT_RANGE 0x47
56
57#define IVHD_FLAG_HT_TUN_EN_MASK 0x01
58#define IVHD_FLAG_PASSPW_EN_MASK 0x02
59#define IVHD_FLAG_RESPASSPW_EN_MASK 0x04
60#define IVHD_FLAG_ISOC_EN_MASK 0x08
61
62#define IVMD_FLAG_EXCL_RANGE 0x08
63#define IVMD_FLAG_UNITY_MAP 0x01
64
65#define ACPI_DEVFLAG_INITPASS 0x01
66#define ACPI_DEVFLAG_EXTINT 0x02
67#define ACPI_DEVFLAG_NMI 0x04
68#define ACPI_DEVFLAG_SYSMGT1 0x10
69#define ACPI_DEVFLAG_SYSMGT2 0x20
70#define ACPI_DEVFLAG_LINT0 0x40
71#define ACPI_DEVFLAG_LINT1 0x80
72#define ACPI_DEVFLAG_ATSDIS 0x10000000
73
74
75
76
77
78
79
80
81
82
83
84
85struct ivhd_header {
86 u8 type;
87 u8 flags;
88 u16 length;
89 u16 devid;
90 u16 cap_ptr;
91 u64 mmio_phys;
92 u16 pci_seg;
93 u16 info;
94 u32 reserved;
95} __attribute__((packed));
96
97
98
99
100
101struct ivhd_entry {
102 u8 type;
103 u16 devid;
104 u8 flags;
105 u32 ext;
106} __attribute__((packed));
107
108
109
110
111
112struct ivmd_header {
113 u8 type;
114 u8 flags;
115 u16 length;
116 u16 devid;
117 u16 aux;
118 u64 resv;
119 u64 range_start;
120 u64 range_length;
121} __attribute__((packed));
122
123bool amd_iommu_dump;
124
125static int __initdata amd_iommu_detected;
126static bool __initdata amd_iommu_disabled;
127
128u16 amd_iommu_last_bdf;
129
130LIST_HEAD(amd_iommu_unity_map);
131
132bool amd_iommu_unmap_flush;
133
134LIST_HEAD(amd_iommu_list);
135
136
137
138struct amd_iommu *amd_iommus[MAX_IOMMUS];
139int amd_iommus_present;
140
141
142bool amd_iommu_np_cache __read_mostly;
143bool amd_iommu_iotlb_sup __read_mostly = true;
144
145u32 amd_iommu_max_pasids __read_mostly = ~0;
146
147bool amd_iommu_v2_present __read_mostly;
148
149bool amd_iommu_force_isolation __read_mostly;
150
151
152
153
154static int __initdata amd_iommu_init_err;
155
156
157
158
159LIST_HEAD(amd_iommu_pd_list);
160spinlock_t amd_iommu_pd_lock;
161
162
163
164
165
166
167
168struct dev_table_entry *amd_iommu_dev_table;
169
170
171
172
173
174
175u16 *amd_iommu_alias_table;
176
177
178
179
180
181struct amd_iommu **amd_iommu_rlookup_table;
182
183
184
185
186
187unsigned long *amd_iommu_pd_alloc_bitmap;
188
189static u32 dev_table_size;
190static u32 alias_table_size;
191static u32 rlookup_table_size;
192
193
194
195
196
197extern void iommu_flush_all_caches(struct amd_iommu *iommu);
198
199static inline void update_last_devid(u16 devid)
200{
201 if (devid > amd_iommu_last_bdf)
202 amd_iommu_last_bdf = devid;
203}
204
205static inline unsigned long tbl_size(int entry_size)
206{
207 unsigned shift = PAGE_SHIFT +
208 get_order(((int)amd_iommu_last_bdf + 1) * entry_size);
209
210 return 1UL << shift;
211}
212
213
214
215static u32 iommu_read_l1(struct amd_iommu *iommu, u16 l1, u8 address)
216{
217 u32 val;
218
219 pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16));
220 pci_read_config_dword(iommu->dev, 0xfc, &val);
221 return val;
222}
223
224static void iommu_write_l1(struct amd_iommu *iommu, u16 l1, u8 address, u32 val)
225{
226 pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16 | 1 << 31));
227 pci_write_config_dword(iommu->dev, 0xfc, val);
228 pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16));
229}
230
231static u32 iommu_read_l2(struct amd_iommu *iommu, u8 address)
232{
233 u32 val;
234
235 pci_write_config_dword(iommu->dev, 0xf0, address);
236 pci_read_config_dword(iommu->dev, 0xf4, &val);
237 return val;
238}
239
240static void iommu_write_l2(struct amd_iommu *iommu, u8 address, u32 val)
241{
242 pci_write_config_dword(iommu->dev, 0xf0, (address | 1 << 8));
243 pci_write_config_dword(iommu->dev, 0xf4, val);
244}
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259static void iommu_set_exclusion_range(struct amd_iommu *iommu)
260{
261 u64 start = iommu->exclusion_start & PAGE_MASK;
262 u64 limit = (start + iommu->exclusion_length) & PAGE_MASK;
263 u64 entry;
264
265 if (!iommu->exclusion_start)
266 return;
267
268 entry = start | MMIO_EXCL_ENABLE_MASK;
269 memcpy_toio(iommu->mmio_base + MMIO_EXCL_BASE_OFFSET,
270 &entry, sizeof(entry));
271
272 entry = limit;
273 memcpy_toio(iommu->mmio_base + MMIO_EXCL_LIMIT_OFFSET,
274 &entry, sizeof(entry));
275}
276
277
278static void iommu_set_device_table(struct amd_iommu *iommu)
279{
280 u64 entry;
281
282 BUG_ON(iommu->mmio_base == NULL);
283
284 entry = virt_to_phys(amd_iommu_dev_table);
285 entry |= (dev_table_size >> 12) - 1;
286 memcpy_toio(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET,
287 &entry, sizeof(entry));
288}
289
290
291static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit)
292{
293 u32 ctrl;
294
295 ctrl = readl(iommu->mmio_base + MMIO_CONTROL_OFFSET);
296 ctrl |= (1 << bit);
297 writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
298}
299
300static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
301{
302 u32 ctrl;
303
304 ctrl = readl(iommu->mmio_base + MMIO_CONTROL_OFFSET);
305 ctrl &= ~(1 << bit);
306 writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
307}
308
309static void iommu_set_inv_tlb_timeout(struct amd_iommu *iommu, int timeout)
310{
311 u32 ctrl;
312
313 ctrl = readl(iommu->mmio_base + MMIO_CONTROL_OFFSET);
314 ctrl &= ~CTRL_INV_TO_MASK;
315 ctrl |= (timeout << CONTROL_INV_TIMEOUT) & CTRL_INV_TO_MASK;
316 writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
317}
318
319
320static void iommu_enable(struct amd_iommu *iommu)
321{
322 static const char * const feat_str[] = {
323 "PreF", "PPR", "X2APIC", "NX", "GT", "[5]",
324 "IA", "GA", "HE", "PC", NULL
325 };
326 int i;
327
328 printk(KERN_INFO "AMD-Vi: Enabling IOMMU at %s cap 0x%hx",
329 dev_name(&iommu->dev->dev), iommu->cap_ptr);
330
331 if (iommu->cap & (1 << IOMMU_CAP_EFR)) {
332 printk(KERN_CONT " extended features: ");
333 for (i = 0; feat_str[i]; ++i)
334 if (iommu_feature(iommu, (1ULL << i)))
335 printk(KERN_CONT " %s", feat_str[i]);
336 }
337 printk(KERN_CONT "\n");
338
339 iommu_feature_enable(iommu, CONTROL_IOMMU_EN);
340}
341
342static void iommu_disable(struct amd_iommu *iommu)
343{
344
345 iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
346
347
348 iommu_feature_disable(iommu, CONTROL_EVT_INT_EN);
349 iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN);
350
351
352 iommu_feature_disable(iommu, CONTROL_IOMMU_EN);
353}
354
355
356
357
358
359static u8 * __init iommu_map_mmio_space(u64 address)
360{
361 u8 *ret;
362
363 if (!request_mem_region(address, MMIO_REGION_LENGTH, "amd_iommu")) {
364 pr_err("AMD-Vi: Can not reserve memory region %llx for mmio\n",
365 address);
366 pr_err("AMD-Vi: This is a BIOS bug. Please contact your hardware vendor\n");
367 return NULL;
368 }
369
370 ret = ioremap_nocache(address, MMIO_REGION_LENGTH);
371 if (ret != NULL)
372 return ret;
373
374 release_mem_region(address, MMIO_REGION_LENGTH);
375
376 return NULL;
377}
378
379static void __init iommu_unmap_mmio_space(struct amd_iommu *iommu)
380{
381 if (iommu->mmio_base)
382 iounmap(iommu->mmio_base);
383 release_mem_region(iommu->mmio_phys, MMIO_REGION_LENGTH);
384}
385
386
387
388
389
390
391
392
393
394
395
396
397
398static inline int ivhd_entry_length(u8 *ivhd)
399{
400 return 0x04 << (*ivhd >> 6);
401}
402
403
404
405
406
407static int __init find_last_devid_on_pci(int bus, int dev, int fn, int cap_ptr)
408{
409 u32 cap;
410
411 cap = read_pci_config(bus, dev, fn, cap_ptr+MMIO_RANGE_OFFSET);
412 update_last_devid(calc_devid(MMIO_GET_BUS(cap), MMIO_GET_LD(cap)));
413
414 return 0;
415}
416
417
418
419
420
421static int __init find_last_devid_from_ivhd(struct ivhd_header *h)
422{
423 u8 *p = (void *)h, *end = (void *)h;
424 struct ivhd_entry *dev;
425
426 p += sizeof(*h);
427 end += h->length;
428
429 find_last_devid_on_pci(PCI_BUS(h->devid),
430 PCI_SLOT(h->devid),
431 PCI_FUNC(h->devid),
432 h->cap_ptr);
433
434 while (p < end) {
435 dev = (struct ivhd_entry *)p;
436 switch (dev->type) {
437 case IVHD_DEV_SELECT:
438 case IVHD_DEV_RANGE_END:
439 case IVHD_DEV_ALIAS:
440 case IVHD_DEV_EXT_SELECT:
441
442 update_last_devid(dev->devid);
443 break;
444 default:
445 break;
446 }
447 p += ivhd_entry_length(p);
448 }
449
450 WARN_ON(p != end);
451
452 return 0;
453}
454
455
456
457
458
459
460static int __init find_last_devid_acpi(struct acpi_table_header *table)
461{
462 int i;
463 u8 checksum = 0, *p = (u8 *)table, *end = (u8 *)table;
464 struct ivhd_header *h;
465
466
467
468
469
470 for (i = 0; i < table->length; ++i)
471 checksum += p[i];
472 if (checksum != 0) {
473
474 amd_iommu_init_err = -ENODEV;
475 return 0;
476 }
477
478 p += IVRS_HEADER_LENGTH;
479
480 end += table->length;
481 while (p < end) {
482 h = (struct ivhd_header *)p;
483 switch (h->type) {
484 case ACPI_IVHD_TYPE:
485 find_last_devid_from_ivhd(h);
486 break;
487 default:
488 break;
489 }
490 p += h->length;
491 }
492 WARN_ON(p != end);
493
494 return 0;
495}
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511static u8 * __init alloc_command_buffer(struct amd_iommu *iommu)
512{
513 u8 *cmd_buf = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
514 get_order(CMD_BUFFER_SIZE));
515
516 if (cmd_buf == NULL)
517 return NULL;
518
519 iommu->cmd_buf_size = CMD_BUFFER_SIZE | CMD_BUFFER_UNINITIALIZED;
520
521 return cmd_buf;
522}
523
524
525
526
527
528void amd_iommu_reset_cmd_buffer(struct amd_iommu *iommu)
529{
530 iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
531
532 writel(0x00, iommu->mmio_base + MMIO_CMD_HEAD_OFFSET);
533 writel(0x00, iommu->mmio_base + MMIO_CMD_TAIL_OFFSET);
534
535 iommu_feature_enable(iommu, CONTROL_CMDBUF_EN);
536}
537
538
539
540
541
542static void iommu_enable_command_buffer(struct amd_iommu *iommu)
543{
544 u64 entry;
545
546 BUG_ON(iommu->cmd_buf == NULL);
547
548 entry = (u64)virt_to_phys(iommu->cmd_buf);
549 entry |= MMIO_CMD_SIZE_512;
550
551 memcpy_toio(iommu->mmio_base + MMIO_CMD_BUF_OFFSET,
552 &entry, sizeof(entry));
553
554 amd_iommu_reset_cmd_buffer(iommu);
555 iommu->cmd_buf_size &= ~(CMD_BUFFER_UNINITIALIZED);
556}
557
558static void __init free_command_buffer(struct amd_iommu *iommu)
559{
560 free_pages((unsigned long)iommu->cmd_buf,
561 get_order(iommu->cmd_buf_size & ~(CMD_BUFFER_UNINITIALIZED)));
562}
563
564
565static u8 * __init alloc_event_buffer(struct amd_iommu *iommu)
566{
567 iommu->evt_buf = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
568 get_order(EVT_BUFFER_SIZE));
569
570 if (iommu->evt_buf == NULL)
571 return NULL;
572
573 iommu->evt_buf_size = EVT_BUFFER_SIZE;
574
575 return iommu->evt_buf;
576}
577
578static void iommu_enable_event_buffer(struct amd_iommu *iommu)
579{
580 u64 entry;
581
582 BUG_ON(iommu->evt_buf == NULL);
583
584 entry = (u64)virt_to_phys(iommu->evt_buf) | EVT_LEN_MASK;
585
586 memcpy_toio(iommu->mmio_base + MMIO_EVT_BUF_OFFSET,
587 &entry, sizeof(entry));
588
589
590 writel(0x00, iommu->mmio_base + MMIO_EVT_HEAD_OFFSET);
591 writel(0x00, iommu->mmio_base + MMIO_EVT_TAIL_OFFSET);
592
593 iommu_feature_enable(iommu, CONTROL_EVT_LOG_EN);
594}
595
596static void __init free_event_buffer(struct amd_iommu *iommu)
597{
598 free_pages((unsigned long)iommu->evt_buf, get_order(EVT_BUFFER_SIZE));
599}
600
601
602static u8 * __init alloc_ppr_log(struct amd_iommu *iommu)
603{
604 iommu->ppr_log = (u8 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
605 get_order(PPR_LOG_SIZE));
606
607 if (iommu->ppr_log == NULL)
608 return NULL;
609
610 return iommu->ppr_log;
611}
612
613static void iommu_enable_ppr_log(struct amd_iommu *iommu)
614{
615 u64 entry;
616
617 if (iommu->ppr_log == NULL)
618 return;
619
620 entry = (u64)virt_to_phys(iommu->ppr_log) | PPR_LOG_SIZE_512;
621
622 memcpy_toio(iommu->mmio_base + MMIO_PPR_LOG_OFFSET,
623 &entry, sizeof(entry));
624
625
626 writel(0x00, iommu->mmio_base + MMIO_PPR_HEAD_OFFSET);
627 writel(0x00, iommu->mmio_base + MMIO_PPR_TAIL_OFFSET);
628
629 iommu_feature_enable(iommu, CONTROL_PPFLOG_EN);
630 iommu_feature_enable(iommu, CONTROL_PPR_EN);
631}
632
633static void __init free_ppr_log(struct amd_iommu *iommu)
634{
635 if (iommu->ppr_log == NULL)
636 return;
637
638 free_pages((unsigned long)iommu->ppr_log, get_order(PPR_LOG_SIZE));
639}
640
641static void iommu_enable_gt(struct amd_iommu *iommu)
642{
643 if (!iommu_feature(iommu, FEATURE_GT))
644 return;
645
646 iommu_feature_enable(iommu, CONTROL_GT_EN);
647}
648
649
650static void set_dev_entry_bit(u16 devid, u8 bit)
651{
652 int i = (bit >> 6) & 0x03;
653 int _bit = bit & 0x3f;
654
655 amd_iommu_dev_table[devid].data[i] |= (1UL << _bit);
656}
657
658static int get_dev_entry_bit(u16 devid, u8 bit)
659{
660 int i = (bit >> 6) & 0x03;
661 int _bit = bit & 0x3f;
662
663 return (amd_iommu_dev_table[devid].data[i] & (1UL << _bit)) >> _bit;
664}
665
666
667void amd_iommu_apply_erratum_63(u16 devid)
668{
669 int sysmgt;
670
671 sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) |
672 (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1);
673
674 if (sysmgt == 0x01)
675 set_dev_entry_bit(devid, DEV_ENTRY_IW);
676}
677
678
679static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
680{
681 amd_iommu_rlookup_table[devid] = iommu;
682}
683
684
685
686
687
688static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
689 u16 devid, u32 flags, u32 ext_flags)
690{
691 if (flags & ACPI_DEVFLAG_INITPASS)
692 set_dev_entry_bit(devid, DEV_ENTRY_INIT_PASS);
693 if (flags & ACPI_DEVFLAG_EXTINT)
694 set_dev_entry_bit(devid, DEV_ENTRY_EINT_PASS);
695 if (flags & ACPI_DEVFLAG_NMI)
696 set_dev_entry_bit(devid, DEV_ENTRY_NMI_PASS);
697 if (flags & ACPI_DEVFLAG_SYSMGT1)
698 set_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1);
699 if (flags & ACPI_DEVFLAG_SYSMGT2)
700 set_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2);
701 if (flags & ACPI_DEVFLAG_LINT0)
702 set_dev_entry_bit(devid, DEV_ENTRY_LINT0_PASS);
703 if (flags & ACPI_DEVFLAG_LINT1)
704 set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
705
706 amd_iommu_apply_erratum_63(devid);
707
708 set_iommu_for_device(iommu, devid);
709}
710
711
712
713
714
715static void __init set_device_exclusion_range(u16 devid, struct ivmd_header *m)
716{
717 struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
718
719 if (!(m->flags & IVMD_FLAG_EXCL_RANGE))
720 return;
721
722 if (iommu) {
723
724
725
726
727
728 set_dev_entry_bit(m->devid, DEV_ENTRY_EX);
729 iommu->exclusion_start = m->range_start;
730 iommu->exclusion_length = m->range_length;
731 }
732}
733
734
735
736
737
738
739static void __init init_iommu_from_pci(struct amd_iommu *iommu)
740{
741 int cap_ptr = iommu->cap_ptr;
742 u32 range, misc, low, high;
743 int i, j;
744
745 pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET,
746 &iommu->cap);
747 pci_read_config_dword(iommu->dev, cap_ptr + MMIO_RANGE_OFFSET,
748 &range);
749 pci_read_config_dword(iommu->dev, cap_ptr + MMIO_MISC_OFFSET,
750 &misc);
751
752 iommu->first_device = calc_devid(MMIO_GET_BUS(range),
753 MMIO_GET_FD(range));
754 iommu->last_device = calc_devid(MMIO_GET_BUS(range),
755 MMIO_GET_LD(range));
756 iommu->evt_msi_num = MMIO_MSI_NUM(misc);
757
758 if (!(iommu->cap & (1 << IOMMU_CAP_IOTLB)))
759 amd_iommu_iotlb_sup = false;
760
761
762 low = readl(iommu->mmio_base + MMIO_EXT_FEATURES);
763 high = readl(iommu->mmio_base + MMIO_EXT_FEATURES + 4);
764
765 iommu->features = ((u64)high << 32) | low;
766
767 if (iommu_feature(iommu, FEATURE_GT)) {
768 int glxval;
769 u32 pasids;
770 u64 shift;
771
772 shift = iommu->features & FEATURE_PASID_MASK;
773 shift >>= FEATURE_PASID_SHIFT;
774 pasids = (1 << shift);
775
776 amd_iommu_max_pasids = min(amd_iommu_max_pasids, pasids);
777
778 glxval = iommu->features & FEATURE_GLXVAL_MASK;
779 glxval >>= FEATURE_GLXVAL_SHIFT;
780
781 if (amd_iommu_max_glx_val == -1)
782 amd_iommu_max_glx_val = glxval;
783 else
784 amd_iommu_max_glx_val = min(amd_iommu_max_glx_val, glxval);
785 }
786
787 if (iommu_feature(iommu, FEATURE_GT) &&
788 iommu_feature(iommu, FEATURE_PPR)) {
789 iommu->is_iommu_v2 = true;
790 amd_iommu_v2_present = true;
791 }
792
793 if (!is_rd890_iommu(iommu->dev))
794 return;
795
796
797
798
799
800
801
802 pci_read_config_dword(iommu->dev, iommu->cap_ptr + 4,
803 &iommu->stored_addr_lo);
804 pci_read_config_dword(iommu->dev, iommu->cap_ptr + 8,
805 &iommu->stored_addr_hi);
806
807
808 iommu->stored_addr_lo &= ~1;
809
810 for (i = 0; i < 6; i++)
811 for (j = 0; j < 0x12; j++)
812 iommu->stored_l1[i][j] = iommu_read_l1(iommu, i, j);
813
814 for (i = 0; i < 0x83; i++)
815 iommu->stored_l2[i] = iommu_read_l2(iommu, i);
816}
817
818
819
820
821
822static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
823 struct ivhd_header *h)
824{
825 u8 *p = (u8 *)h;
826 u8 *end = p, flags = 0;
827 u16 devid = 0, devid_start = 0, devid_to = 0;
828 u32 dev_i, ext_flags = 0;
829 bool alias = false;
830 struct ivhd_entry *e;
831
832
833
834
835 iommu->acpi_flags = h->flags;
836
837
838
839
840 p += sizeof(struct ivhd_header);
841 end += h->length;
842
843
844 while (p < end) {
845 e = (struct ivhd_entry *)p;
846 switch (e->type) {
847 case IVHD_DEV_ALL:
848
849 DUMP_printk(" DEV_ALL\t\t\t first devid: %02x:%02x.%x"
850 " last device %02x:%02x.%x flags: %02x\n",
851 PCI_BUS(iommu->first_device),
852 PCI_SLOT(iommu->first_device),
853 PCI_FUNC(iommu->first_device),
854 PCI_BUS(iommu->last_device),
855 PCI_SLOT(iommu->last_device),
856 PCI_FUNC(iommu->last_device),
857 e->flags);
858
859 for (dev_i = iommu->first_device;
860 dev_i <= iommu->last_device; ++dev_i)
861 set_dev_entry_from_acpi(iommu, dev_i,
862 e->flags, 0);
863 break;
864 case IVHD_DEV_SELECT:
865
866 DUMP_printk(" DEV_SELECT\t\t\t devid: %02x:%02x.%x "
867 "flags: %02x\n",
868 PCI_BUS(e->devid),
869 PCI_SLOT(e->devid),
870 PCI_FUNC(e->devid),
871 e->flags);
872
873 devid = e->devid;
874 set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
875 break;
876 case IVHD_DEV_SELECT_RANGE_START:
877
878 DUMP_printk(" DEV_SELECT_RANGE_START\t "
879 "devid: %02x:%02x.%x flags: %02x\n",
880 PCI_BUS(e->devid),
881 PCI_SLOT(e->devid),
882 PCI_FUNC(e->devid),
883 e->flags);
884
885 devid_start = e->devid;
886 flags = e->flags;
887 ext_flags = 0;
888 alias = false;
889 break;
890 case IVHD_DEV_ALIAS:
891
892 DUMP_printk(" DEV_ALIAS\t\t\t devid: %02x:%02x.%x "
893 "flags: %02x devid_to: %02x:%02x.%x\n",
894 PCI_BUS(e->devid),
895 PCI_SLOT(e->devid),
896 PCI_FUNC(e->devid),
897 e->flags,
898 PCI_BUS(e->ext >> 8),
899 PCI_SLOT(e->ext >> 8),
900 PCI_FUNC(e->ext >> 8));
901
902 devid = e->devid;
903 devid_to = e->ext >> 8;
904 set_dev_entry_from_acpi(iommu, devid , e->flags, 0);
905 set_dev_entry_from_acpi(iommu, devid_to, e->flags, 0);
906 amd_iommu_alias_table[devid] = devid_to;
907 break;
908 case IVHD_DEV_ALIAS_RANGE:
909
910 DUMP_printk(" DEV_ALIAS_RANGE\t\t "
911 "devid: %02x:%02x.%x flags: %02x "
912 "devid_to: %02x:%02x.%x\n",
913 PCI_BUS(e->devid),
914 PCI_SLOT(e->devid),
915 PCI_FUNC(e->devid),
916 e->flags,
917 PCI_BUS(e->ext >> 8),
918 PCI_SLOT(e->ext >> 8),
919 PCI_FUNC(e->ext >> 8));
920
921 devid_start = e->devid;
922 flags = e->flags;
923 devid_to = e->ext >> 8;
924 ext_flags = 0;
925 alias = true;
926 break;
927 case IVHD_DEV_EXT_SELECT:
928
929 DUMP_printk(" DEV_EXT_SELECT\t\t devid: %02x:%02x.%x "
930 "flags: %02x ext: %08x\n",
931 PCI_BUS(e->devid),
932 PCI_SLOT(e->devid),
933 PCI_FUNC(e->devid),
934 e->flags, e->ext);
935
936 devid = e->devid;
937 set_dev_entry_from_acpi(iommu, devid, e->flags,
938 e->ext);
939 break;
940 case IVHD_DEV_EXT_SELECT_RANGE:
941
942 DUMP_printk(" DEV_EXT_SELECT_RANGE\t devid: "
943 "%02x:%02x.%x flags: %02x ext: %08x\n",
944 PCI_BUS(e->devid),
945 PCI_SLOT(e->devid),
946 PCI_FUNC(e->devid),
947 e->flags, e->ext);
948
949 devid_start = e->devid;
950 flags = e->flags;
951 ext_flags = e->ext;
952 alias = false;
953 break;
954 case IVHD_DEV_RANGE_END:
955
956 DUMP_printk(" DEV_RANGE_END\t\t devid: %02x:%02x.%x\n",
957 PCI_BUS(e->devid),
958 PCI_SLOT(e->devid),
959 PCI_FUNC(e->devid));
960
961 devid = e->devid;
962 for (dev_i = devid_start; dev_i <= devid; ++dev_i) {
963 if (alias) {
964 amd_iommu_alias_table[dev_i] = devid_to;
965 set_dev_entry_from_acpi(iommu,
966 devid_to, flags, ext_flags);
967 }
968 set_dev_entry_from_acpi(iommu, dev_i,
969 flags, ext_flags);
970 }
971 break;
972 default:
973 break;
974 }
975
976 p += ivhd_entry_length(p);
977 }
978}
979
980
981static int __init init_iommu_devices(struct amd_iommu *iommu)
982{
983 u32 i;
984
985 for (i = iommu->first_device; i <= iommu->last_device; ++i)
986 set_iommu_for_device(iommu, i);
987
988 return 0;
989}
990
991static void __init free_iommu_one(struct amd_iommu *iommu)
992{
993 free_command_buffer(iommu);
994 free_event_buffer(iommu);
995 free_ppr_log(iommu);
996 iommu_unmap_mmio_space(iommu);
997}
998
999static void __init free_iommu_all(void)
1000{
1001 struct amd_iommu *iommu, *next;
1002
1003 for_each_iommu_safe(iommu, next) {
1004 list_del(&iommu->list);
1005 free_iommu_one(iommu);
1006 kfree(iommu);
1007 }
1008}
1009
1010
1011
1012
1013
1014
1015static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)
1016{
1017 spin_lock_init(&iommu->lock);
1018
1019
1020 list_add_tail(&iommu->list, &amd_iommu_list);
1021 iommu->index = amd_iommus_present++;
1022
1023 if (unlikely(iommu->index >= MAX_IOMMUS)) {
1024 WARN(1, "AMD-Vi: System has more IOMMUs than supported by this driver\n");
1025 return -ENOSYS;
1026 }
1027
1028
1029 amd_iommus[iommu->index] = iommu;
1030
1031
1032
1033
1034 iommu->dev = pci_get_bus_and_slot(PCI_BUS(h->devid), h->devid & 0xff);
1035 if (!iommu->dev)
1036 return 1;
1037
1038 iommu->cap_ptr = h->cap_ptr;
1039 iommu->pci_seg = h->pci_seg;
1040 iommu->mmio_phys = h->mmio_phys;
1041 iommu->mmio_base = iommu_map_mmio_space(h->mmio_phys);
1042 if (!iommu->mmio_base)
1043 return -ENOMEM;
1044
1045 iommu->cmd_buf = alloc_command_buffer(iommu);
1046 if (!iommu->cmd_buf)
1047 return -ENOMEM;
1048
1049 iommu->evt_buf = alloc_event_buffer(iommu);
1050 if (!iommu->evt_buf)
1051 return -ENOMEM;
1052
1053 iommu->int_enabled = false;
1054
1055 init_iommu_from_pci(iommu);
1056 init_iommu_from_acpi(iommu, h);
1057 init_iommu_devices(iommu);
1058
1059 if (iommu_feature(iommu, FEATURE_PPR)) {
1060 iommu->ppr_log = alloc_ppr_log(iommu);
1061 if (!iommu->ppr_log)
1062 return -ENOMEM;
1063 }
1064
1065 if (iommu->cap & (1UL << IOMMU_CAP_NPCACHE))
1066 amd_iommu_np_cache = true;
1067
1068 return pci_enable_device(iommu->dev);
1069}
1070
1071
1072
1073
1074
1075static int __init init_iommu_all(struct acpi_table_header *table)
1076{
1077 u8 *p = (u8 *)table, *end = (u8 *)table;
1078 struct ivhd_header *h;
1079 struct amd_iommu *iommu;
1080 int ret;
1081
1082 end += table->length;
1083 p += IVRS_HEADER_LENGTH;
1084
1085 while (p < end) {
1086 h = (struct ivhd_header *)p;
1087 switch (*p) {
1088 case ACPI_IVHD_TYPE:
1089
1090 DUMP_printk("device: %02x:%02x.%01x cap: %04x "
1091 "seg: %d flags: %01x info %04x\n",
1092 PCI_BUS(h->devid), PCI_SLOT(h->devid),
1093 PCI_FUNC(h->devid), h->cap_ptr,
1094 h->pci_seg, h->flags, h->info);
1095 DUMP_printk(" mmio-addr: %016llx\n",
1096 h->mmio_phys);
1097
1098 iommu = kzalloc(sizeof(struct amd_iommu), GFP_KERNEL);
1099 if (iommu == NULL) {
1100 amd_iommu_init_err = -ENOMEM;
1101 return 0;
1102 }
1103
1104 ret = init_iommu_one(iommu, h);
1105 if (ret) {
1106 amd_iommu_init_err = ret;
1107 return 0;
1108 }
1109 break;
1110 default:
1111 break;
1112 }
1113 p += h->length;
1114
1115 }
1116 WARN_ON(p != end);
1117
1118 return 0;
1119}
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130static int iommu_setup_msi(struct amd_iommu *iommu)
1131{
1132 int r;
1133
1134 r = pci_enable_msi(iommu->dev);
1135 if (r)
1136 return r;
1137
1138 r = request_threaded_irq(iommu->dev->irq,
1139 amd_iommu_int_handler,
1140 amd_iommu_int_thread,
1141 0, "AMD-Vi",
1142 iommu->dev);
1143
1144 if (r) {
1145 pci_disable_msi(iommu->dev);
1146 return r;
1147 }
1148
1149 iommu->int_enabled = true;
1150
1151 return 0;
1152}
1153
1154static int iommu_init_msi(struct amd_iommu *iommu)
1155{
1156 int ret;
1157
1158 if (iommu->int_enabled)
1159 goto enable_faults;
1160
1161 if (pci_find_capability(iommu->dev, PCI_CAP_ID_MSI))
1162 ret = iommu_setup_msi(iommu);
1163 else
1164 ret = -ENODEV;
1165
1166 if (ret)
1167 return ret;
1168
1169enable_faults:
1170 iommu_feature_enable(iommu, CONTROL_EVT_INT_EN);
1171
1172 if (iommu->ppr_log != NULL)
1173 iommu_feature_enable(iommu, CONTROL_PPFINT_EN);
1174
1175 return 0;
1176}
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186static void __init free_unity_maps(void)
1187{
1188 struct unity_map_entry *entry, *next;
1189
1190 list_for_each_entry_safe(entry, next, &amd_iommu_unity_map, list) {
1191 list_del(&entry->list);
1192 kfree(entry);
1193 }
1194}
1195
1196
1197static int __init init_exclusion_range(struct ivmd_header *m)
1198{
1199 int i;
1200
1201 switch (m->type) {
1202 case ACPI_IVMD_TYPE:
1203 set_device_exclusion_range(m->devid, m);
1204 break;
1205 case ACPI_IVMD_TYPE_ALL:
1206 for (i = 0; i <= amd_iommu_last_bdf; ++i)
1207 set_device_exclusion_range(i, m);
1208 break;
1209 case ACPI_IVMD_TYPE_RANGE:
1210 for (i = m->devid; i <= m->aux; ++i)
1211 set_device_exclusion_range(i, m);
1212 break;
1213 default:
1214 break;
1215 }
1216
1217 return 0;
1218}
1219
1220
1221static int __init init_unity_map_range(struct ivmd_header *m)
1222{
1223 struct unity_map_entry *e = 0;
1224 char *s;
1225
1226 e = kzalloc(sizeof(*e), GFP_KERNEL);
1227 if (e == NULL)
1228 return -ENOMEM;
1229
1230 switch (m->type) {
1231 default:
1232 kfree(e);
1233 return 0;
1234 case ACPI_IVMD_TYPE:
1235 s = "IVMD_TYPEi\t\t\t";
1236 e->devid_start = e->devid_end = m->devid;
1237 break;
1238 case ACPI_IVMD_TYPE_ALL:
1239 s = "IVMD_TYPE_ALL\t\t";
1240 e->devid_start = 0;
1241 e->devid_end = amd_iommu_last_bdf;
1242 break;
1243 case ACPI_IVMD_TYPE_RANGE:
1244 s = "IVMD_TYPE_RANGE\t\t";
1245 e->devid_start = m->devid;
1246 e->devid_end = m->aux;
1247 break;
1248 }
1249 e->address_start = PAGE_ALIGN(m->range_start);
1250 e->address_end = e->address_start + PAGE_ALIGN(m->range_length);
1251 e->prot = m->flags >> 1;
1252
1253 DUMP_printk("%s devid_start: %02x:%02x.%x devid_end: %02x:%02x.%x"
1254 " range_start: %016llx range_end: %016llx flags: %x\n", s,
1255 PCI_BUS(e->devid_start), PCI_SLOT(e->devid_start),
1256 PCI_FUNC(e->devid_start), PCI_BUS(e->devid_end),
1257 PCI_SLOT(e->devid_end), PCI_FUNC(e->devid_end),
1258 e->address_start, e->address_end, m->flags);
1259
1260 list_add_tail(&e->list, &amd_iommu_unity_map);
1261
1262 return 0;
1263}
1264
1265
1266static int __init init_memory_definitions(struct acpi_table_header *table)
1267{
1268 u8 *p = (u8 *)table, *end = (u8 *)table;
1269 struct ivmd_header *m;
1270
1271 end += table->length;
1272 p += IVRS_HEADER_LENGTH;
1273
1274 while (p < end) {
1275 m = (struct ivmd_header *)p;
1276 if (m->flags & IVMD_FLAG_EXCL_RANGE)
1277 init_exclusion_range(m);
1278 else if (m->flags & IVMD_FLAG_UNITY_MAP)
1279 init_unity_map_range(m);
1280
1281 p += m->length;
1282 }
1283
1284 return 0;
1285}
1286
1287
1288
1289
1290
1291static void init_device_table(void)
1292{
1293 u32 devid;
1294
1295 for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
1296 set_dev_entry_bit(devid, DEV_ENTRY_VALID);
1297 set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION);
1298 }
1299}
1300
1301static void iommu_init_flags(struct amd_iommu *iommu)
1302{
1303 iommu->acpi_flags & IVHD_FLAG_HT_TUN_EN_MASK ?
1304 iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) :
1305 iommu_feature_disable(iommu, CONTROL_HT_TUN_EN);
1306
1307 iommu->acpi_flags & IVHD_FLAG_PASSPW_EN_MASK ?
1308 iommu_feature_enable(iommu, CONTROL_PASSPW_EN) :
1309 iommu_feature_disable(iommu, CONTROL_PASSPW_EN);
1310
1311 iommu->acpi_flags & IVHD_FLAG_RESPASSPW_EN_MASK ?
1312 iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) :
1313 iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN);
1314
1315 iommu->acpi_flags & IVHD_FLAG_ISOC_EN_MASK ?
1316 iommu_feature_enable(iommu, CONTROL_ISOC_EN) :
1317 iommu_feature_disable(iommu, CONTROL_ISOC_EN);
1318
1319
1320
1321
1322 iommu_feature_enable(iommu, CONTROL_COHERENT_EN);
1323
1324
1325 iommu_set_inv_tlb_timeout(iommu, CTRL_INV_TO_1S);
1326}
1327
1328static void iommu_apply_resume_quirks(struct amd_iommu *iommu)
1329{
1330 int i, j;
1331 u32 ioc_feature_control;
1332 struct pci_dev *pdev = NULL;
1333
1334
1335 if (!is_rd890_iommu(iommu->dev))
1336 return;
1337
1338
1339
1340
1341
1342 pdev = pci_get_bus_and_slot(iommu->dev->bus->number, PCI_DEVFN(0, 0));
1343
1344 if (!pdev)
1345 return;
1346
1347
1348 pci_write_config_dword(pdev, 0x60, 0x75 | (1 << 7));
1349 pci_read_config_dword(pdev, 0x64, &ioc_feature_control);
1350
1351
1352 if (!(ioc_feature_control & 0x1))
1353 pci_write_config_dword(pdev, 0x64, ioc_feature_control | 1);
1354
1355 pci_dev_put(pdev);
1356
1357
1358 pci_write_config_dword(iommu->dev, iommu->cap_ptr + 4,
1359 iommu->stored_addr_lo);
1360 pci_write_config_dword(iommu->dev, iommu->cap_ptr + 8,
1361 iommu->stored_addr_hi);
1362
1363
1364 for (i = 0; i < 6; i++)
1365 for (j = 0; j < 0x12; j++)
1366 iommu_write_l1(iommu, i, j, iommu->stored_l1[i][j]);
1367
1368
1369 for (i = 0; i < 0x83; i++)
1370 iommu_write_l2(iommu, i, iommu->stored_l2[i]);
1371
1372
1373 pci_write_config_dword(iommu->dev, iommu->cap_ptr + 4,
1374 iommu->stored_addr_lo | 1);
1375}
1376
1377
1378
1379
1380
1381static void enable_iommus(void)
1382{
1383 struct amd_iommu *iommu;
1384
1385 for_each_iommu(iommu) {
1386 iommu_disable(iommu);
1387 iommu_init_flags(iommu);
1388 iommu_set_device_table(iommu);
1389 iommu_enable_command_buffer(iommu);
1390 iommu_enable_event_buffer(iommu);
1391 iommu_enable_ppr_log(iommu);
1392 iommu_enable_gt(iommu);
1393 iommu_set_exclusion_range(iommu);
1394 iommu_init_msi(iommu);
1395 iommu_enable(iommu);
1396 iommu_flush_all_caches(iommu);
1397 }
1398}
1399
1400static void disable_iommus(void)
1401{
1402 struct amd_iommu *iommu;
1403
1404 for_each_iommu(iommu)
1405 iommu_disable(iommu);
1406}
1407
1408
1409
1410
1411
1412
1413static void amd_iommu_resume(void)
1414{
1415 struct amd_iommu *iommu;
1416
1417 for_each_iommu(iommu)
1418 iommu_apply_resume_quirks(iommu);
1419
1420
1421 enable_iommus();
1422}
1423
1424static int amd_iommu_suspend(void)
1425{
1426
1427 disable_iommus();
1428
1429 return 0;
1430}
1431
1432static struct syscore_ops amd_iommu_syscore_ops = {
1433 .suspend = amd_iommu_suspend,
1434 .resume = amd_iommu_resume,
1435};
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465static int __init amd_iommu_init(void)
1466{
1467 int i, ret = 0;
1468
1469
1470
1471
1472
1473
1474 if (acpi_table_parse("IVRS", find_last_devid_acpi) != 0)
1475 return -ENODEV;
1476
1477 ret = amd_iommu_init_err;
1478 if (ret)
1479 goto out;
1480
1481 dev_table_size = tbl_size(DEV_TABLE_ENTRY_SIZE);
1482 alias_table_size = tbl_size(ALIAS_TABLE_ENTRY_SIZE);
1483 rlookup_table_size = tbl_size(RLOOKUP_TABLE_ENTRY_SIZE);
1484
1485 ret = -ENOMEM;
1486
1487
1488 amd_iommu_dev_table = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
1489 get_order(dev_table_size));
1490 if (amd_iommu_dev_table == NULL)
1491 goto out;
1492
1493
1494
1495
1496
1497 amd_iommu_alias_table = (void *)__get_free_pages(GFP_KERNEL,
1498 get_order(alias_table_size));
1499 if (amd_iommu_alias_table == NULL)
1500 goto free;
1501
1502
1503 amd_iommu_rlookup_table = (void *)__get_free_pages(
1504 GFP_KERNEL | __GFP_ZERO,
1505 get_order(rlookup_table_size));
1506 if (amd_iommu_rlookup_table == NULL)
1507 goto free;
1508
1509 amd_iommu_pd_alloc_bitmap = (void *)__get_free_pages(
1510 GFP_KERNEL | __GFP_ZERO,
1511 get_order(MAX_DOMAIN_ID/8));
1512 if (amd_iommu_pd_alloc_bitmap == NULL)
1513 goto free;
1514
1515
1516 init_device_table();
1517
1518
1519
1520
1521 for (i = 0; i <= amd_iommu_last_bdf; ++i)
1522 amd_iommu_alias_table[i] = i;
1523
1524
1525
1526
1527
1528 amd_iommu_pd_alloc_bitmap[0] = 1;
1529
1530 spin_lock_init(&amd_iommu_pd_lock);
1531
1532
1533
1534
1535
1536 ret = -ENODEV;
1537 if (acpi_table_parse("IVRS", init_iommu_all) != 0)
1538 goto free;
1539
1540 if (amd_iommu_init_err) {
1541 ret = amd_iommu_init_err;
1542 goto free;
1543 }
1544
1545 if (acpi_table_parse("IVRS", init_memory_definitions) != 0)
1546 goto free;
1547
1548 if (amd_iommu_init_err) {
1549 ret = amd_iommu_init_err;
1550 goto free;
1551 }
1552
1553 ret = amd_iommu_init_devices();
1554 if (ret)
1555 goto free;
1556
1557 enable_iommus();
1558
1559 if (iommu_pass_through)
1560 ret = amd_iommu_init_passthrough();
1561 else
1562 ret = amd_iommu_init_dma_ops();
1563
1564 if (ret)
1565 goto free_disable;
1566
1567 amd_iommu_init_api();
1568
1569 amd_iommu_init_notifier();
1570
1571 register_syscore_ops(&amd_iommu_syscore_ops);
1572
1573 if (iommu_pass_through)
1574 goto out;
1575
1576 if (amd_iommu_unmap_flush)
1577 printk(KERN_INFO "AMD-Vi: IO/TLB flush on unmap enabled\n");
1578 else
1579 printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n");
1580
1581 x86_platform.iommu_shutdown = disable_iommus;
1582out:
1583 return ret;
1584
1585free_disable:
1586 disable_iommus();
1587
1588free:
1589 amd_iommu_uninit_devices();
1590
1591 free_pages((unsigned long)amd_iommu_pd_alloc_bitmap,
1592 get_order(MAX_DOMAIN_ID/8));
1593
1594 free_pages((unsigned long)amd_iommu_rlookup_table,
1595 get_order(rlookup_table_size));
1596
1597 free_pages((unsigned long)amd_iommu_alias_table,
1598 get_order(alias_table_size));
1599
1600 free_pages((unsigned long)amd_iommu_dev_table,
1601 get_order(dev_table_size));
1602
1603 free_iommu_all();
1604
1605 free_unity_maps();
1606
1607#ifdef CONFIG_GART_IOMMU
1608
1609
1610
1611
1612 gart_iommu_init();
1613
1614#endif
1615
1616 goto out;
1617}
1618
1619
1620
1621
1622
1623
1624
1625
1626static int __init early_amd_iommu_detect(struct acpi_table_header *table)
1627{
1628 return 0;
1629}
1630
1631int __init amd_iommu_detect(void)
1632{
1633 if (no_iommu || (iommu_detected && !gart_iommu_aperture))
1634 return -ENODEV;
1635
1636 if (amd_iommu_disabled)
1637 return -ENODEV;
1638
1639 if (acpi_table_parse("IVRS", early_amd_iommu_detect) == 0) {
1640 iommu_detected = 1;
1641 amd_iommu_detected = 1;
1642 x86_init.iommu.iommu_init = amd_iommu_init;
1643
1644
1645 pci_request_acs();
1646 return 1;
1647 }
1648 return -ENODEV;
1649}
1650
1651
1652
1653
1654
1655
1656
1657
1658static int __init parse_amd_iommu_dump(char *str)
1659{
1660 amd_iommu_dump = true;
1661
1662 return 1;
1663}
1664
1665static int __init parse_amd_iommu_options(char *str)
1666{
1667 for (; *str; ++str) {
1668 if (strncmp(str, "fullflush", 9) == 0)
1669 amd_iommu_unmap_flush = true;
1670 if (strncmp(str, "off", 3) == 0)
1671 amd_iommu_disabled = true;
1672 if (strncmp(str, "force_isolation", 15) == 0)
1673 amd_iommu_force_isolation = true;
1674 }
1675
1676 return 1;
1677}
1678
1679__setup("amd_iommu_dump", parse_amd_iommu_dump);
1680__setup("amd_iommu=", parse_amd_iommu_options);
1681
1682IOMMU_INIT_FINISH(amd_iommu_detect,
1683 gart_iommu_hole_init,
1684 0,
1685 0);
1686
1687bool amd_iommu_v2_supported(void)
1688{
1689 return amd_iommu_v2_present;
1690}
1691EXPORT_SYMBOL(amd_iommu_v2_supported);
1692