Taking out complete function defination to lib/iommu-helper.c from arch/arm/mm/dma-mapping.c
Signed-off-by: Ritesh Harjani <[email protected]> --- arch/arm/mm/dma-mapping.c | 38 ++++---------------------------------- include/linux/iommu-helper.h | 2 ++ lib/iommu-helper.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index ae301c8e..331465e 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -1143,39 +1143,6 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, } /* - * Create a CPU mapping for a specified pages - */ -static void * -__iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot, - const void *caller) -{ - unsigned int i, nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; - struct vm_struct *area; - unsigned long p; - - area = get_vm_area_caller(size, VM_ARM_DMA_CONSISTENT | VM_USERMAP, - caller); - if (!area) - return NULL; - - area->pages = pages; - area->nr_pages = nr_pages; - p = (unsigned long)area->addr; - - for (i = 0; i < nr_pages; i++) { - phys_addr_t phys = __pfn_to_phys(page_to_pfn(pages[i])); - if (ioremap_page_range(p, p + PAGE_SIZE, phys, prot)) - goto err; - p += PAGE_SIZE; - } - return area->addr; -err: - unmap_kernel_range((unsigned long)area->addr, size); - vunmap(area->addr); - return NULL; -} - -/* * Create a mapping in device IO address space for specified pages */ static dma_addr_t @@ -1263,6 +1230,7 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL); struct page **pages; void *addr = NULL; + unsigned long flags = 0; *handle = DMA_ERROR_CODE; size = PAGE_ALIGN(size); @@ -1290,7 +1258,9 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) return pages; - addr = __iommu_alloc_remap(pages, size, gfp, prot, + flags = VM_ARM_DMA_CONSISTENT | VM_USERMAP; + + addr = iommu_alloc_remap(pages, size, flags, prot, __builtin_return_address(0)); if (!addr) goto err_mapping; diff --git a/include/linux/iommu-helper.h b/include/linux/iommu-helper.h index d580508..52dde70 100644 --- a/include/linux/iommu-helper.h +++ b/include/linux/iommu-helper.h @@ -43,5 +43,7 @@ extern dma_addr_t iommu_mapper(struct iommu_domain *domain, extern void iommu_unmapper(struct iommu_domain *domain, dma_addr_t iova, size_t size); +extern void *iommu_alloc_remap(struct page **pages, size_t size, unsigned long + flags, pgprot_t prot, const void *caller); #endif diff --git a/lib/iommu-helper.c b/lib/iommu-helper.c index b6ea51b..ae4f0d6 100644 --- a/lib/iommu-helper.c +++ b/lib/iommu-helper.c @@ -176,3 +176,36 @@ void iommu_unmapper(struct iommu_domain *domain, dma_addr_t iova, size_t size) iommu_unmap(domain, iova, size); } + +/* + * Create a CPU mapping for a specified pages + */ +void * +iommu_alloc_remap(struct page **pages, size_t size, unsigned long flags, + pgprot_t prot, const void *caller) +{ + unsigned int i, nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; + struct vm_struct *area; + unsigned long p; + + area = get_vm_area_caller(size, flags, caller); + + if (!area) + return NULL; + + area->pages = pages; + area->nr_pages = nr_pages; + p = (unsigned long)area->addr; + + for (i = 0; i < nr_pages; i++) { + phys_addr_t phys = __pfn_to_phys(page_to_pfn(pages[i])); + if (ioremap_page_range(p, p + PAGE_SIZE, phys, prot)) + goto err; + p += PAGE_SIZE; + } + return area->addr; +err: + unmap_kernel_range((unsigned long)area->addr, size); + vunmap(area->addr); + return NULL; +} -- 1.8.1.3 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
