diff options
author | Will Deacon <will@kernel.org> | 2019-07-02 16:43:57 +0100 |
---|---|---|
committer | Will Deacon <will@kernel.org> | 2019-07-24 13:35:27 +0100 |
commit | 4fcf8544fc677fc8af135f1d86b3ba69c4ad429d (patch) | |
tree | 172f536ba5c9db2f4b79e679f49499a4efba0b8a | |
parent | a7d20dc19d9ea7012227be5144353012ffa3ddc4 (diff) | |
download | linux-4fcf8544fc677fc8af135f1d86b3ba69c4ad429d.tar.gz linux-4fcf8544fc677fc8af135f1d86b3ba69c4ad429d.tar.bz2 linux-4fcf8544fc677fc8af135f1d86b3ba69c4ad429d.zip |
iommu: Introduce iommu_iotlb_gather_add_page()
Introduce a helper function for drivers to use when updating an
iommu_iotlb_gather structure in response to an ->unmap() call, rather
than having to open-code the logic in every page-table implementation.
Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r-- | include/linux/iommu.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index aaf073010a9a..ad41aee55bc6 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -507,6 +507,31 @@ static inline void iommu_tlb_sync(struct iommu_domain *domain, iommu_iotlb_gather_init(iotlb_gather); } +static inline void iommu_iotlb_gather_add_page(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather, + unsigned long iova, size_t size) +{ + unsigned long start = iova, end = start + size; + + /* + * If the new page is disjoint from the current range or is mapped at + * a different granularity, then sync the TLB so that the gather + * structure can be rewritten. + */ + if (gather->pgsize != size || + end < gather->start || start > gather->end) { + if (gather->pgsize) + iommu_tlb_sync(domain, gather); + gather->pgsize = size; + } + + if (gather->end < end) + gather->end = end; + + if (gather->start > start) + gather->start = start; +} + /* PCI device grouping function */ extern struct iommu_group *pci_device_group(struct device *dev); /* Generic device grouping function */ @@ -847,6 +872,12 @@ static inline void iommu_iotlb_gather_init(struct iommu_iotlb_gather *gather) { } +static inline void iommu_iotlb_gather_add_page(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather, + unsigned long iova, size_t size) +{ +} + static inline void iommu_device_unregister(struct iommu_device *iommu) { } |