Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dma-buf.h
Go to the documentation of this file.
1 /*
2  * Header file for dma buffer sharing framework.
3  *
4  * Copyright(C) 2011 Linaro Limited. All rights reserved.
5  * Author: Sumit Semwal <[email protected]>
6  *
7  * Many thanks to linaro-mm-sig list, and specially
8  * Arnd Bergmann <[email protected]>, Rob Clark <[email protected]> and
9  * Daniel Vetter <[email protected]> for their support in creation and
10  * refining of this idea.
11  *
12  * This program is free software; you can redistribute it and/or modify it
13  * under the terms of the GNU General Public License version 2 as published by
14  * the Free Software Foundation.
15  *
16  * This program is distributed in the hope that it will be useful, but WITHOUT
17  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19  * more details.
20  *
21  * You should have received a copy of the GNU General Public License along with
22  * this program. If not, see <http://www.gnu.org/licenses/>.
23  */
24 #ifndef __DMA_BUF_H__
25 #define __DMA_BUF_H__
26 
27 #include <linux/file.h>
28 #include <linux/err.h>
29 #include <linux/scatterlist.h>
30 #include <linux/list.h>
31 #include <linux/dma-mapping.h>
32 #include <linux/fs.h>
33 
34 struct device;
35 struct dma_buf;
36 struct dma_buf_attachment;
37 
72 struct dma_buf_ops {
73  int (*attach)(struct dma_buf *, struct device *,
74  struct dma_buf_attachment *);
75 
76  void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
77 
78  /* For {map,unmap}_dma_buf below, any specific buffer attributes
79  * required should get added to device_dma_parameters accessible
80  * via dev->dma_params.
81  */
82  struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
83  enum dma_data_direction);
85  struct sg_table *,
86  enum dma_data_direction);
87  /* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
88  * if the call would block.
89  */
90 
91  /* after final dma_buf_put() */
92  void (*release)(struct dma_buf *);
93 
95  enum dma_data_direction);
97  enum dma_data_direction);
98  void *(*kmap_atomic)(struct dma_buf *, unsigned long);
99  void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
100  void *(*kmap)(struct dma_buf *, unsigned long);
101  void (*kunmap)(struct dma_buf *, unsigned long, void *);
102 
103  int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
104 
105  void *(*vmap)(struct dma_buf *);
106  void (*vunmap)(struct dma_buf *, void *vaddr);
107 };
108 
117 struct dma_buf {
118  size_t size;
119  struct file *file;
121  const struct dma_buf_ops *ops;
122  /* mutex to serialize list manipulation and attach/detach */
123  struct mutex lock;
124  void *priv;
125 };
126 
139  struct dma_buf *dmabuf;
140  struct device *dev;
141  struct list_head node;
142  void *priv;
143 };
144 
154 static inline void get_dma_buf(struct dma_buf *dmabuf)
155 {
156  get_file(dmabuf->file);
157 }
158 
159 #ifdef CONFIG_DMA_SHARED_BUFFER
161  struct device *dev);
162 void dma_buf_detach(struct dma_buf *dmabuf,
163  struct dma_buf_attachment *dmabuf_attach);
164 struct dma_buf *dma_buf_export(void *priv, const struct dma_buf_ops *ops,
165  size_t size, int flags);
166 int dma_buf_fd(struct dma_buf *dmabuf, int flags);
167 struct dma_buf *dma_buf_get(int fd);
168 void dma_buf_put(struct dma_buf *dmabuf);
169 
171  enum dma_data_direction);
173  enum dma_data_direction);
174 int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
175  enum dma_data_direction dir);
176 void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
177  enum dma_data_direction dir);
178 void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
179 void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
180 void *dma_buf_kmap(struct dma_buf *, unsigned long);
181 void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
182 
183 int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
184  unsigned long);
185 void *dma_buf_vmap(struct dma_buf *);
186 void dma_buf_vunmap(struct dma_buf *, void *vaddr);
187 #else
188 
189 static inline struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
190  struct device *dev)
191 {
192  return ERR_PTR(-ENODEV);
193 }
194 
195 static inline void dma_buf_detach(struct dma_buf *dmabuf,
196  struct dma_buf_attachment *dmabuf_attach)
197 {
198  return;
199 }
200 
201 static inline struct dma_buf *dma_buf_export(void *priv,
202  const struct dma_buf_ops *ops,
203  size_t size, int flags)
204 {
205  return ERR_PTR(-ENODEV);
206 }
207 
208 static inline int dma_buf_fd(struct dma_buf *dmabuf, int flags)
209 {
210  return -ENODEV;
211 }
212 
213 static inline struct dma_buf *dma_buf_get(int fd)
214 {
215  return ERR_PTR(-ENODEV);
216 }
217 
218 static inline void dma_buf_put(struct dma_buf *dmabuf)
219 {
220  return;
221 }
222 
223 static inline struct sg_table *dma_buf_map_attachment(
225 {
226  return ERR_PTR(-ENODEV);
227 }
228 
229 static inline void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
230  struct sg_table *sg, enum dma_data_direction dir)
231 {
232  return;
233 }
234 
235 static inline int dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
236  size_t start, size_t len,
237  enum dma_data_direction dir)
238 {
239  return -ENODEV;
240 }
241 
242 static inline void dma_buf_end_cpu_access(struct dma_buf *dmabuf,
243  size_t start, size_t len,
244  enum dma_data_direction dir)
245 {
246 }
247 
248 static inline void *dma_buf_kmap_atomic(struct dma_buf *dmabuf,
249  unsigned long pnum)
250 {
251  return NULL;
252 }
253 
254 static inline void dma_buf_kunmap_atomic(struct dma_buf *dmabuf,
255  unsigned long pnum, void *vaddr)
256 {
257 }
258 
259 static inline void *dma_buf_kmap(struct dma_buf *dmabuf, unsigned long pnum)
260 {
261  return NULL;
262 }
263 
264 static inline void dma_buf_kunmap(struct dma_buf *dmabuf,
265  unsigned long pnum, void *vaddr)
266 {
267 }
268 
269 static inline int dma_buf_mmap(struct dma_buf *dmabuf,
270  struct vm_area_struct *vma,
271  unsigned long pgoff)
272 {
273  return -ENODEV;
274 }
275 
276 static inline void *dma_buf_vmap(struct dma_buf *dmabuf)
277 {
278  return NULL;
279 }
280 
281 static inline void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
282 {
283 }
284 #endif /* CONFIG_DMA_SHARED_BUFFER */
285 
286 #endif /* __DMA_BUF_H__ */