summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWill Deacon <will@kernel.org>2019-07-02 11:44:58 -0400
committerWill Deacon <will@kernel.org>2019-07-29 12:22:59 -0400
commita2d3a382d6c682e22b263c9e7f0d857c3fa6c9d6 (patch)
tree8bbc84b08b1faf47b95e595feceed1ab53f00d58
parente953f7f2fa78d1c7fd064171f88457c6b1e21af9 (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.c2
-rw-r--r--drivers/iommu/arm-smmu-v3.c2
-rw-r--r--drivers/iommu/arm-smmu.c2
-rw-r--r--drivers/iommu/io-pgtable-arm-v7s.c6
-rw-r--r--drivers/iommu/io-pgtable-arm.c7
-rw-r--r--drivers/iommu/ipmmu-vmsa.c2
-rw-r--r--drivers/iommu/msm_iommu.c2
-rw-r--r--drivers/iommu/mtk_iommu.c2
-rw-r--r--drivers/iommu/qcom_iommu.c2
-rw-r--r--include/linux/io-pgtable.h4
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
668static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova, 668static 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
644static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova, 643static 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
743static void ipmmu_flush_iotlb_all(struct iommu_domain *io_domain) 743static 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};