diff options
Diffstat (limited to 'drivers/pci/intr_remapping.c')
-rw-r--r-- | drivers/pci/intr_remapping.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c index c26633d7e7da..ef25caade54b 100644 --- a/drivers/pci/intr_remapping.c +++ b/drivers/pci/intr_remapping.c | |||
@@ -415,12 +415,27 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode) | |||
415 | 415 | ||
416 | /* Set interrupt-remapping table pointer */ | 416 | /* Set interrupt-remapping table pointer */ |
417 | cmd = iommu->gcmd | DMA_GCMD_SIRTP; | 417 | cmd = iommu->gcmd | DMA_GCMD_SIRTP; |
418 | iommu->gcmd |= DMA_GCMD_SIRTP; | ||
418 | writel(cmd, iommu->reg + DMAR_GCMD_REG); | 419 | writel(cmd, iommu->reg + DMAR_GCMD_REG); |
419 | 420 | ||
420 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | 421 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, |
421 | readl, (sts & DMA_GSTS_IRTPS), sts); | 422 | readl, (sts & DMA_GSTS_IRTPS), sts); |
422 | spin_unlock_irqrestore(&iommu->register_lock, flags); | 423 | spin_unlock_irqrestore(&iommu->register_lock, flags); |
423 | 424 | ||
425 | if (mode == 0) { | ||
426 | spin_lock_irqsave(&iommu->register_lock, flags); | ||
427 | |||
428 | /* enable comaptiblity format interrupt pass through */ | ||
429 | cmd = iommu->gcmd | DMA_GCMD_CFI; | ||
430 | iommu->gcmd |= DMA_GCMD_CFI; | ||
431 | writel(cmd, iommu->reg + DMAR_GCMD_REG); | ||
432 | |||
433 | IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, | ||
434 | readl, (sts & DMA_GSTS_CFIS), sts); | ||
435 | |||
436 | spin_unlock_irqrestore(&iommu->register_lock, flags); | ||
437 | } | ||
438 | |||
424 | /* | 439 | /* |
425 | * global invalidation of interrupt entry cache before enabling | 440 | * global invalidation of interrupt entry cache before enabling |
426 | * interrupt-remapping. | 441 | * interrupt-remapping. |