Subversion Repositories Kolibri OS

Rev

Rev 4568 | Rev 5270 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4568 Rev 5056
1
/*
1
/*
2
 * Header file for dma buffer sharing framework.
2
 * Header file for dma buffer sharing framework.
3
 *
3
 *
4
 * Copyright(C) 2011 Linaro Limited. All rights reserved.
4
 * Copyright(C) 2011 Linaro Limited. All rights reserved.
5
 * Author: Sumit Semwal 
5
 * Author: Sumit Semwal 
6
 *
6
 *
7
 * Many thanks to linaro-mm-sig list, and specially
7
 * Many thanks to linaro-mm-sig list, and specially
8
 * Arnd Bergmann , Rob Clark  and
8
 * Arnd Bergmann , Rob Clark  and
9
 * Daniel Vetter  for their support in creation and
9
 * Daniel Vetter  for their support in creation and
10
 * refining of this idea.
10
 * refining of this idea.
11
 *
11
 *
12
 * This program is free software; you can redistribute it and/or modify it
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
13
 * under the terms of the GNU General Public License version 2 as published by
14
 * the Free Software Foundation.
14
 * the Free Software Foundation.
15
 *
15
 *
16
 * This program is distributed in the hope that it will be useful, but WITHOUT
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
17
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
19
 * more details.
19
 * more details.
20
 *
20
 *
21
 * You should have received a copy of the GNU General Public License along with
21
 * You should have received a copy of the GNU General Public License along with
22
 * this program.  If not, see .
22
 * this program.  If not, see .
23
 */
23
 */
24
#ifndef __DMA_BUF_H__
24
#ifndef __DMA_BUF_H__
25
#define __DMA_BUF_H__
25
#define __DMA_BUF_H__
26
 
26
 
27
#include 
27
#include 
28
#include 
28
#include 
29
#include 
29
#include 
30
#include 
30
#include 
31
#include 
31
#include 
32
#include 
32
#include 
33
 
33
 
34
struct device;
34
struct device;
35
struct dma_buf;
35
struct dma_buf;
36
struct dma_buf_attachment;
36
struct dma_buf_attachment;
37
 
37
 
38
/**
38
/**
39
 * struct dma_buf_ops - operations possible on struct dma_buf
39
 * struct dma_buf_ops - operations possible on struct dma_buf
40
 * @attach: [optional] allows different devices to 'attach' themselves to the
40
 * @attach: [optional] allows different devices to 'attach' themselves to the
41
 *	    given buffer. It might return -EBUSY to signal that backing storage
41
 *	    given buffer. It might return -EBUSY to signal that backing storage
42
 *	    is already allocated and incompatible with the requirements
42
 *	    is already allocated and incompatible with the requirements
43
 *	    of requesting device.
43
 *	    of requesting device.
44
 * @detach: [optional] detach a given device from this buffer.
44
 * @detach: [optional] detach a given device from this buffer.
45
 * @map_dma_buf: returns list of scatter pages allocated, increases usecount
45
 * @map_dma_buf: returns list of scatter pages allocated, increases usecount
46
 *		 of the buffer. Requires atleast one attach to be called
46
 *		 of the buffer. Requires atleast one attach to be called
47
 *		 before. Returned sg list should already be mapped into
47
 *		 before. Returned sg list should already be mapped into
48
 *		 _device_ address space. This call may sleep. May also return
48
 *		 _device_ address space. This call may sleep. May also return
49
 *		 -EINTR. Should return -EINVAL if attach hasn't been called yet.
49
 *		 -EINTR. Should return -EINVAL if attach hasn't been called yet.
50
 * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
50
 * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
51
 *		   pages.
51
 *		   pages.
52
 * @release: release this buffer; to be called after the last dma_buf_put.
52
 * @release: release this buffer; to be called after the last dma_buf_put.
53
 * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
53
 * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
54
 * 		      caches and allocate backing storage (if not yet done)
54
 * 		      caches and allocate backing storage (if not yet done)
55
 * 		      respectively pin the objet into memory.
55
 * 		      respectively pin the objet into memory.
56
 * @end_cpu_access: [optional] called after cpu access to flush caches.
56
 * @end_cpu_access: [optional] called after cpu access to flush caches.
57
 * @kmap_atomic: maps a page from the buffer into kernel address
57
 * @kmap_atomic: maps a page from the buffer into kernel address
58
 * 		 space, users may not block until the subsequent unmap call.
58
 * 		 space, users may not block until the subsequent unmap call.
59
 * 		 This callback must not sleep.
59
 * 		 This callback must not sleep.
60
 * @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
60
 * @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
61
 * 		   This Callback must not sleep.
61
 * 		   This Callback must not sleep.
62
 * @kmap: maps a page from the buffer into kernel address space.
62
 * @kmap: maps a page from the buffer into kernel address space.
63
 * @kunmap: [optional] unmaps a page from the buffer.
63
 * @kunmap: [optional] unmaps a page from the buffer.
64
 * @mmap: used to expose the backing storage to userspace. Note that the
64
 * @mmap: used to expose the backing storage to userspace. Note that the
65
 * 	  mapping needs to be coherent - if the exporter doesn't directly
65
 * 	  mapping needs to be coherent - if the exporter doesn't directly
66
 * 	  support this, it needs to fake coherency by shooting down any ptes
66
 * 	  support this, it needs to fake coherency by shooting down any ptes
67
 * 	  when transitioning away from the cpu domain.
67
 * 	  when transitioning away from the cpu domain.
68
 * @vmap: [optional] creates a virtual mapping for the buffer into kernel
68
 * @vmap: [optional] creates a virtual mapping for the buffer into kernel
69
 *	  address space. Same restrictions as for vmap and friends apply.
69
 *	  address space. Same restrictions as for vmap and friends apply.
70
 * @vunmap: [optional] unmaps a vmap from the buffer
70
 * @vunmap: [optional] unmaps a vmap from the buffer
71
 */
