diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/intel-iommu.c | 9 | ||||
-rw-r--r-- | drivers/pci/intr_remapping.c | 39 |
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]; | |||
15 | static int ir_ioapic_num; | 15 | static int ir_ioapic_num; |
16 | int intr_remapping_enabled; | 16 | int intr_remapping_enabled; |
17 | 17 | ||
18 | static int disable_intremap; | ||
19 | static __init int setup_nointremap(char *str) | ||
20 | { | ||
21 | disable_intremap = 1; | ||
22 | return 0; | ||
23 | } | ||
24 | early_param("nointremap", setup_nointremap); | ||
25 | |||
18 | struct irq_2_iommu { | 26 | struct 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 | ||
513 | int __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 | |||
519 | int __init enable_intr_remapping(int eim) | 530 | int __init enable_intr_remapping(int eim) |
520 | { | 531 | { |
521 | struct dmar_drhd_unit *drhd; | 532 | struct dmar_drhd_unit *drhd; |