Subversion Repositories Kolibri OS

Rev

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

Rev 6082 Rev 6293
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
#include 
33
#include 
34
#include 
34
#include 
35
 
35
 
36
struct device;
36
struct device;
37
struct dma_buf;
37
struct dma_buf;
38
struct dma_buf_attachment;
38
struct dma_buf_attachment;
39
 
39
 
40
/**
40
/**
41
 * struct dma_buf_ops - operations possible on struct dma_buf
41
 * struct dma_buf_ops - operations possible on struct dma_buf
42
 * @attach: [optional] allows different devices to 'attach' themselves to the
42
 * @attach: [optional] allows different devices to 'attach' themselves to the
43
 *	    given buffer. It might return -EBUSY to signal that backing storage
43
 *	    given buffer. It might return -EBUSY to signal that backing storage
44
 *	    is already allocated and incompatible with the requirements
44
 *	    is already allocated and incompatible with the requirements
45
 *	    of requesting device.
45
 *	    of requesting device.
46
 * @detach: [optional] detach a given device from this buffer.
46
 * @detach: [optional] detach a given device from this buffer.
47
 * @map_dma_buf: returns list of scatter pages allocated, increases usecount
47
 * @map_dma_buf: returns list of scatter pages allocated, increases usecount
48
 *		 of the buffer. Requires atleast one attach to be called
48
 *		 of the buffer. Requires atleast one attach to be called
49
 *		 before. Returned sg list should already be mapped into
49
 *		 before. Returned sg list should already be mapped into
50
 *		 _device_ address space. This call may sleep. May also return
50
 *		 _device_ address space. This call may sleep. May also return
51
 *		 -EINTR. Should return -EINVAL if attach hasn't been called yet.
51
 *		 -EINTR. Should return -EINVAL if attach hasn't been called yet.
52
 * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
52
 * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
53
 *		   pages.
53
 *		   pages.
54
 * @release: release this buffer; to be called after the last dma_buf_put.
54
 * @release: release this buffer; to be called after the last dma_buf_put.
55
 * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
55
 * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
56
 * 		      caches and allocate backing storage (if not yet done)
56
 * 		      caches and allocate backing storage (if not yet done)
57
 * 		      respectively pin the objet into memory.
57
 * 		      respectively pin the objet into memory.
58
 * @end_cpu_access: [optional] called after cpu access to flush caches.
58
 * @end_cpu_access: [optional] called after cpu access to flush caches.
59
 * @kmap_atomic: maps a page from the buffer into kernel address
59
 * @kmap_atomic: maps a page from the buffer into kernel address
60
 * 		 space, users may not block until the subsequent unmap call.
60
 * 		 space, users may not block until the subsequent unmap call.
61
 * 		 This callback must not sleep.
61
 * 		 This callback must not sleep.
62
 * @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
62
 * @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
63
 * 		   This Callback must not sleep.
63
 * 		   This Callback must not sleep.
64
 * @kmap: maps a page from the buffer into kernel address space.
64
 * @kmap: maps a page from the buffer into kernel address space.
65
 * @kunmap: [optional] unmaps a page from the buffer.
65
 * @kunmap: [optional] unmaps a page from the buffer.
66
 * @mmap: used to expose the backing storage to userspace. Note that the
66
 * @mmap: used to expose the backing storage to userspace. Note that the
67
 * 	  mapping needs to be coherent - if the exporter doesn't directly
67
 * 	  mapping needs to be coherent - if the exporter doesn't directly
68
 * 	  support this, it needs to fake coherency by shooting down any ptes
68
 * 	  support this, it needs to fake coherency by shooting down any ptes
69
 * 	  when transitioning away from the cpu domain.
69
 * 	  when transitioning away from the cpu domain.
70
 * @vmap: [optional] creates a virtual mapping for the buffer into kernel
70
 * @vmap: [optional] creates a virtual mapping for the buffer into kernel
71
 *	  address space. Same restrictions as for vmap and friends apply.
71
 *	  address space. Same restrictions as for vmap and friends apply.
72
 * @vunmap: [optional] unmaps a vmap from the buffer
72
 * @vunmap: [optional] unmaps a vmap from the buffer
73
 */
73
 */
74
struct dma_buf_ops {
74
struct dma_buf_ops {
75
	int (*attach)(struct dma_buf *, struct device *,
75
	int (*attach)(struct dma_buf *, struct device *,
76
			struct dma_buf_attachment *);
76
			struct dma_buf_attachment *);
77
 
77
 
78
	void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
78
	void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
79
 
79
 
80
	/* For {map,unmap}_dma_buf below, any specific buffer attributes
80
	/* For {map,unmap}_dma_buf below, any specific buffer attributes
81
	 * required should get added to device_dma_parameters accessible
81
	 * required should get added to device_dma_parameters accessible
82
	 * via dev->dma_params.
82
	 * via dev->dma_params.
83
	 */
83
	 */
84
	struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
84
	struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
85
						enum dma_data_direction);
85
						enum dma_data_direction);
