Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.16-rc4 106 lines 3.0 kB view raw
1/* 2 * DMA operations for the Hexagon architecture 3 * 4 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 and 8 * only version 2 as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 * 02110-1301, USA. 19 */ 20 21#ifndef _ASM_DMA_MAPPING_H 22#define _ASM_DMA_MAPPING_H 23 24#include <linux/types.h> 25#include <linux/cache.h> 26#include <linux/mm.h> 27#include <linux/scatterlist.h> 28#include <linux/dma-debug.h> 29#include <linux/dma-attrs.h> 30#include <asm/io.h> 31 32struct device; 33extern int bad_dma_address; 34 35extern struct dma_map_ops *dma_ops; 36 37#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) 38#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 39 40static inline struct dma_map_ops *get_dma_ops(struct device *dev) 41{ 42 if (unlikely(dev == NULL)) 43 return NULL; 44 45 return dma_ops; 46} 47 48extern int dma_supported(struct device *dev, u64 mask); 49extern int dma_set_mask(struct device *dev, u64 mask); 50extern int dma_is_consistent(struct device *dev, dma_addr_t dma_handle); 51extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size, 52 enum dma_data_direction direction); 53 54#include <asm-generic/dma-mapping-common.h> 55 56static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) 57{ 58 if (!dev->dma_mask) 59 return 0; 60 return addr + size - 1 <= *dev->dma_mask; 61} 62 63static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) 64{ 65 struct dma_map_ops *dma_ops = get_dma_ops(dev); 66 67 if (dma_ops->mapping_error) 68 return dma_ops->mapping_error(dev, dma_addr); 69 70 return (dma_addr == bad_dma_address); 71} 72 73#define dma_alloc_coherent(d,s,h,f) dma_alloc_attrs(d,s,h,f,NULL) 74 75static inline void *dma_alloc_attrs(struct device *dev, size_t size, 76 dma_addr_t *dma_handle, gfp_t flag, 77 struct dma_attrs *attrs) 78{ 79 void *ret; 80 struct dma_map_ops *ops = get_dma_ops(dev); 81 82 BUG_ON(!dma_ops); 83 84 ret = ops->alloc(dev, size, dma_handle, flag, attrs); 85 86 debug_dma_alloc_coherent(dev, size, *dma_handle, ret); 87 88 return ret; 89} 90 91#define dma_free_coherent(d,s,c,h) dma_free_attrs(d,s,c,h,NULL) 92 93static inline void dma_free_attrs(struct device *dev, size_t size, 94 void *cpu_addr, dma_addr_t dma_handle, 95 struct dma_attrs *attrs) 96{ 97 struct dma_map_ops *dma_ops = get_dma_ops(dev); 98 99 BUG_ON(!dma_ops); 100 101 dma_ops->free(dev, size, cpu_addr, dma_handle, attrs); 102 103 debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); 104} 105 106#endif