diff options
| author | Marek Szyprowski <m.szyprowski@samsung.com> | 2012-06-14 13:03:04 +0200 | 
|---|---|---|
| committer | Marek Szyprowski <m.szyprowski@samsung.com> | 2012-07-30 12:25:46 +0200 | 
| commit | 64ccc9c033c6089b2d426dad3c56477ab066c999 (patch) | |
| tree | ffaec86ca326dfc83b78ce4005bf46c3ad98ceb9 /arch/powerpc/kernel/dma.c | |
| parent | 9fa8af91f0679f2abbebe1382b937264f3a8b981 (diff) | |
| download | olio-linux-3.10-64ccc9c033c6089b2d426dad3c56477ab066c999.tar.xz olio-linux-3.10-64ccc9c033c6089b2d426dad3c56477ab066c999.zip  | |
common: dma-mapping: add support for generic dma_mmap_* calls
Commit 9adc5374 ('common: dma-mapping: introduce mmap method') added a
generic method for implementing mmap user call to dma_map_ops structure.
This patch converts ARM and PowerPC architectures (the only providers of
dma_mmap_coherent/dma_mmap_writecombine calls) to use this generic
dma_map_ops based call and adds a generic cross architecture
definition for dma_mmap_attrs, dma_mmap_coherent, dma_mmap_writecombine
functions.
The generic mmap virt_to_page-based fallback implementation is provided for
architectures which don't provide their own implementation for mmap method.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'arch/powerpc/kernel/dma.c')
| -rw-r--r-- | arch/powerpc/kernel/dma.c | 36 | 
1 files changed, 19 insertions, 17 deletions
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index b1ec983dcec..062bf20e6dd 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c @@ -65,6 +65,24 @@ void dma_direct_free_coherent(struct device *dev, size_t size,  #endif  } +int dma_direct_mmap_coherent(struct device *dev, struct vm_area_struct *vma, +			     void *cpu_addr, dma_addr_t handle, size_t size, +			     struct dma_attrs *attrs) +{ +	unsigned long pfn; + +#ifdef CONFIG_NOT_COHERENT_CACHE +	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); +	pfn = __dma_get_coherent_pfn((unsigned long)cpu_addr); +#else +	pfn = page_to_pfn(virt_to_page(cpu_addr)); +#endif +	return remap_pfn_range(vma, vma->vm_start, +			       pfn + vma->vm_pgoff, +			       vma->vm_end - vma->vm_start, +			       vma->vm_page_prot); +} +  static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,  			     int nents, enum dma_data_direction direction,  			     struct dma_attrs *attrs) @@ -154,6 +172,7 @@ static inline void dma_direct_sync_single(struct device *dev,  struct dma_map_ops dma_direct_ops = {  	.alloc				= dma_direct_alloc_coherent,  	.free				= dma_direct_free_coherent, +	.mmap				= dma_direct_mmap_coherent,  	.map_sg				= dma_direct_map_sg,  	.unmap_sg			= dma_direct_unmap_sg,  	.dma_supported			= dma_direct_dma_supported, @@ -211,20 +230,3 @@ static int __init dma_init(void)  }  fs_initcall(dma_init); -int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma, -		      void *cpu_addr, dma_addr_t handle, size_t size) -{ -	unsigned long pfn; - -#ifdef CONFIG_NOT_COHERENT_CACHE -	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); -	pfn = __dma_get_coherent_pfn((unsigned long)cpu_addr); -#else -	pfn = page_to_pfn(virt_to_page(cpu_addr)); -#endif -	return remap_pfn_range(vma, vma->vm_start, -			       pfn + vma->vm_pgoff, -			       vma->vm_end - vma->vm_start, -			       vma->vm_page_prot); -} -EXPORT_SYMBOL_GPL(dma_mmap_coherent);  |