[RFC PATCH v2 04/10] dma-coherent: Allow checking if allocation is from dev coherent region
Samiullah Khawaja <[email protected]>
| Newsgroups | org.infradead.lists.kexec,dev.linux.lists.iommu,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Add an API that allows if a DMA allocation is from device coherent region. Signed-off-by: Samiullah Khawaja <[email protected]> --- include/linux/dma-map-ops.h | 3 +++ kernel/dma/coherent.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index 9b91c839ceb5..b13e5eebe6d3 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -162,6 +162,7 @@ int dma_alloc_from_dev_coherent(struct device *dev, ssize_t size, int dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr); int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, size_t size, int *ret); +bool dma_is_from_dev_coherent(struct device *dev, void *vaddr); #else static inline int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, dma_addr_t device_addr, size_t size) @@ -172,6 +173,8 @@ static inline int dma_declare_coherent_memory(struct device *dev, #define dma_alloc_from_dev_coherent(dev, size, handle, ret) (0) #define dma_release_from_dev_coherent(dev, order, vaddr) (0) #define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0) +#define dma_is_from_dev_coherent(dev, vaddr) (false) + static inline void dma_release_coherent_memory(struct device *dev) { } #endif /* CONFIG_DMA_DECLARE_COHERENT */ diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index bcdc0f76d2e8..76cbe11e1f90 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -231,6 +231,17 @@ int dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr) return __dma_release_from_coherent(mem, order, vaddr); } +bool dma_is_from_dev_coherent(struct device *dev, void *vaddr) +{ + struct dma_coherent_mem *mem = dev_get_coherent_memory(dev); + + if (mem && vaddr >= mem->virt_base && vaddr < + (mem->virt_base + ((dma_addr_t)mem->size << PAGE_SHIFT))) + return true; + + return false; +} + static int __dma_mmap_from_coherent(struct dma_coherent_mem *mem, struct vm_area_struct *vma, void *vaddr, size_t size, int *ret) { -- 2.55.0.795.g602f6c329a-goog