in dmar_domain, more than one iommus may be included in iommu_bmp. Due to "Coherency" capability may be different across iommus, set this variable to indicate iommu access is coherent or not. Only when all related iommus in a dmar_domain are all coherent, iommu access of this domain is coherent.
Signed-off-by: Weidong Han <[EMAIL PROTECTED]> --- drivers/pci/intel-iommu.c | 6 ++++++ include/linux/dma_remapping.h | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index a18e0b4..fa1507b 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -982,6 +982,12 @@ static struct dmar_domain * iommu_alloc_domain(struct intel_iommu *iommu) domain->id = num; memset(&domain->iommu_bmp, 0, sizeof(unsigned long)); set_bit(iommu->seq_id, &domain->iommu_bmp); + + if (ecap_coherent(iommu->ecap)) + domain->iommu_coherency = 1; + else + domain->iommu_coherency = 0; + iommu->domains[num] = domain; spin_unlock_irqrestore(&iommu->lock, flags); diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index c9d99c9..add2111 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h @@ -175,6 +175,8 @@ struct dmar_domain { #define DOMAIN_FLAG_MULTIPLE_DEVICES 1 int flags; + + int iommu_coherency;/* iommu access is coherent or not */ }; /* PCI domain-device relationship */ -- 1.5.1
0004-iommu-coherency.patch
Description: 0004-iommu-coherency.patch