diff options
| -rw-r--r-- | drivers/iommu/intel-iommu.c | 26 |
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 */ | ||
| 1610 | static 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 | |||
| 1609 | static void iommu_flush_iova(struct iova_domain *iovad) | 1621 | static 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 | } |
