diff options
author | Will Deacon <will@kernel.org> | 2019-07-02 11:44:58 -0400 |
---|---|---|
committer | Will Deacon <will@kernel.org> | 2019-07-29 12:22:59 -0400 |
commit | a2d3a382d6c682e22b263c9e7f0d857c3fa6c9d6 (patch) | |
tree | 8bbc84b08b1faf47b95e595feceed1ab53f00d58 | |
parent | e953f7f2fa78d1c7fd064171f88457c6b1e21af9 (diff) |
iommu/io-pgtable: Pass struct iommu_iotlb_gather to ->unmap()
Update the io-pgtable ->unmap() function to take an iommu_iotlb_gather
pointer as an argument, and update the callers as appropriate.
Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 | ||||
-rw-r--r-- | drivers/iommu/arm-smmu-v3.c | 2 | ||||
-rw-r--r-- | drivers/iommu/arm-smmu.c | 2 | ||||
-rw-r--r-- | drivers/iommu/io-pgtable-arm-v7s.c | 6 | ||||
-rw-r--r-- | drivers/iommu/io-pgtable-arm.c | 7 | ||||
-rw-r--r-- | drivers/iommu/ipmmu-vmsa.c | 2 | ||||
-rw-r--r-- | drivers/iommu/msm_iommu.c | 2 | ||||
-rw-r--r-- | drivers/iommu/mtk_iommu.c | 2 | ||||
-rw-r--r-- | drivers/iommu/qcom_iommu.c | 2 | ||||
-rw-r--r-- | include/linux/io-pgtable.h | 4 |
10 files changed, 16 insertions, 15 deletions
diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panfrost/panfrost_mmu.c index de22a2276e00..6e8145c36e93 100644 --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c | |||
@@ -222,7 +222,7 @@ void panfrost_mmu_unmap(struct panfrost_gem_object *bo) | |||
222 | size_t unmapped_page; | 222 | size_t unmapped_page; |
223 | size_t pgsize = get_pgsize(iova, len - unmapped_len); | 223 | size_t pgsize = get_pgsize(iova, len - unmapped_len); |
224 | 224 | ||
225 | unmapped_page = ops->unmap(ops, iova, pgsize); | 225 | unmapped_page = ops->unmap(ops, iova, pgsize, NULL); |
226 | if (!unmapped_page) | 226 | if (!unmapped_page) |
227 | break; | 227 | break; |
228 | 228 | ||
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 231093413ff9..8e2e53079f48 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c | |||
@@ -2015,7 +2015,7 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
2015 | if (!ops) | 2015 | if (!ops) |
2016 | return 0; | 2016 | return 0; |
2017 | 2017 | ||
2018 | ret = ops->unmap(ops, iova, size); | 2018 | ret = ops->unmap(ops, iova, size, gather); |
2019 | if (ret && arm_smmu_atc_inv_domain(smmu_domain, 0, iova, size)) | 2019 | if (ret && arm_smmu_atc_inv_domain(smmu_domain, 0, iova, size)) |
2020 | return 0; | 2020 | return 0; |
2021 | 2021 | ||
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 07a267c437d6..f6689956ab6e 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -1362,7 +1362,7 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
1362 | return 0; | 1362 | return 0; |
1363 | 1363 | ||
1364 | arm_smmu_rpm_get(smmu); | 1364 | arm_smmu_rpm_get(smmu); |
1365 | ret = ops->unmap(ops, iova, size); | 1365 | ret = ops->unmap(ops, iova, size, gather); |
1366 | arm_smmu_rpm_put(smmu); | 1366 | arm_smmu_rpm_put(smmu); |
1367 | 1367 | ||
1368 | return ret; | 1368 | return ret; |
diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c index 203894fb6765..a7776e982b6c 100644 --- a/drivers/iommu/io-pgtable-arm-v7s.c +++ b/drivers/iommu/io-pgtable-arm-v7s.c | |||
@@ -666,7 +666,7 @@ static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable *data, | |||
666 | } | 666 | } |
667 | 667 | ||
668 | static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova, | 668 | static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova, |
669 | size_t size) | 669 | size_t size, struct iommu_iotlb_gather *gather) |
670 | { | 670 | { |
671 | struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops); | 671 | struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops); |
672 | 672 | ||
@@ -892,7 +892,7 @@ static int __init arm_v7s_do_selftests(void) | |||
892 | size = 1UL << __ffs(cfg.pgsize_bitmap); | 892 | size = 1UL << __ffs(cfg.pgsize_bitmap); |
893 | while (i < loopnr) { | 893 | while (i < loopnr) { |
894 | iova_start = i * SZ_16M; | 894 | iova_start = i * SZ_16M; |
895 | if (ops->unmap(ops, iova_start + size, size) != size) | 895 | if (ops->unmap(ops, iova_start + size, size, NULL) != size) |
896 | return __FAIL(ops); | 896 | return __FAIL(ops); |
897 | 897 | ||
898 | /* Remap of partial unmap */ | 898 | /* Remap of partial unmap */ |
@@ -910,7 +910,7 @@ static int __init arm_v7s_do_selftests(void) | |||
910 | for_each_set_bit(i, &cfg.pgsize_bitmap, BITS_PER_LONG) { | 910 | for_each_set_bit(i, &cfg.pgsize_bitmap, BITS_PER_LONG) { |
911 | size = 1UL << i; | 911 | size = 1UL << i; |
912 | 912 | ||
913 | if (ops->unmap(ops, iova, size) != size) | 913 | if (ops->unmap(ops, iova, size, NULL) != size) |
914 | return __FAIL(ops); | 914 | return __FAIL(ops); |
915 | 915 | ||
916 | if (ops->iova_to_phys(ops, iova + 42)) | 916 | if (ops->iova_to_phys(ops, iova + 42)) |
diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index f35516744965..325430f8a0a1 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/atomic.h> | 12 | #include <linux/atomic.h> |
13 | #include <linux/bitops.h> | 13 | #include <linux/bitops.h> |
14 | #include <linux/io-pgtable.h> | 14 | #include <linux/io-pgtable.h> |
15 | #include <linux/iommu.h> | ||
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/sizes.h> | 16 | #include <linux/sizes.h> |
18 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
@@ -642,7 +641,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, | |||
642 | } | 641 | } |
643 | 642 | ||
644 | static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova, | 643 | static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova, |
645 | size_t size) | 644 | size_t size, struct iommu_iotlb_gather *gather) |
646 | { | 645 | { |
647 | struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); | 646 | struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops); |
648 | arm_lpae_iopte *ptep = data->pgd; | 647 | arm_lpae_iopte *ptep = data->pgd; |
@@ -1167,7 +1166,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg) | |||
1167 | 1166 | ||
1168 | /* Partial unmap */ | 1167 | /* Partial unmap */ |
1169 | size = 1UL << __ffs(cfg->pgsize_bitmap); | 1168 | size = 1UL << __ffs(cfg->pgsize_bitmap); |
1170 | if (ops->unmap(ops, SZ_1G + size, size) != size) | 1169 | if (ops->unmap(ops, SZ_1G + size, size, NULL) != size) |
1171 | return __FAIL(ops, i); | 1170 | return __FAIL(ops, i); |
1172 | 1171 | ||
1173 | /* Remap of partial unmap */ | 1172 | /* Remap of partial unmap */ |
@@ -1182,7 +1181,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg) | |||
1182 | for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) { | 1181 | for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) { |
1183 | size = 1UL << j; | 1182 | size = 1UL << j; |
1184 | 1183 | ||
1185 | if (ops->unmap(ops, iova, size) != size) | 1184 | if (ops->unmap(ops, iova, size, NULL) != size) |
1186 | return __FAIL(ops, i); | 1185 | return __FAIL(ops, i); |
1187 | 1186 | ||
1188 | if (ops->iova_to_phys(ops, iova + 42)) | 1187 | if (ops->iova_to_phys(ops, iova + 42)) |
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index a2b8eff4c1f7..76a8ec343d53 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c | |||
@@ -737,7 +737,7 @@ static size_t ipmmu_unmap(struct iommu_domain *io_domain, unsigned long iova, | |||
737 | { | 737 | { |
738 | struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain); | 738 | struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain); |
739 | 739 | ||
740 | return domain->iop->unmap(domain->iop, iova, size); | 740 | return domain->iop->unmap(domain->iop, iova, size, gather); |
741 | } | 741 | } |
742 | 742 | ||
743 | static void ipmmu_flush_iotlb_all(struct iommu_domain *io_domain) | 743 | static void ipmmu_flush_iotlb_all(struct iommu_domain *io_domain) |
diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c index ccfc7ed230ef..8a0dcaf0a9e9 100644 --- a/drivers/iommu/msm_iommu.c +++ b/drivers/iommu/msm_iommu.c | |||
@@ -523,7 +523,7 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
523 | unsigned long flags; | 523 | unsigned long flags; |
524 | 524 | ||
525 | spin_lock_irqsave(&priv->pgtlock, flags); | 525 | spin_lock_irqsave(&priv->pgtlock, flags); |
526 | len = priv->iop->unmap(priv->iop, iova, len); | 526 | len = priv->iop->unmap(priv->iop, iova, len, gather); |
527 | spin_unlock_irqrestore(&priv->pgtlock, flags); | 527 | spin_unlock_irqrestore(&priv->pgtlock, flags); |
528 | 528 | ||
529 | return len; | 529 | return len; |
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 3785750bdb44..b73cffd63262 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c | |||
@@ -400,7 +400,7 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain, | |||
400 | size_t unmapsz; | 400 | size_t unmapsz; |
401 | 401 | ||
402 | spin_lock_irqsave(&dom->pgtlock, flags); | 402 | spin_lock_irqsave(&dom->pgtlock, flags); |
403 | unmapsz = dom->iop->unmap(dom->iop, iova, size); | 403 | unmapsz = dom->iop->unmap(dom->iop, iova, size, gather); |
404 | spin_unlock_irqrestore(&dom->pgtlock, flags); | 404 | spin_unlock_irqrestore(&dom->pgtlock, flags); |
405 | 405 | ||
406 | return unmapsz; | 406 | return unmapsz; |
diff --git a/drivers/iommu/qcom_iommu.c b/drivers/iommu/qcom_iommu.c index 0b8a6d6bb475..48b288ef74b4 100644 --- a/drivers/iommu/qcom_iommu.c +++ b/drivers/iommu/qcom_iommu.c | |||
@@ -455,7 +455,7 @@ static size_t qcom_iommu_unmap(struct iommu_domain *domain, unsigned long iova, | |||
455 | */ | 455 | */ |
456 | pm_runtime_get_sync(qcom_domain->iommu->dev); | 456 | pm_runtime_get_sync(qcom_domain->iommu->dev); |
457 | spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags); | 457 | spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags); |
458 | ret = ops->unmap(ops, iova, size); | 458 | ret = ops->unmap(ops, iova, size, gather); |
459 | spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags); | 459 | spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags); |
460 | pm_runtime_put_sync(qcom_domain->iommu->dev); | 460 | pm_runtime_put_sync(qcom_domain->iommu->dev); |
461 | 461 | ||
diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index 843310484fe2..fe27d93c8ad9 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h | |||
@@ -1,7 +1,9 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __IO_PGTABLE_H | 2 | #ifndef __IO_PGTABLE_H |
3 | #define __IO_PGTABLE_H | 3 | #define __IO_PGTABLE_H |
4 | |||
4 | #include <linux/bitops.h> | 5 | #include <linux/bitops.h> |
6 | #include <linux/iommu.h> | ||
5 | 7 | ||
6 | /* | 8 | /* |
7 | * Public API for use by IOMMU drivers | 9 | * Public API for use by IOMMU drivers |
@@ -136,7 +138,7 @@ struct io_pgtable_ops { | |||
136 | int (*map)(struct io_pgtable_ops *ops, unsigned long iova, | 138 | int (*map)(struct io_pgtable_ops *ops, unsigned long iova, |
137 | phys_addr_t paddr, size_t size, int prot); | 139 | phys_addr_t paddr, size_t size, int prot); |
138 | size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova, | 140 | size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova, |
139 | size_t size); | 141 | size_t size, struct iommu_iotlb_gather *gather); |
140 | phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops, | 142 | phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops, |
141 | unsigned long iova); | 143 | unsigned long iova); |
142 | }; | 144 | }; |