Add two new APIs for the dma coherent memory to get the base and size of the pool associated to a device.
Signed-off-by: Francesco Valla <[email protected]> --- include/linux/dma-map-ops.h | 10 ++++++++++ kernel/dma/coherent.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index 8fae2b7deb20..580b69321d56 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -156,6 +156,8 @@ 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); +size_t dma_dev_coherent_size(struct device *dev); +dma_addr_t dma_dev_coherent_base(struct device *dev); #else static inline int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, dma_addr_t device_addr, size_t size) @@ -167,6 +169,14 @@ static inline int dma_declare_coherent_memory(struct device *dev, #define dma_release_from_dev_coherent(dev, order, vaddr) (0) #define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0) static inline void dma_release_coherent_memory(struct device *dev) { } +static inline size_t dma_dev_coherent_size(struct device *dev) +{ + return 0; +} +static inline dma_addr_t dma_dev_coherent_base(struct device *dev) +{ + return DMA_MAPPING_ERROR; +} #endif /* CONFIG_DMA_DECLARE_COHERENT */ #ifdef CONFIG_DMA_GLOBAL_POOL diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c index 45bbae947f4b..f4aa5813604b 100644 --- a/kernel/dma/coherent.c +++ b/kernel/dma/coherent.c @@ -277,6 +277,40 @@ int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma, return __dma_mmap_from_coherent(mem, vma, vaddr, size, ret); } +/** + * dma_dev_coherent_size() - total size of the device coherent pool + * @dev: device from which we allocate memory + * + * Returns the total size of the coherent memory pool associated to the given + * device, or 0 in case of no pool. + */ +size_t dma_dev_coherent_size(struct device *dev) +{ + struct dma_coherent_mem *mem = dev_get_coherent_memory(dev); + + if (!mem) + return 0; + + return (mem->size << PAGE_SHIFT); +} + +/** + * dma_dev_coherent_base() - base address of the device coherent pool + * @dev: device from which we allocate memory + * + * Returns the base address of the coherent memory pool associated with the + * device, or DMA_MAPPING_ERROR in case of no pool. + */ +dma_addr_t dma_dev_coherent_base(struct device *dev) +{ + struct dma_coherent_mem *mem = dev_get_coherent_memory(dev); + + if (!mem) + return DMA_MAPPING_ERROR; + + return dma_get_device_base(dev, mem); +} + #ifdef CONFIG_DMA_GLOBAL_POOL static struct dma_coherent_mem *dma_coherent_default_memory __ro_after_init; -- 2.55.0