71
 */
72
struct dma_buf_ops {
72
struct dma_buf_ops {
73
	int (*attach)(struct dma_buf *, struct device *,
73
	int (*attach)(struct dma_buf *, struct device *,
74
			struct dma_buf_attachment *);
74
			struct dma_buf_attachment *);
75
 
75
 
76
	void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
76
	void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
77
 
77
 
78
	/* For {map,unmap}_dma_buf below, any specific buffer attributes
78
	/* For {map,unmap}_dma_buf below, any specific buffer attributes
79
	 * required should get added to device_dma_parameters accessible
79
	 * required should get added to device_dma_parameters accessible
80
	 * via dev->dma_params.
80
	 * via dev->dma_params.
81
	 */
81
	 */
82
	struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
82
	struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
83
						enum dma_data_direction);
83
						enum dma_data_direction);
84
	void (*unmap_dma_buf)(struct dma_buf_attachment *,
84
	void (*unmap_dma_buf)(struct dma_buf_attachment *,
85
						struct sg_table *,
85
						struct sg_table *,
86
						enum dma_data_direction);
86
						enum dma_data_direction);
87
	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
87
	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
88
	 * if the call would block.
88
	 * if the call would block.
89
	 */
89
	 */
90
 
90
 
91
	/* after final dma_buf_put() */
91
	/* after final dma_buf_put() */
92
	void (*release)(struct dma_buf *);
92
	void (*release)(struct dma_buf *);
93
 
93
 
94
	int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
94
	int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
95
				enum dma_data_direction);
95
				enum dma_data_direction);
96
	void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
96
	void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
97
			       enum dma_data_direction);
97
			       enum dma_data_direction);
98
	void *(*kmap_atomic)(struct dma_buf *, unsigned long);
98
	void *(*kmap_atomic)(struct dma_buf *, unsigned long);
99
	void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
99
	void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
100
	void *(*kmap)(struct dma_buf *, unsigned long);
100
	void *(*kmap)(struct dma_buf *, unsigned long);
101
	void (*kunmap)(struct dma_buf *, unsigned long, void *);
101
	void (*kunmap)(struct dma_buf *, unsigned long, void *);
102
 
102
 
103
	int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
103
	int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
104
 
104
 
105
	void *(*vmap)(struct dma_buf *);
105
	void *(*vmap)(struct dma_buf *);
106
	void (*vunmap)(struct dma_buf *, void *vaddr);
106
	void (*vunmap)(struct dma_buf *, void *vaddr);
107
};
107
};
108
 
108
 
109
/**
109
/**
110
 * struct dma_buf - shared buffer object
110
 * struct dma_buf - shared buffer object
111
 * @size: size of the buffer
111
 * @size: size of the buffer
112
 * @file: file pointer used for sharing buffers across, and for refcounting.
112
 * @file: file pointer used for sharing buffers across, and for refcounting.
113
 * @attachments: list of dma_buf_attachment that denotes all devices attached.
113
 * @attachments: list of dma_buf_attachment that denotes all devices attached.
114
 * @ops: dma_buf_ops associated with this buffer object.
114
 * @ops: dma_buf_ops associated with this buffer object.
115
 * @exp_name: name of the exporter; useful for debugging.
115
 * @exp_name: name of the exporter; useful for debugging.
116
 * @list_node: node for dma_buf accounting and debugging.
116
 * @list_node: node for dma_buf accounting and debugging.
117
 * @priv: exporter specific private data for this buffer object.
117
 * @priv: exporter specific private data for this buffer object.
-
 
118
 * @resv: reservation object linked to this dma-buf
118
 */
119
 */
119
struct dma_buf {
120
struct dma_buf {
120
	size_t size;
121
	size_t size;
121
	struct file *file;
122
	struct file *file;
122
	struct list_head attachments;
123
	struct list_head attachments;
123
	const struct dma_buf_ops *ops;
124
	const struct dma_buf_ops *ops;
124
	/* mutex to serialize list manipulation, attach/detach and vmap/unmap */
125
	/* mutex to serialize list manipulation, attach/detach and vmap/unmap */
125
	struct mutex lock;
126
	struct mutex lock;
126
	unsigned vmapping_counter;
127
	unsigned vmapping_counter;
127
	void *vmap_ptr;
128
	void *vmap_ptr;
128
	const char *exp_name;
129
	const char *exp_name;
129
	struct list_head list_node;
130
	struct list_head list_node;
130
	void *priv;
131
	void *priv;
131
};
132
};
132
 
