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>
This commit is contained in:
Родитель
e953f7f2fa
Коммит
a2d3a382d6
|
@ -222,7 +222,7 @@ void panfrost_mmu_unmap(struct panfrost_gem_object *bo)
|
||||||
size_t unmapped_page;
|
size_t unmapped_page;
|
||||||
size_t pgsize = get_pgsize(iova, len - unmapped_len);
|
size_t pgsize = get_pgsize(iova, len - unmapped_len);
|
||||||
|
|
||||||
unmapped_page = ops->unmap(ops, iova, pgsize);
|
unmapped_page = ops->unmap(ops, iova, pgsize, NULL);
|
||||||
if (!unmapped_page)
|
if (!unmapped_page)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -2015,7 +2015,7 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
|
||||||
if (!ops)
|
if (!ops)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = ops->unmap(ops, iova, size);
|
ret = ops->unmap(ops, iova, size, gather);
|
||||||
if (ret && arm_smmu_atc_inv_domain(smmu_domain, 0, iova, size))
|
if (ret && arm_smmu_atc_inv_domain(smmu_domain, 0, iova, size))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -1362,7 +1362,7 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
arm_smmu_rpm_get(smmu);
|
arm_smmu_rpm_get(smmu);
|
||||||
ret = ops->unmap(ops, iova, size);
|
ret = ops->unmap(ops, iova, size, gather);
|
||||||
arm_smmu_rpm_put(smmu);
|
arm_smmu_rpm_put(smmu);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -666,7 +666,7 @@ static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova,
|
static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
size_t size)
|
size_t size, struct iommu_iotlb_gather *gather)
|
||||||
{
|
{
|
||||||
struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
||||||
|
|
||||||
|
@ -892,7 +892,7 @@ static int __init arm_v7s_do_selftests(void)
|
||||||
size = 1UL << __ffs(cfg.pgsize_bitmap);
|
size = 1UL << __ffs(cfg.pgsize_bitmap);
|
||||||
while (i < loopnr) {
|
while (i < loopnr) {
|
||||||
iova_start = i * SZ_16M;
|
iova_start = i * SZ_16M;
|
||||||
if (ops->unmap(ops, iova_start + size, size) != size)
|
if (ops->unmap(ops, iova_start + size, size, NULL) != size)
|
||||||
return __FAIL(ops);
|
return __FAIL(ops);
|
||||||
|
|
||||||
/* Remap of partial unmap */
|
/* Remap of partial unmap */
|
||||||
|
@ -910,7 +910,7 @@ static int __init arm_v7s_do_selftests(void)
|
||||||
for_each_set_bit(i, &cfg.pgsize_bitmap, BITS_PER_LONG) {
|
for_each_set_bit(i, &cfg.pgsize_bitmap, BITS_PER_LONG) {
|
||||||
size = 1UL << i;
|
size = 1UL << i;
|
||||||
|
|
||||||
if (ops->unmap(ops, iova, size) != size)
|
if (ops->unmap(ops, iova, size, NULL) != size)
|
||||||
return __FAIL(ops);
|
return __FAIL(ops);
|
||||||
|
|
||||||
if (ops->iova_to_phys(ops, iova + 42))
|
if (ops->iova_to_phys(ops, iova + 42))
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/io-pgtable.h>
|
#include <linux/io-pgtable.h>
|
||||||
#include <linux/iommu.h>
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sizes.h>
|
#include <linux/sizes.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -642,7 +641,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova,
|
static size_t arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
size_t size)
|
size_t size, struct iommu_iotlb_gather *gather)
|
||||||
{
|
{
|
||||||
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(ops);
|
||||||
arm_lpae_iopte *ptep = data->pgd;
|
arm_lpae_iopte *ptep = data->pgd;
|
||||||
|
@ -1167,7 +1166,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
|
||||||
|
|
||||||
/* Partial unmap */
|
/* Partial unmap */
|
||||||
size = 1UL << __ffs(cfg->pgsize_bitmap);
|
size = 1UL << __ffs(cfg->pgsize_bitmap);
|
||||||
if (ops->unmap(ops, SZ_1G + size, size) != size)
|
if (ops->unmap(ops, SZ_1G + size, size, NULL) != size)
|
||||||
return __FAIL(ops, i);
|
return __FAIL(ops, i);
|
||||||
|
|
||||||
/* Remap of partial unmap */
|
/* Remap of partial unmap */
|
||||||
|
@ -1182,7 +1181,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
|
||||||
for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) {
|
for_each_set_bit(j, &cfg->pgsize_bitmap, BITS_PER_LONG) {
|
||||||
size = 1UL << j;
|
size = 1UL << j;
|
||||||
|
|
||||||
if (ops->unmap(ops, iova, size) != size)
|
if (ops->unmap(ops, iova, size, NULL) != size)
|
||||||
return __FAIL(ops, i);
|
return __FAIL(ops, i);
|
||||||
|
|
||||||
if (ops->iova_to_phys(ops, iova + 42))
|
if (ops->iova_to_phys(ops, iova + 42))
|
||||||
|
|
|
@ -737,7 +737,7 @@ static size_t ipmmu_unmap(struct iommu_domain *io_domain, unsigned long iova,
|
||||||
{
|
{
|
||||||
struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
|
struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
|
||||||
|
|
||||||
return domain->iop->unmap(domain->iop, iova, size);
|
return domain->iop->unmap(domain->iop, iova, size, gather);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipmmu_flush_iotlb_all(struct iommu_domain *io_domain)
|
static void ipmmu_flush_iotlb_all(struct iommu_domain *io_domain)
|
||||||
|
|
|
@ -523,7 +523,7 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long iova,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->pgtlock, flags);
|
spin_lock_irqsave(&priv->pgtlock, flags);
|
||||||
len = priv->iop->unmap(priv->iop, iova, len);
|
len = priv->iop->unmap(priv->iop, iova, len, gather);
|
||||||
spin_unlock_irqrestore(&priv->pgtlock, flags);
|
spin_unlock_irqrestore(&priv->pgtlock, flags);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|
|
@ -400,7 +400,7 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain,
|
||||||
size_t unmapsz;
|
size_t unmapsz;
|
||||||
|
|
||||||
spin_lock_irqsave(&dom->pgtlock, flags);
|
spin_lock_irqsave(&dom->pgtlock, flags);
|
||||||
unmapsz = dom->iop->unmap(dom->iop, iova, size);
|
unmapsz = dom->iop->unmap(dom->iop, iova, size, gather);
|
||||||
spin_unlock_irqrestore(&dom->pgtlock, flags);
|
spin_unlock_irqrestore(&dom->pgtlock, flags);
|
||||||
|
|
||||||
return unmapsz;
|
return unmapsz;
|
||||||
|
|
|
@ -455,7 +455,7 @@ static size_t qcom_iommu_unmap(struct iommu_domain *domain, unsigned long iova,
|
||||||
*/
|
*/
|
||||||
pm_runtime_get_sync(qcom_domain->iommu->dev);
|
pm_runtime_get_sync(qcom_domain->iommu->dev);
|
||||||
spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags);
|
spin_lock_irqsave(&qcom_domain->pgtbl_lock, flags);
|
||||||
ret = ops->unmap(ops, iova, size);
|
ret = ops->unmap(ops, iova, size, gather);
|
||||||
spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags);
|
spin_unlock_irqrestore(&qcom_domain->pgtbl_lock, flags);
|
||||||
pm_runtime_put_sync(qcom_domain->iommu->dev);
|
pm_runtime_put_sync(qcom_domain->iommu->dev);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
#ifndef __IO_PGTABLE_H
|
#ifndef __IO_PGTABLE_H
|
||||||
#define __IO_PGTABLE_H
|
#define __IO_PGTABLE_H
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/iommu.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Public API for use by IOMMU drivers
|
* Public API for use by IOMMU drivers
|
||||||
|
@ -136,7 +138,7 @@ struct io_pgtable_ops {
|
||||||
int (*map)(struct io_pgtable_ops *ops, unsigned long iova,
|
int (*map)(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
phys_addr_t paddr, size_t size, int prot);
|
phys_addr_t paddr, size_t size, int prot);
|
||||||
size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova,
|
size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova,
|
||||||
size_t size);
|
size_t size, struct iommu_iotlb_gather *gather);
|
||||||
phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
|
phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
|
||||||
unsigned long iova);
|
unsigned long iova);
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче