aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/intel-iommu.c9
-rw-r--r--drivers/pci/intr_remapping.c39
2 files changed, 25 insertions, 23 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 001b328adf8..9ce8f0764be 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -1968,15 +1968,6 @@ static int __init init_dmars(void)
1968 } 1968 }
1969 } 1969 }
1970 1970
1971#ifdef CONFIG_INTR_REMAP
1972 if (!intr_remapping_enabled) {
1973 ret = enable_intr_remapping(0);
1974 if (ret)
1975 printk(KERN_ERR
1976 "IOMMU: enable interrupt remapping failed\n");
1977 }
1978#endif
1979
1980 /* 1971 /*
1981 * For each rmrr 1972 * For each rmrr
1982 * for each dev attached to rmrr 1973 * for each dev attached to rmrr
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c
index f5e0ea724a6..842039e4955 100644
--- a/drivers/pci/intr_remapping.c
+++ b/drivers/pci/intr_remapping.c
@@ -15,6 +15,14 @@ static struct ioapic_scope ir_ioapic[MAX_IO_APICS];
15static int ir_ioapic_num; 15static int ir_ioapic_num;
16int intr_remapping_enabled; 16int intr_remapping_enabled;
17 17
18static int disable_intremap;
19static __init int setup_nointremap(char *str)
20{
21 disable_intremap = 1;
22 return 0;
23}
24early_param("nointremap", setup_nointremap);
25
18struct irq_2_iommu { 26struct irq_2_iommu {
19 struct intel_iommu *iommu; 27 struct intel_iommu *iommu;
20 u16 irte_index; 28 u16 irte_index;
@@ -423,20 +431,6 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode)
423 readl, (sts & DMA_GSTS_IRTPS), sts); 431 readl, (sts & DMA_GSTS_IRTPS), sts);
424 spin_unlock_irqrestore(&iommu->register_lock, flags); 432 spin_unlock_irqrestore(&iommu->register_lock, flags);
425 433
426 if (mode == 0) {
427 spin_lock_irqsave(&iommu->register_lock, flags);
428
429 /* enable comaptiblity format interrupt pass through */
430 cmd = iommu->gcmd | DMA_GCMD_CFI;
431 iommu->gcmd |= DMA_GCMD_CFI;
432 writel(cmd, iommu->reg + DMAR_GCMD_REG);
433
434 IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,
435 readl, (sts & DMA_GSTS_CFIS), sts);
436
437 spin_unlock_irqrestore(&iommu->register_lock, flags);
438 }
439
440 /* 434 /*
441 * global invalidation of interrupt entry cache before enabling 435 * global invalidation of interrupt entry cache before enabling
442 * interrupt-remapping. 436 * interrupt-remapping.
@@ -516,6 +510,23 @@ end:
516 spin_unlock_irqrestore(&iommu->register_lock, flags); 510 spin_unlock_irqrestore(&iommu->register_lock, flags);
517} 511}
518 512
513int __init intr_remapping_supported(void)
514{
515 struct dmar_drhd_unit *drhd;
516
517 if (disable_intremap)
518 return 0;
519
520 for_each_drhd_unit(drhd) {
521 struct intel_iommu *iommu = drhd->iommu;
522
523 if (!ecap_ir_support(iommu->ecap))
524 return 0;
525 }
526
527 return 1;
528}
529
519int __init enable_intr_remapping(int eim) 530int __init enable_intr_remapping(int eim)
520{ 531{
521 struct dmar_drhd_unit *drhd; 532 struct dmar_drhd_unit *drhd;