aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/iommu/intel-iommu.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 749d8f235346..13190a54aba2 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1606,6 +1606,18 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,
1606 iommu_flush_dev_iotlb(domain, addr, mask); 1606 iommu_flush_dev_iotlb(domain, addr, mask);
1607} 1607}
1608 1608
1609/* Notification for newly created mappings */
1610static inline void __mapping_notify_one(struct intel_iommu *iommu,
1611 struct dmar_domain *domain,
1612 unsigned long pfn, unsigned int pages)
1613{
1614 /* It's a non-present to present mapping. Only flush if caching mode */
1615 if (cap_caching_mode(iommu->cap))
1616 iommu_flush_iotlb_psi(iommu, domain, pfn, pages, 0, 1);
1617 else
1618 iommu_flush_write_buffer(iommu);
1619}
1620
1609static void iommu_flush_iova(struct iova_domain *iovad) 1621static void iommu_flush_iova(struct iova_domain *iovad)
1610{ 1622{
1611 struct dmar_domain *domain; 1623 struct dmar_domain *domain;
@@ -3625,13 +3637,7 @@ static dma_addr_t __intel_map_single(struct device *dev, phys_addr_t paddr,
3625 if (ret) 3637 if (ret)
3626 goto error; 3638 goto error;
3627 3639
3628 /* it's a non-present to present mapping. Only flush if caching mode */ 3640 __mapping_notify_one(iommu, domain, mm_to_dma_pfn(iova_pfn), size);
3629 if (cap_caching_mode(iommu->cap))
3630 iommu_flush_iotlb_psi(iommu, domain,
3631 mm_to_dma_pfn(iova_pfn),
3632 size, 0, 1);
3633 else
3634 iommu_flush_write_buffer(iommu);
3635 3641
3636 start_paddr = (phys_addr_t)iova_pfn << PAGE_SHIFT; 3642 start_paddr = (phys_addr_t)iova_pfn << PAGE_SHIFT;
3637 start_paddr += paddr & ~PAGE_MASK; 3643 start_paddr += paddr & ~PAGE_MASK;
@@ -3819,11 +3825,7 @@ static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nele
3819 return 0; 3825 return 0;
3820 } 3826 }
3821 3827
3822 /* it's a non-present to present mapping. Only flush if caching mode */ 3828 __mapping_notify_one(iommu, domain, start_vpfn, size);
3823 if (cap_caching_mode(iommu->cap))
3824 iommu_flush_iotlb_psi(iommu, domain, start_vpfn, size, 0, 1);
3825 else
3826 iommu_flush_write_buffer(iommu);
3827 3829
3828 return nelems; 3830 return nelems;
3829} 3831}