diff options
author | Liam Mark <lmark@codeaurora.org> | 2016-12-09 14:39:04 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-01-04 14:18:33 -0800 |
commit | cca053110c719c2e6f0756797173951da1dab5a6 (patch) | |
tree | 070d99bb7c48d36c5852bcc89d21e2b5df56e2b8 | |
parent | 90d80a06deede1b9d3e857bd26c15d2bc05850ca (diff) |
iommu/arm-smmu: support querying IOVA coherency
Support querying whether an IOVA is mapped as coherent.
Change-Id: I7dee5c80783ebc4449eb096ed603f36d8b0636ee
Signed-off-by: Liam Mark <lmark@codeaurora.org>
-rw-r--r-- | drivers/iommu/arm-smmu.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 791f2fe70236..582261d5aa17 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -530,6 +530,8 @@ static bool arm_smmu_is_master_side_secure(struct arm_smmu_domain *smmu_domain); static bool arm_smmu_is_static_cb(struct arm_smmu_device *smmu); static bool arm_smmu_is_slave_side_secure(struct arm_smmu_domain *smmu_domain); static bool arm_smmu_has_secure_vmid(struct arm_smmu_domain *smmu_domain); +static bool arm_smmu_is_iova_coherent(struct iommu_domain *domain, + dma_addr_t iova); static int arm_smmu_enable_s1_translations(struct arm_smmu_domain *smmu_domain); @@ -2664,6 +2666,23 @@ static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain, return ret; } +static bool arm_smmu_is_iova_coherent(struct iommu_domain *domain, + dma_addr_t iova) +{ + bool ret; + unsigned long flags; + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + struct io_pgtable_ops *ops = smmu_domain->pgtbl_ops; + + if (!ops) + return false; + + flags = arm_smmu_pgtbl_lock(smmu_domain); + ret = ops->is_iova_coherent(ops, iova); + arm_smmu_pgtbl_unlock(smmu_domain, flags); + return ret; +} + static int arm_smmu_wait_for_halt(struct arm_smmu_device *smmu) { void __iomem *impl_def1_base = ARM_SMMU_IMPL_DEF1(smmu); @@ -3311,6 +3330,7 @@ static struct iommu_ops arm_smmu_ops = { .tlbi_domain = arm_smmu_tlbi_domain, .enable_config_clocks = arm_smmu_enable_config_clocks, .disable_config_clocks = arm_smmu_disable_config_clocks, + .is_iova_coherent = arm_smmu_is_iova_coherent, }; static void arm_smmu_device_reset(struct arm_smmu_device *smmu) |