summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi Doyu <hdoyu@nvidia.com>2013-04-03 15:51:20 +0300
committerHarshada Kale <hkale@nvidia.com>2013-06-10 03:52:41 -0700
commitf0d8332c315611b18a3a2534b20061eb2786c235 (patch)
tree43fd6fcc5868e7e1ab26b596d1c142a841719b2f
parent93e0205afe3e9a9b4e28c955d446d011a036a272 (diff)
ARM: dma-mapping: Add new API dma_ops->map_pages()
Add new API dma_ops->map_pages() for performance bug 1286500 Change-Id: Ib8bbcad53024225173be765358af03d0961f8af0 (cherry picked from commit 1e3b6ee46a5defaa8e1fcc97fc5d9b619c481c41) Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com> Reviewed-on: http://git-master/r/234137 Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
-rw-r--r--arch/arm/mm/dma-mapping.c24
-rw-r--r--include/linux/dma-mapping.h5
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 2f3cbcdeabcd..c0c8a1a69c09 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -1734,6 +1734,29 @@ static dma_addr_t arm_iommu_map_page_at(struct device *dev, struct page *page,
return dma_addr + offset;
}
+static dma_addr_t arm_iommu_map_pages(struct device *dev, struct page **pages,
+ dma_addr_t dma_handle, size_t count,
+ enum dma_data_direction dir,
+ struct dma_attrs *attrs)
+{
+ struct dma_iommu_mapping *mapping = dev->archdata.mapping;
+ int ret;
+
+ if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) {
+ int i;
+
+ for (i = 0; i < count; i++)
+ __dma_page_cpu_to_dev(pages[i], 0, PAGE_SIZE, dir);
+ }
+
+ ret = iommu_map_pages(mapping->domain, dma_handle, pages, count, 0);
+ if (ret < 0)
+ return DMA_ERROR_CODE;
+
+ return dma_handle;
+}
+
+
/**
* arm_coherent_iommu_unmap_page
* @dev: valid struct device pointer
@@ -1834,6 +1857,7 @@ struct dma_map_ops iommu_ops = {
.get_sgtable = arm_iommu_get_sgtable,
.map_page = arm_iommu_map_page,
+ .map_pages = arm_iommu_map_pages,
.map_page_at = arm_iommu_map_page_at,
.unmap_page = arm_iommu_unmap_page,
.sync_single_for_cpu = arm_iommu_sync_single_for_cpu,
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 218bee3eba01..cbed39df4c0a 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -26,6 +26,11 @@ struct dma_map_ops {
enum dma_data_direction dir,
struct dma_attrs *attrs);
+ dma_addr_t (*map_pages)(struct device *dev, struct page **pages,
+ dma_addr_t dma_handle, size_t count,
+ enum dma_data_direction dir,
+ struct dma_attrs *attrs);
+
dma_addr_t (*map_page_at)(struct device *dev, struct page *page,
dma_addr_t dma_handle,
unsigned long offset, size_t size,