133
 
133
/**
134
/**
134
 * struct dma_buf_attachment - holds device-buffer attachment data
135
 * struct dma_buf_attachment - holds device-buffer attachment data
135
 * @dmabuf: buffer for this attachment.
136
 * @dmabuf: buffer for this attachment.
136
 * @dev: device attached to the buffer.
137
 * @dev: device attached to the buffer.
137
 * @node: list of dma_buf_attachment.
138
 * @node: list of dma_buf_attachment.
138
 * @priv: exporter specific attachment data.
139
 * @priv: exporter specific attachment data.
139
 *
140
 *
140
 * This structure holds the attachment information between the dma_buf buffer
141
 * This structure holds the attachment information between the dma_buf buffer
141
 * and its user device(s). The list contains one attachment struct per device
142
 * and its user device(s). The list contains one attachment struct per device
142
 * attached to the buffer.
143
 * attached to the buffer.
143
 */
144
 */
144
struct dma_buf_attachment {
145
struct dma_buf_attachment {
145
	struct dma_buf *dmabuf;
146
	struct dma_buf *dmabuf;
146
	struct device *dev;
147
	struct device *dev;
147
	struct list_head node;
148
	struct list_head node;
148
	void *priv;
149
	void *priv;
149
};
150
};
150
 
151
 
151
/**
152
/**
152
 * get_dma_buf - convenience wrapper for get_file.
153
 * get_dma_buf - convenience wrapper for get_file.
153
 * @dmabuf:	[in]	pointer to dma_buf
154
 * @dmabuf:	[in]	pointer to dma_buf
154
 *
155
 *
155
 * Increments the reference count on the dma-buf, needed in case of drivers
156
 * Increments the reference count on the dma-buf, needed in case of drivers
156
 * that either need to create additional references to the dmabuf on the
157
 * that either need to create additional references to the dmabuf on the
157
 * kernel side.  For example, an exporter that needs to keep a dmabuf ptr
158
 * kernel side.  For example, an exporter that needs to keep a dmabuf ptr
158
 * so that subsequent exports don't create a new dmabuf.
159
 * so that subsequent exports don't create a new dmabuf.
159
 */
160
 */
160
static inline void get_dma_buf(struct dma_buf *dmabuf)
161
static inline void get_dma_buf(struct dma_buf *dmabuf)
161
{
162
{
162
	get_file(dmabuf->file);
163
	get_file(dmabuf->file);
163
}
164
}
164
 
165
 
165
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
166
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
166
							struct device *dev);
167
							struct device *dev);
167
void dma_buf_detach(struct dma_buf *dmabuf,
168
void dma_buf_detach(struct dma_buf *dmabuf,
168
				struct dma_buf_attachment *dmabuf_attach);
169
				struct dma_buf_attachment *dmabuf_attach);
169
 
170
 
170
struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
171
struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
171
			       size_t size, int flags, const char *);
172
			       size_t size, int flags, const char *,
-
 
173
			       struct reservation_object *);
172
 
174
 
173
#define dma_buf_export(priv, ops, size, flags)	\
175
#define dma_buf_export(priv, ops, size, flags, resv)	\
174
	dma_buf_export_named(priv, ops, size, flags, __FILE__)
176
	dma_buf_export_named(priv, ops, size, flags, KBUILD_MODNAME, resv)
175
 
177
 
176
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
178
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
177
struct dma_buf *dma_buf_get(int fd);
179
struct dma_buf *dma_buf_get(int fd);
178
void dma_buf_put(struct dma_buf *dmabuf);
180
void dma_buf_put(struct dma_buf *dmabuf);
179
 
181
 
180
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
182
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
181
					enum dma_data_direction);
183
					enum dma_data_direction);
182
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
184
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
183
				enum dma_data_direction);
185
				enum dma_data_direction);
184
int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
186
int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
185
			     enum dma_data_direction dir);
187
			     enum dma_data_direction dir);
186
void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
188
void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
187
			    enum dma_data_direction dir);
189
			    enum dma_data_direction dir);
188
void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
190
void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
189
void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
191
void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
190
void *dma_buf_kmap(struct dma_buf *, unsigned long);
192
void *dma_buf_kmap(struct dma_buf *, unsigned long);
191
void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
193
void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
192
 
194
 
193
int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
195
int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
194
		 unsigned long);
196
		 unsigned long);
195
void *dma_buf_vmap(struct dma_buf *);
197
void *dma_buf_vmap(struct dma_buf *);
196
void dma_buf_vunmap(struct dma_buf *, void *vaddr);
198
void dma_buf_vunmap(struct dma_buf *, void *vaddr);
-
 
199
int dma_buf_debugfs_create_file(const char *name,
-
 
200
				int (*write)(struct seq_file *));
197
#endif /* __DMA_BUF_H__ */
201
#endif /* __DMA_BUF_H__ */