5eb40e7edc8cc50bc3b681a1cf460cf4e53a1240
[cascardo/linux.git] / include / linux / dma-buf.h
1 /*
2  * Header file for dma buffer sharing framework.
3  *
4  * Copyright(C) 2011 Linaro Limited. All rights reserved.
5  * Author: Sumit Semwal <sumit.semwal@ti.com>
6  *
7  * Many thanks to linaro-mm-sig list, and specially
8  * Arnd Bergmann <arnd@arndb.de>, Rob Clark <rob@ti.com> and
9  * Daniel Vetter <daniel@ffwll.ch> 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 #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
34 #include <linux/kds.h>
35 #include <linux/wait.h>
36 #endif
37
38 struct device;
39 struct dma_buf;
40 struct dma_buf_attachment;
41
42 /**
43  * struct dma_buf_ops - operations possible on struct dma_buf
44  * @attach: [optional] allows different devices to 'attach' themselves to the
45  *          given buffer. It might return -EBUSY to signal that backing storage
46  *          is already allocated and incompatible with the requirements
47  *          of requesting device.
48  * @detach: [optional] detach a given device from this buffer.
49  * @map_dma_buf: returns list of scatter pages allocated, increases usecount
50  *               of the buffer. Requires atleast one attach to be called
51  *               before. Returned sg list should already be mapped into
52  *               _device_ address space. This call may sleep. May also return
53  *               -EINTR. Should return -EINVAL if attach hasn't been called yet.
54  * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
55  *                 pages.
56  * @release: release this buffer; to be called after the last dma_buf_put.
57  * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
58  *                    caches and allocate backing storage (if not yet done)
59  *                    respectively pin the objet into memory.
60  * @end_cpu_access: [optional] called after cpu access to flush cashes.
61  * @kmap_atomic: maps a page from the buffer into kernel address
62  *               space, users may not block until the subsequent unmap call.
63  *               This callback must not sleep.
64  * @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
65  *                 This Callback must not sleep.
66  * @kmap: maps a page from the buffer into kernel address space.
67  * @kunmap: [optional] unmaps a page from the buffer.
68  * @mmap: used to expose the backing storage to userspace. Note that the
69  *        mapping needs to be coherent - if the exporter doesn't directly
70  *        support this, it needs to fake coherency by shooting down any ptes
71  *        when transitioning away from the cpu domain.
72  * @vmap: [optional] creates a virtual mapping for the buffer into kernel
73  *        address space. Same restrictions as for vmap and friends apply.
74  * @vunmap: [optional] unmaps a vmap from the buffer
75  */
76 struct dma_buf_ops {
77         int (*attach)(struct dma_buf *, struct device *,
78                         struct dma_buf_attachment *);
79
80         void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
81
82         /* For {map,unmap}_dma_buf below, any specific buffer attributes
83          * required should get added to device_dma_parameters accessible
84          * via dev->dma_params.
85          */
86         struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
87                                                 enum dma_data_direction);
88         void (*unmap_dma_buf)(struct dma_buf_attachment *,
89                                                 struct sg_table *,
90                                                 enum dma_data_direction);
91         /* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
92          * if the call would block.
93          */
94
95         /* after final dma_buf_put() */
96         void (*release)(struct dma_buf *);
97
98         int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
99                                 enum dma_data_direction);
100         void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
101                                enum dma_data_direction);
102         void *(*kmap_atomic)(struct dma_buf *, unsigned long);
103         void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
104         void *(*kmap)(struct dma_buf *, unsigned long);
105         void (*kunmap)(struct dma_buf *, unsigned long, void *);
106
107         int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
108
109         void *(*vmap)(struct dma_buf *);
110         void (*vunmap)(struct dma_buf *, void *vaddr);
111 };
112
113 /**
114  * struct dma_buf - shared buffer object
115  * @size: size of the buffer
116  * @file: file pointer used for sharing buffers across, and for refcounting.
117  * @attachments: list of dma_buf_attachment that denotes all devices attached.
118  * @ops: dma_buf_ops associated with this buffer object.
119  * @priv: exporter specific private data for this buffer object.
120  */
121 struct dma_buf {
122         size_t size;
123         struct file *file;
124         struct list_head attachments;
125         const struct dma_buf_ops *ops;
126         /* mutex to serialize list manipulation and attach/detach */
127         struct mutex lock;
128 #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
129         struct kds_resource kds;
130         wait_queue_head_t wq_exclusive;
131         wait_queue_head_t wq_shared;
132         struct kds_callback kds_cb;
133 #endif
134         void *priv;
135 };
136
137 /**
138  * struct dma_buf_attachment - holds device-buffer attachment data
139  * @dmabuf: buffer for this attachment.
140  * @dev: device attached to the buffer.
141  * @node: list of dma_buf_attachment.
142  * @priv: exporter specific attachment data.
143  *
144  * This structure holds the attachment information between the dma_buf buffer
145  * and its user device(s). The list contains one attachment struct per device
146  * attached to the buffer.
147  */
148 struct dma_buf_attachment {
149         struct dma_buf *dmabuf;
150         struct device *dev;
151         struct list_head node;
152         void *priv;
153 };
154
155 /**
156  * get_dma_buf - convenience wrapper for get_file.
157  * @dmabuf:     [in]    pointer to dma_buf
158  *
159  * Increments the reference count on the dma-buf, needed in case of drivers
160  * that either need to create additional references to the dmabuf on the
161  * kernel side.  For example, an exporter that needs to keep a dmabuf ptr
162  * so that subsequent exports don't create a new dmabuf.
163  */
164 static inline void get_dma_buf(struct dma_buf *dmabuf)
165 {
166         get_file(dmabuf->file);
167 }
168
169 #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
170 /**
171  * get_dma_buf_kds_resource - get a KDS resource for this dma-buf
172  * @dmabuf:     [in]    pointer to dma_buf
173  *
174  * Returns a KDS resource that represents the dma-buf. This should be used by
175  * drivers to synchronize access to the buffer. Note that the caller should
176  * ensure that a reference to the dma-buf exists from the call to
177  * kds_async_wait until kds_resource_set_release is called.
178  */
179 static inline struct kds_resource *
180         get_dma_buf_kds_resource(struct dma_buf *dmabuf)
181 {
182         return &dmabuf->kds;
183 }
184 #endif
185
186 #ifdef CONFIG_DMA_SHARED_BUFFER
187 struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
188                                                         struct device *dev);
189 void dma_buf_detach(struct dma_buf *dmabuf,
190                                 struct dma_buf_attachment *dmabuf_attach);
191 struct dma_buf *dma_buf_export(void *priv, const struct dma_buf_ops *ops,
192                                size_t size, int flags);
193 int dma_buf_fd(struct dma_buf *dmabuf, int flags);
194 struct dma_buf *dma_buf_get(int fd);
195 void dma_buf_put(struct dma_buf *dmabuf);
196
197 struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
198                                         enum dma_data_direction);
199 void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
200                                 enum dma_data_direction);
201 int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
202                              enum dma_data_direction dir);
203 void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
204                             enum dma_data_direction dir);
205 void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
206 void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
207 void *dma_buf_kmap(struct dma_buf *, unsigned long);
208 void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
209
210 int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
211                  unsigned long);
212 void *dma_buf_vmap(struct dma_buf *);
213 void dma_buf_vunmap(struct dma_buf *, void *vaddr);
214 #else
215
216 static inline struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
217                                                         struct device *dev)
218 {
219         return ERR_PTR(-ENODEV);
220 }
221
222 static inline void dma_buf_detach(struct dma_buf *dmabuf,
223                                   struct dma_buf_attachment *dmabuf_attach)
224 {
225         return;
226 }
227
228 static inline struct dma_buf *dma_buf_export(void *priv,
229                                              const struct dma_buf_ops *ops,
230                                              size_t size, int flags)
231 {
232         return ERR_PTR(-ENODEV);
233 }
234
235 static inline int dma_buf_fd(struct dma_buf *dmabuf, int flags)
236 {
237         return -ENODEV;
238 }
239
240 static inline struct dma_buf *dma_buf_get(int fd)
241 {
242         return ERR_PTR(-ENODEV);
243 }
244
245 static inline void dma_buf_put(struct dma_buf *dmabuf)
246 {
247         return;
248 }
249
250 static inline struct sg_table *dma_buf_map_attachment(
251         struct dma_buf_attachment *attach, enum dma_data_direction write)
252 {
253         return ERR_PTR(-ENODEV);
254 }
255
256 static inline void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
257                         struct sg_table *sg, enum dma_data_direction dir)
258 {
259         return;
260 }
261
262 static inline int dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
263                                            size_t start, size_t len,
264                                            enum dma_data_direction dir)
265 {
266         return -ENODEV;
267 }
268
269 static inline void dma_buf_end_cpu_access(struct dma_buf *dmabuf,
270                                           size_t start, size_t len,
271                                           enum dma_data_direction dir)
272 {
273 }
274
275 static inline void *dma_buf_kmap_atomic(struct dma_buf *dmabuf,
276                                         unsigned long pnum)
277 {
278         return NULL;
279 }
280
281 static inline void dma_buf_kunmap_atomic(struct dma_buf *dmabuf,
282                                          unsigned long pnum, void *vaddr)
283 {
284 }
285
286 static inline void *dma_buf_kmap(struct dma_buf *dmabuf, unsigned long pnum)
287 {
288         return NULL;
289 }
290
291 static inline void dma_buf_kunmap(struct dma_buf *dmabuf,
292                                   unsigned long pnum, void *vaddr)
293 {
294 }
295
296 static inline int dma_buf_mmap(struct dma_buf *dmabuf,
297                                struct vm_area_struct *vma,
298                                unsigned long pgoff)
299 {
300         return -ENODEV;
301 }
302
303 static inline void *dma_buf_vmap(struct dma_buf *dmabuf)
304 {
305         return NULL;
306 }
307
308 static inline void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
309 {
310 }
311 #endif /* CONFIG_DMA_SHARED_BUFFER */
312
313 #endif /* __DMA_BUF_H__ */