Skip to content

Commit 079c03f

Browse files
Stefano Stabellinigregkh
authored andcommitted
swiotlb-xen: implement xen_swiotlb_dma_mmap callback
commit 7e91c7df29b5e196de3dc6f086c8937973bd0b88 upstream. This function creates userspace mapping for the DMA-coherent memory. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com> Signed-off-by: Andrii Anisov <andrii_anisov@epam.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 27323cb commit 079c03f

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

arch/arm/xen/mm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ static struct dma_map_ops xen_swiotlb_dma_ops = {
199199
.unmap_page = xen_swiotlb_unmap_page,
200200
.dma_supported = xen_swiotlb_dma_supported,
201201
.set_dma_mask = xen_swiotlb_set_dma_mask,
202+
.mmap = xen_swiotlb_dma_mmap,
202203
};
203204

204205
int __init xen_mm_init(void)

drivers/xen/swiotlb-xen.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,22 @@ xen_swiotlb_set_dma_mask(struct device *dev, u64 dma_mask)
680680
return 0;
681681
}
682682
EXPORT_SYMBOL_GPL(xen_swiotlb_set_dma_mask);
683+
684+
/*
685+
* Create userspace mapping for the DMA-coherent memory.
686+
* This function should be called with the pages from the current domain only,
687+
* passing pages mapped from other domains would lead to memory corruption.
688+
*/
689+
int
690+
xen_swiotlb_dma_mmap(struct device *dev, struct vm_area_struct *vma,
691+
void *cpu_addr, dma_addr_t dma_addr, size_t size,
692+
unsigned long attrs)
693+
{
694+
#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
695+
if (__generic_dma_ops(dev)->mmap)
696+
return __generic_dma_ops(dev)->mmap(dev, vma, cpu_addr,
697+
dma_addr, size, attrs);
698+
#endif
699+
return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
700+
}
701+
EXPORT_SYMBOL_GPL(xen_swiotlb_dma_mmap);

include/xen/swiotlb-xen.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,9 @@ xen_swiotlb_dma_supported(struct device *hwdev, u64 mask);
5858

5959
extern int
6060
xen_swiotlb_set_dma_mask(struct device *dev, u64 dma_mask);
61+
62+
extern int
63+
xen_swiotlb_dma_mmap(struct device *dev, struct vm_area_struct *vma,
64+
void *cpu_addr, dma_addr_t dma_addr, size_t size,
65+
unsigned long attrs);
6166
#endif /* __LINUX_SWIOTLB_XEN_H */

0 commit comments

Comments
 (0)