diff options
Diffstat (limited to 'arch/openrisc/include/asm/dma-mapping.h')
| -rw-r--r-- | arch/openrisc/include/asm/dma-mapping.h | 143 | 
1 files changed, 32 insertions, 111 deletions
diff --git a/arch/openrisc/include/asm/dma-mapping.h b/arch/openrisc/include/asm/dma-mapping.h index b206ba4608b..fab8628e1b6 100644 --- a/arch/openrisc/include/asm/dma-mapping.h +++ b/arch/openrisc/include/asm/dma-mapping.h @@ -20,150 +20,71 @@  /*   * See Documentation/DMA-API-HOWTO.txt and   * Documentation/DMA-API.txt for documentation. - * - * This file is written with the intention of eventually moving over - * to largely using asm-generic/dma-mapping-common.h in its place.   */  #include <linux/dma-debug.h>  #include <asm-generic/dma-coherent.h>  #include <linux/kmemcheck.h> +#include <linux/dma-mapping.h>  #define DMA_ERROR_CODE		(~(dma_addr_t)0x0) +extern struct dma_map_ops or1k_dma_map_ops; + +static inline struct dma_map_ops *get_dma_ops(struct device *dev) +{ +	return &or1k_dma_map_ops; +} -#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) -#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) +#include <asm-generic/dma-mapping-common.h> -void *or1k_dma_alloc_coherent(struct device *dev, size_t size, -			      dma_addr_t *dma_handle, gfp_t flag); -void or1k_dma_free_coherent(struct device *dev, size_t size, void *vaddr, -			    dma_addr_t dma_handle); -dma_addr_t or1k_map_page(struct device *dev, struct page *page, -			 unsigned long offset, size_t size, -			 enum dma_data_direction dir, -			 struct dma_attrs *attrs); -void or1k_unmap_page(struct device *dev, dma_addr_t dma_handle, -		     size_t size, enum dma_data_direction dir, -		     struct dma_attrs *attrs); -int or1k_map_sg(struct device *dev, struct scatterlist *sg, -		int nents, enum dma_data_direction dir, -		struct dma_attrs *attrs); -void or1k_unmap_sg(struct device *dev, struct scatterlist *sg, -		   int nents, enum dma_data_direction dir, -		   struct dma_attrs *attrs); -void or1k_sync_single_for_cpu(struct device *dev, -			      dma_addr_t dma_handle, size_t size, -			      enum dma_data_direction dir); -void or1k_sync_single_for_device(struct device *dev, -			         dma_addr_t dma_handle, size_t size, -			         enum dma_data_direction dir); +#define dma_alloc_coherent(d,s,h,f) dma_alloc_attrs(d,s,h,f,NULL)  -static inline void *dma_alloc_coherent(struct device *dev, size_t size, -					dma_addr_t *dma_handle, gfp_t flag) +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t gfp, +				    struct dma_attrs *attrs)  { +	struct dma_map_ops *ops = get_dma_ops(dev);  	void *memory; -	memory = or1k_dma_alloc_coherent(dev, size, dma_handle, flag); +	memory = ops->alloc(dev, size, dma_handle, gfp, attrs);  	debug_dma_alloc_coherent(dev, size, *dma_handle, memory); -	return memory; -} - -static inline void dma_free_coherent(struct device *dev, size_t size, -				     void *cpu_addr, dma_addr_t dma_handle) -{ -	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); -	or1k_dma_free_coherent(dev, size, cpu_addr, dma_handle); -} - -static inline dma_addr_t dma_map_single(struct device *dev, void *ptr, -					size_t size, -					enum dma_data_direction dir) -{ -	dma_addr_t addr; -	kmemcheck_mark_initialized(ptr, size); -	BUG_ON(!valid_dma_direction(dir)); -	addr = or1k_map_page(dev, virt_to_page(ptr), -			     (unsigned long)ptr & ~PAGE_MASK, size, -			     dir, NULL); -	debug_dma_map_page(dev, virt_to_page(ptr), -			   (unsigned long)ptr & ~PAGE_MASK, size, -			   dir, addr, true); -	return addr; +	return memory;  } -static inline void dma_unmap_single(struct device *dev, dma_addr_t addr, -					  size_t size, -					  enum dma_data_direction dir) -{ -	BUG_ON(!valid_dma_direction(dir)); -	or1k_unmap_page(dev, addr, size, dir, NULL); -	debug_dma_unmap_page(dev, addr, size, dir, true); -} +#define dma_free_coherent(d,s,c,h) dma_free_attrs(d,s,c,h,NULL) -static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, -				   int nents, enum dma_data_direction dir) +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *cpu_addr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs)  { -	int i, ents; -	struct scatterlist *s; +	struct dma_map_ops *ops = get_dma_ops(dev); -	for_each_sg(sg, s, nents, i) -		kmemcheck_mark_initialized(sg_virt(s), s->length); -	BUG_ON(!valid_dma_direction(dir)); -	ents = or1k_map_sg(dev, sg, nents, dir, NULL); -	debug_dma_map_sg(dev, sg, nents, ents, dir); +	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); -	return ents; +	ops->free(dev, size, cpu_addr, dma_handle, attrs);  } -static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, -				      int nents, enum dma_data_direction dir) +static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, +					  dma_addr_t *dma_handle, gfp_t gfp)  { -	BUG_ON(!valid_dma_direction(dir)); -	debug_dma_unmap_sg(dev, sg, nents, dir); -	or1k_unmap_sg(dev, sg, nents, dir, NULL); -} +	struct dma_attrs attrs; -static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, -				      size_t offset, size_t size, -				      enum dma_data_direction dir) -{ -	dma_addr_t addr; +	dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs); -	kmemcheck_mark_initialized(page_address(page) + offset, size); -	BUG_ON(!valid_dma_direction(dir)); -	addr = or1k_map_page(dev, page, offset, size, dir, NULL); -	debug_dma_map_page(dev, page, offset, size, dir, addr, false); - -	return addr; +	return dma_alloc_attrs(dev, size, dma_handle, gfp, &attrs);  } -static inline void dma_unmap_page(struct device *dev, dma_addr_t addr, -				  size_t size, enum dma_data_direction dir) +static inline void dma_free_noncoherent(struct device *dev, size_t size, +					 void *cpu_addr, dma_addr_t dma_handle)  { -	BUG_ON(!valid_dma_direction(dir)); -	or1k_unmap_page(dev, addr, size, dir, NULL); -	debug_dma_unmap_page(dev, addr, size, dir, true); -} +	struct dma_attrs attrs; -static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, -					   size_t size, -					   enum dma_data_direction dir) -{ -	BUG_ON(!valid_dma_direction(dir)); -	or1k_sync_single_for_cpu(dev, addr, size, dir); -	debug_dma_sync_single_for_cpu(dev, addr, size, dir); -} +	dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs); -static inline void dma_sync_single_for_device(struct device *dev, -					      dma_addr_t addr, size_t size, -					      enum dma_data_direction dir) -{ -	BUG_ON(!valid_dma_direction(dir)); -	or1k_sync_single_for_device(dev, addr, size, dir); -	debug_dma_sync_single_for_device(dev, addr, size, dir); +	dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs);  }  static inline int dma_supported(struct device *dev, u64 dma_mask)  |