From 90d80a06deede1b9d3e857bd26c15d2bc05850ca Mon Sep 17 00:00:00 2001 From: Liam Mark Date: Fri, 9 Dec 2016 14:36:07 -0800 Subject: [PATCH] iommu: support querying IOVA coherency Support querying whether an IOVA is mapped as coherent. Change-Id: Icd122348e309495b09bcf77628aa1746f0255305 Signed-off-by: Liam Mark --- drivers/iommu/iommu.c | 7 +++++++ include/linux/iommu.h | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 8ab502d80270..a77a45088b9d 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -1336,6 +1336,13 @@ phys_addr_t iommu_iova_to_phys_hard(struct iommu_domain *domain, return domain->ops->iova_to_phys_hard(domain, iova); } +bool iommu_is_iova_coherent(struct iommu_domain *domain, dma_addr_t iova) +{ + if (unlikely(domain->ops->is_iova_coherent == NULL)) + return 0; + + return domain->ops->is_iova_coherent(domain, iova); +} static unsigned long iommu_get_pgsize_bitmap(struct iommu_domain *domain) { if (domain->ops->get_pgsize_bitmap) diff --git a/include/linux/iommu.h b/include/linux/iommu.h index d33e10784b23..d7db6b2eeb52 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -237,6 +237,7 @@ struct iommu_ops { #endif unsigned long (*get_pgsize_bitmap)(struct iommu_domain *domain); + bool (*is_iova_coherent)(struct iommu_domain *domain, dma_addr_t iova); unsigned long pgsize_bitmap; void *priv; }; @@ -273,6 +274,8 @@ extern size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long io extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); extern phys_addr_t iommu_iova_to_phys_hard(struct iommu_domain *domain, dma_addr_t iova); +extern bool iommu_is_iova_coherent(struct iommu_domain *domain, + dma_addr_t iova); extern void iommu_set_fault_handler(struct iommu_domain *domain, iommu_fault_handler_t handler, void *token); extern void iommu_trigger_fault(struct iommu_domain *domain, @@ -505,6 +508,12 @@ static inline phys_addr_t iommu_iova_to_phys_hard(struct iommu_domain *domain, return 0; } +static inline bool iommu_is_iova_coherent(struct iommu_domain *domain, + dma_addr_t iova) +{ + return 0; +} + static inline void iommu_set_fault_handler(struct iommu_domain *domain, iommu_fault_handler_t handler, void *token) {