blob: 579757e00a2552bd9f794a99336d08995fc47b01 [file] [log] [blame]
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07001#ifndef _ASM_SPARC64_DMA_MAPPING_H
2#define _ASM_SPARC64_DMA_MAPPING_H
3
4#include <linux/scatterlist.h>
5#include <linux/mm.h>
6
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07007struct dma_ops {
8 void *(*alloc_coherent)(struct device *dev, size_t size,
9 dma_addr_t *dma_handle, gfp_t flag);
10 void (*free_coherent)(struct device *dev, size_t size,
11 void *cpu_addr, dma_addr_t dma_handle);
FUJITA Tomonori797a7562009-05-14 16:23:10 +000012 dma_addr_t (*map_page)(struct device *dev, struct page *page,
13 unsigned long offset, size_t size,
14 enum dma_data_direction direction);
15 void (*unmap_page)(struct device *dev, dma_addr_t dma_addr,
16 size_t size,
17 enum dma_data_direction direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070018 int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents,
19 enum dma_data_direction direction);
20 void (*unmap_sg)(struct device *dev, struct scatterlist *sg,
21 int nhwentries,
22 enum dma_data_direction direction);
23 void (*sync_single_for_cpu)(struct device *dev,
24 dma_addr_t dma_handle, size_t size,
25 enum dma_data_direction direction);
FUJITA Tomonori2e8fcfe2009-05-14 16:23:09 +000026 void (*sync_single_for_device)(struct device *dev,
27 dma_addr_t dma_handle, size_t size,
28 enum dma_data_direction direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070029 void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
30 int nelems,
31 enum dma_data_direction direction);
FUJITA Tomonori2e8fcfe2009-05-14 16:23:09 +000032 void (*sync_sg_for_device)(struct device *dev,
33 struct scatterlist *sg, int nents,
34 enum dma_data_direction dir);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070035};
36extern const struct dma_ops *dma_ops;
37
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070038static inline void *dma_alloc_coherent(struct device *dev, size_t size,
39 dma_addr_t *dma_handle, gfp_t flag)
40{
41 return dma_ops->alloc_coherent(dev, size, dma_handle, flag);
42}
43
44static inline void dma_free_coherent(struct device *dev, size_t size,
45 void *cpu_addr, dma_addr_t dma_handle)
46{
47 dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
48}
49
50static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
51 size_t size,
52 enum dma_data_direction direction)
53{
FUJITA Tomonori797a7562009-05-14 16:23:10 +000054 return dma_ops->map_page(dev, virt_to_page(cpu_addr),
55 (unsigned long)cpu_addr & ~PAGE_MASK, size,
56 direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070057}
58
59static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
60 size_t size,
61 enum dma_data_direction direction)
62{
FUJITA Tomonori797a7562009-05-14 16:23:10 +000063 dma_ops->unmap_page(dev, dma_addr, size, direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070064}
65
66static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
67 unsigned long offset, size_t size,
68 enum dma_data_direction direction)
69{
FUJITA Tomonori797a7562009-05-14 16:23:10 +000070 return dma_ops->map_page(dev, page, offset, size, direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070071}
72
73static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
74 size_t size,
75 enum dma_data_direction direction)
76{
FUJITA Tomonori797a7562009-05-14 16:23:10 +000077 dma_ops->unmap_page(dev, dma_address, size, direction);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070078}
79
80static inline int dma_map_sg(struct device *dev, struct scatterlist *sg,
81 int nents, enum dma_data_direction direction)
82{
83 return dma_ops->map_sg(dev, sg, nents, direction);
84}
85
86static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
87 int nents, enum dma_data_direction direction)
88{
89 dma_ops->unmap_sg(dev, sg, nents, direction);
90}
91
92static inline void dma_sync_single_for_cpu(struct device *dev,
93 dma_addr_t dma_handle, size_t size,
94 enum dma_data_direction direction)
95{
96 dma_ops->sync_single_for_cpu(dev, dma_handle, size, direction);
97}
98
99static inline void dma_sync_single_for_device(struct device *dev,
100 dma_addr_t dma_handle,
101 size_t size,
102 enum dma_data_direction direction)
103{
104 /* No flushing needed to sync cpu writes to the device. */
105}
106
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700107static inline void dma_sync_sg_for_cpu(struct device *dev,
108 struct scatterlist *sg, int nelems,
109 enum dma_data_direction direction)
110{
111 dma_ops->sync_sg_for_cpu(dev, sg, nelems, direction);
112}
113
114static inline void dma_sync_sg_for_device(struct device *dev,
115 struct scatterlist *sg, int nelems,
116 enum dma_data_direction direction)
117{
118 /* No flushing needed to sync cpu writes to the device. */
119}
120
Sam Ravnborgf5e706a2008-07-17 21:55:51 -0700121#endif /* _ASM_SPARC64_DMA_MAPPING_H */