Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69369f52 authored by Andrii Anisov's avatar Andrii Anisov Committed by Konrad Rzeszutek Wilk
Browse files

swiotlb-xen: implement xen_swiotlb_get_sgtable callback

parent 7e91c7df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ static struct dma_map_ops xen_swiotlb_dma_ops = {
	.dma_supported = xen_swiotlb_dma_supported,
	.set_dma_mask = xen_swiotlb_set_dma_mask,
	.mmap = xen_swiotlb_dma_mmap,
	.get_sgtable = xen_swiotlb_get_sgtable,
};

int __init xen_mm_init(void)
+28 −0
Original line number Diff line number Diff line
@@ -699,3 +699,31 @@ xen_swiotlb_dma_mmap(struct device *dev, struct vm_area_struct *vma,
	return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
}
EXPORT_SYMBOL_GPL(xen_swiotlb_dma_mmap);

/*
 * This function should be called with the pages from the current domain only,
 * passing pages mapped from other domains would lead to memory corruption.
 */
int
xen_swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
			void *cpu_addr, dma_addr_t handle, size_t size,
			unsigned long attrs)
{
#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
	if (__generic_dma_ops(dev)->get_sgtable) {
#if 0
	/*
	 * This check verifies that the page belongs to the current domain and
	 * is not one mapped from another domain.
	 * This check is for debug only, and should not go to production build
	 */
		unsigned long bfn = PHYS_PFN(dma_to_phys(dev, handle));
		BUG_ON (!page_is_ram(bfn));
#endif
		return __generic_dma_ops(dev)->get_sgtable(dev, sgt, cpu_addr,
							   handle, size, attrs);
	}
#endif
	return dma_common_get_sgtable(dev, sgt, cpu_addr, handle, size);
}
EXPORT_SYMBOL_GPL(xen_swiotlb_get_sgtable);
+6 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
#define __LINUX_SWIOTLB_XEN_H

#include <linux/dma-direction.h>
#include <linux/scatterlist.h>
#include <linux/swiotlb.h>

extern int xen_swiotlb_init(int verbose, bool early);
@@ -60,4 +61,9 @@ extern int
xen_swiotlb_dma_mmap(struct device *dev, struct vm_area_struct *vma,
		     void *cpu_addr, dma_addr_t dma_addr, size_t size,
		     unsigned long attrs);

extern int
xen_swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
			void *cpu_addr, dma_addr_t handle, size_t size,
			unsigned long attrs);
#endif /* __LINUX_SWIOTLB_XEN_H */