diff options
Diffstat (limited to 'drivers/iommu/intel/irq_remapping.c')
| -rw-r--r-- | drivers/iommu/intel/irq_remapping.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/iommu/intel/irq_remapping.c b/drivers/iommu/intel/irq_remapping.c index 23583b0e66a5..8f4ce72570ce 100644 --- a/drivers/iommu/intel/irq_remapping.c +++ b/drivers/iommu/intel/irq_remapping.c @@ -508,12 +508,18 @@ static void iommu_enable_irq_remapping(struct intel_iommu *iommu)  	/* Enable interrupt-remapping */  	iommu->gcmd |= DMA_GCMD_IRE; -	iommu->gcmd &= ~DMA_GCMD_CFI;  /* Block compatibility-format MSIs */  	writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); -  	IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,  		      readl, (sts & DMA_GSTS_IRES), sts); +	/* Block compatibility-format MSIs */ +	if (sts & DMA_GSTS_CFIS) { +		iommu->gcmd &= ~DMA_GCMD_CFI; +		writel(iommu->gcmd, iommu->reg + DMAR_GCMD_REG); +		IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, +			      readl, !(sts & DMA_GSTS_CFIS), sts); +	} +  	/*  	 * With CFI clear in the Global Command register, we should be  	 * protected from dangerous (i.e. compatibility) interrupts  |