diff options
author | Hiroshi Doyu <hdoyu@nvidia.com> | 2013-04-03 15:51:20 +0300 |
---|---|---|
committer | Harshada Kale <hkale@nvidia.com> | 2013-06-10 03:52:41 -0700 |
commit | f0d8332c315611b18a3a2534b20061eb2786c235 (patch) | |
tree | 43fd6fcc5868e7e1ab26b596d1c142a841719b2f | |
parent | 93e0205afe3e9a9b4e28c955d446d011a036a272 (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.c | 24 | ||||
-rw-r--r-- | include/linux/dma-mapping.h | 5 |
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, |