86
	void (*unmap_dma_buf)(struct dma_buf_attachment *,
86
	void (*unmap_dma_buf)(struct dma_buf_attachment *,
87
						struct sg_table *,
87
						struct sg_table *,
88
						enum dma_data_direction);
88
						enum dma_data_direction);
89
	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
89
	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
90
	 * if the call would block.
90
	 * if the call would block.
91
	 */
91
	 */
92
 
92
 
93
	/* after final dma_buf_put() */
93
	/* after final dma_buf_put() */
94
	void (*release)(struct dma_buf *);
94
	void (*release)(struct dma_buf *);
95
 
95
 
96
	int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
96
	int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
97
				enum dma_data_direction);
97
				enum dma_data_direction);
98
	void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
98
	void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
99
			       enum dma_data_direction);
99
			       enum dma_data_direction);
100
	void *(*kmap_atomic)(struct dma_buf *, unsigned long);
100
	void *(*kmap_atomic)(struct dma_buf *, unsigned long);
101
	void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
101
	void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
102
	void *(*kmap)(struct dma_buf *, unsigned long);
102
	void *(*kmap)(struct dma_buf *, unsigned long);
103
	void (*kunmap)(struct dma_buf *, unsigned long, void *);
103
	void (*kunmap)(struct dma_buf *, unsigned long, void *);
104
 
104
 
105
	int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
105
	int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
106
 
106
 
107
	void *(*vmap)(struct dma_buf *);
107
	void *(*vmap)(struct dma_buf *);
108
	void (*vunmap)(struct dma_buf *, void *vaddr);
108
	void (*vunmap)(struct dma_buf *, void *vaddr);
109
};
109
};
110
 
110
 
111
/**
111
/**
112
 * struct dma_buf - shared buffer object
112
 * struct dma_buf - shared buffer object
113
 * @size: size of the buffer
113
 * @size: size of the buffer
114
 * @file: file pointer used for sharing buffers across, and for refcounting.
114
 * @file: file pointer used for sharing buffers across, and for refcounting.
115
 * @attachments: list of dma_buf_attachment that denotes all devices attached.
115
 * @attachments: list of dma_buf_attachment that denotes all devices attached.
116
 * @ops: dma_buf_ops associated with this buffer object.
116
 * @ops: dma_buf_ops associated with this buffer object.
117
 * @exp_name: name of the exporter; useful for debugging.
117
 * @exp_name: name of the exporter; useful for debugging.
118
 * @owner: pointer to exporter module; used for refcounting when exporter is a
118
 * @owner: pointer to exporter module; used for refcounting when exporter is a
119
 *         kernel module.
119
 *         kernel module.
120
 * @list_node: node for dma_buf accounting and debugging.
120
 * @list_node: node for dma_buf accounting and debugging.
121
 * @priv: exporter specific private data for this buffer object.
121
 * @priv: exporter specific private data for this buffer object.
122
 * @resv: reservation object linked to this dma-buf
122
 * @resv: reservation object linked to this dma-buf
123
 */
123
 */
124
struct dma_buf {
124
struct dma_buf {
125
	size_t size;
125
	size_t size;
126
	struct file *file;
126
	struct file *file;
127
	struct list_head attachments;
127
	struct list_head attachments;
128
	const struct dma_buf_ops *ops;
128
	const struct dma_buf_ops *ops;
129
	/* mutex to serialize list manipulation, attach/detach and vmap/unmap */
129
	/* mutex to serialize list manipulation, attach/detach and vmap/unmap */
130
	struct mutex lock;
130
	struct mutex lock;
131
	unsigned vmapping_counter;
131
	unsigned vmapping_counter;
132
	void *vmap_ptr;
132
	void *vmap_ptr;
133
	const char *exp_name;
133
	const char *exp_name;
134
	struct list_head list_node;
134
	struct list_head list_node;
135
	void *priv;
135
	void *priv;
136
};
136
};
137
 
137
 
138
/**
138
/**
139
 * struct dma_buf_attachment - holds device-buffer attachment data
139
 * struct dma_buf_attachment - holds device-buffer attachment data
140
 * @dmabuf: buffer for this attachment.
140
 * @dmabuf: buffer for this attachment.
141
 * @dev: device attached to the buffer.
141
 * @dev: device attached to the buffer.
142
 * @node: list of dma_buf_attachment.
142
 * @node: list of dma_buf_attachment.
143
 * @priv: exporter specific attachment data.
143
 * @priv: exporter specific attachment data.
144
 *
144
 *
145
 * This structure holds the attachment information between the dma_buf buffer
145
 * This structure holds the attachment information between the dma_buf buffer
146
 * and its user device(s). The list contains one attachment struct per device
146
 * and its user device(s). The list contains one attachment struct per device
147
 * attached to the buffer.
147
 * attached to the buffer.
148
 */
148
 */
149
struct dma_buf_attachment {
149
struct dma_buf_attachment {
150
	struct dma_buf *dmabuf;
150
	struct dma_buf *dmabuf;
151
	struct device *dev;
151
	struct device *dev;
152
	struct list_head node;
152
	struct list_head node;
153
	void *priv;
153
	void *priv;
154
};
154
};
155
 
155
 
156
/**
156
/**
-
 
157
 * struct dma_buf_export_info - holds information needed to export a dma_buf
-
 
158
 * @exp_name:	name of the exporter - useful for debugging.
-
 
159
 * @owner:	pointer to exporter module - used for refcounting kernel module
-
 
160
 * @ops:	Attach allocator-defined dma buf ops to the new buffer
-
 
161
 * @size:	Size of the buffer
-
 
162
 * @flags:	mode flags for the file
-
 
163
 * @resv:	reservation-object, NULL to allocate default one
-
 
164
 * @priv:	Attach private data of allocator to this buffer
-
 
165
 *
-
 
166
 * This structure holds the information required to export the buffer. Used
-
 
167
 * with dma_buf_export() only.
-
 
168
 */
-
 
169
struct dma_buf_export_info {
-
 
170
	const char *exp_name;
-
 
171
	struct module *owner;
-
 
172
	const struct dma_buf_ops *ops;
-
 
173
	size_t size;
-
 
174
	int flags;
-
 
175
	struct reservation_object *resv;
-
 
176
	void *priv;
-
 
177
};
-
 
178
 
-
 
179
/**
-
 
180
 * helper macro for exporters; zeros and fills in most common values
-
 
181
 */
-
 
182
#define DEFINE_DMA_BUF_EXPORT_INFO(a)	\
-
 
183
	struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME, \
-
 
184
					 .owner = THIS_MODULE }
-
 
185
 
-
 
186
/**
157
 * get_dma_buf - convenience wrapper for get_file.
187
 * get_dma_buf - convenience wrapper for get_file.
158
 * @dmabuf:	[in]	pointer to dma_buf
188
 * @dmabuf:	[in]	pointer to dma_buf
159
 *
189
 *
160
 * Increments the reference count on the dma-buf, needed in case of drivers
190
 * Increments the reference count on the dma-buf, needed in case of drivers
161
 * that either need to create additional references to the dmabuf on the
191
 * that either need to create additional references to the dmabuf on the
162
 * kernel side.  For example, an exporter that needs to keep a dmabuf ptr
192
 * kernel side.  For example, an exporter that needs to keep a dmabuf ptr
163
 * so that subsequent exports don't create a new dmabuf.
193
 * so that subsequent exports don't create a new dmabuf.
164
 */
194
 */
165
static inline void get_dma_buf(struct dma_buf *dmabuf)
195
static inline void get_dma_buf(struct dma_buf *dmabuf)
166
{
196
{
167
	get_file(dmabuf->file);
197
	get_file(dmabuf->file);
168
}
198
}
169
 
199
 
170
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
200
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
171
							struct device *dev);
201
							struct device *dev);
172
void dma_buf_detach(struct dma_buf *dmabuf,
202
void dma_buf_detach(struct dma_buf *dmabuf,
173
				struct dma_buf_attachment *dmabuf_attach);
203
				struct dma_buf_attachment *dmabuf_attach);
174
 
204
 
175
struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info);
205
struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info);
176
 
206
 
177
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
207
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
178
struct dma_buf *dma_buf_get(int fd);
208
struct dma_buf *dma_buf_get(int fd);
179
void dma_buf_put(struct dma_buf *dmabuf);
209
void dma_buf_put(struct dma_buf *dmabuf);
180
 
210
 
181
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
211
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
182
					enum dma_data_direction);
212
					enum dma_data_direction);
183
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
213
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
184
				enum dma_data_direction);
214
				enum dma_data_direction);
185
int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
215
int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
186
			     enum dma_data_direction dir);
216
			     enum dma_data_direction dir);
187
void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
217
void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
188
			    enum dma_data_direction dir);
218
			    enum dma_data_direction dir);
189
void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
219
void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
190
void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
220
void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
191
void *dma_buf_kmap(struct dma_buf *, unsigned long);
221
void *dma_buf_kmap(struct dma_buf *, unsigned long);
192
void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
222
void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
193
 
223
 
194
int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
224
int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
195
		 unsigned long);
225
		 unsigned long);
196
void *dma_buf_vmap(struct dma_buf *);
226
void *dma_buf_vmap(struct dma_buf *);
197
void dma_buf_vunmap(struct dma_buf *, void *vaddr);
227
void dma_buf_vunmap(struct dma_buf *, void *vaddr);
198
int dma_buf_debugfs_create_file(const char *name,
228
int dma_buf_debugfs_create_file(const char *name,
199
				int (*write)(struct seq_file *));
229
				int (*write)(struct seq_file *));
200
#endif /* __DMA_BUF_H__ */
230
#endif /* __DMA_BUF_H__ */