aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/cdv/imgv/psb_ttm_placement_user.h
blob: f17bf48828d38fc619d137d8f9fdd18d0c8670e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/**************************************************************************
 *
 * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
 * All Rights Reserved.
 * Copyright (c) 2009 VMware, Inc., Palo Alto, CA., USA
 * All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 **************************************************************************/
/*
 * Authors
 * Thomas Hellström <thomas-at-tungstengraphics-dot-com>
 */

#ifndef _TTM_PLACEMENT_USER_H_
#define _TTM_PLACEMENT_USER_H_

#if !defined(__KERNEL__) && !defined(_KERNEL)
#include <stdint.h>
#else
#include <linux/kernel.h>
#endif

#include "ttm/ttm_placement.h"

#define TTM_PLACEMENT_MAJOR 0
#define TTM_PLACEMENT_MINOR 1
#define TTM_PLACEMENT_PL    0
#define TTM_PLACEMENT_DATE  "080819"

/**
 * struct ttm_pl_create_req
 *
 * @size: The buffer object size.
 * @placement: Flags that indicate initial acceptable
 *  placement.
 * @page_alignment: Required alignment in pages.
 *
 * Input to the TTM_BO_CREATE ioctl.
 */

struct ttm_pl_create_req {
	uint64_t size;
	uint32_t placement;
	uint32_t page_alignment;
};

/**
 * struct ttm_pl_create_ub_req
 *
 * @size: The buffer object size.
 * @user_address: User-space address of the memory area that
 * should be used to back the buffer object cast to 64-bit.
 * @placement: Flags that indicate initial acceptable
 *  placement.
 * @page_alignment: Required alignment in pages.
 *
 * Input to the TTM_BO_CREATE_UB ioctl.
 */

struct ttm_pl_create_ub_req {
	uint64_t size;
	uint64_t user_address;
	uint32_t placement;
	uint32_t page_alignment;
};

/**
 * struct ttm_pl_rep
 *
 * @gpu_offset: The current offset into the memory region used.
 * This can be used directly by the GPU if there are no
 * additional GPU mapping procedures used by the driver.
 *
 * @bo_size: Actual buffer object size.
 *
 * @map_handle: Offset into the device address space.
 * Used for map, seek, read, write. This will never change
 * during the lifetime of an object.
 *
 * @placement: Flag indicating the placement status of
 * the buffer object using the TTM_PL flags above.
 *
 * @sync_object_arg: Used for user-space synchronization and
 * depends on the synchronization model used. If fences are
 * used, this is the buffer_object::fence_type_mask
 *
 * Output from the TTM_PL_CREATE and TTM_PL_REFERENCE, and
 * TTM_PL_SETSTATUS ioctls.
 */

struct ttm_pl_rep {
	uint64_t gpu_offset;
	uint64_t bo_size;
	uint64_t map_handle;
	uint32_t placement;
	uint32_t handle;
	uint32_t sync_object_arg;
	uint32_t pad64;
};

/**
 * struct ttm_pl_setstatus_req
 *
 * @set_placement: Placement flags to set.
 *
 * @clr_placement: Placement flags to clear.
 *
 * @handle: The object handle
 *
 * Input to the TTM_PL_SETSTATUS ioctl.
 */

struct ttm_pl_setstatus_req {
	uint32_t set_placement;
	uint32_t clr_placement;
	uint32_t handle;
	uint32_t pad64;
};

/**
 * struct ttm_pl_reference_req
 *
 * @handle: The object to put a reference on.
 *
 * Input to the TTM_PL_REFERENCE and the TTM_PL_UNREFERENCE ioctls.
 */

struct ttm_pl_reference_req {
	uint32_t handle;
	uint32_t pad64;
};

/*
 * ACCESS mode flags for SYNCCPU.
 *
 * TTM_SYNCCPU_MODE_READ will guarantee that the GPU is not
 * writing to the buffer.
 *
 * TTM_SYNCCPU_MODE_WRITE will guarantee that the GPU is not
 * accessing the buffer.
 *
 * TTM_SYNCCPU_MODE_NO_BLOCK makes sure the call does not wait
 * for GPU accesses to finish but return -EBUSY.
 *
 * TTM_SYNCCPU_MODE_TRYCACHED Try to place the buffer in cacheable
 * memory while synchronized for CPU.
 */

#define TTM_PL_SYNCCPU_MODE_READ      TTM_ACCESS_READ
#define TTM_PL_SYNCCPU_MODE_WRITE     TTM_ACCESS_WRITE
#define TTM_PL_SYNCCPU_MODE_NO_BLOCK  (1 << 2)
#define TTM_PL_SYNCCPU_MODE_TRYCACHED (1 << 3)

/**
 * struct ttm_pl_synccpu_arg
 *
 * @handle: The object to synchronize.
 *
 * @access_mode: access mode indicated by the
 * TTM_SYNCCPU_MODE flags.
 *
 * @op: indicates whether to grab or release the
 * buffer for cpu usage.
 *
 * Input to the TTM_PL_SYNCCPU ioctl.
 */

struct ttm_pl_synccpu_arg {
	uint32_t handle;
	uint32_t access_mode;
	enum {
		TTM_PL_SYNCCPU_OP_GRAB,
		TTM_PL_SYNCCPU_OP_RELEASE
	} op;
	uint32_t pad64;
};

/*
 * Waiting mode flags for the TTM_BO_WAITIDLE ioctl.
 *
 * TTM_WAITIDLE_MODE_LAZY: Allow for sleeps during polling
 * wait.
 *
 * TTM_WAITIDLE_MODE_NO_BLOCK: Don't block waiting for GPU,
 * but return -EBUSY if the buffer is busy.
 */

#define TTM_PL_WAITIDLE_MODE_LAZY     (1 << 0)
#define TTM_PL_WAITIDLE_MODE_NO_BLOCK (1 << 1)

/**
 * struct ttm_waitidle_arg
 *
 * @handle: The object to synchronize.
 *
 * @mode: wait mode indicated by the
 * TTM_SYNCCPU_MODE flags.
 *
 * Argument to the TTM_BO_WAITIDLE ioctl.
 */

struct ttm_pl_waitidle_arg {
	uint32_t handle;
	uint32_t mode;
};

union ttm_pl_create_arg {
	struct ttm_pl_create_req req;
	struct ttm_pl_rep rep;
};

union ttm_pl_reference_arg {
	struct ttm_pl_reference_req req;
	struct ttm_pl_rep rep;
};

union ttm_pl_setstatus_arg {
	struct ttm_pl_setstatus_req req;
	struct ttm_pl_rep rep;
};

union ttm_pl_create_ub_arg {
	struct ttm_pl_create_ub_req req;
	struct ttm_pl_rep rep;
};

/*
 * Ioctl offsets.
 */

#define TTM_PL_CREATE      0x00
#define TTM_PL_REFERENCE   0x01
#define TTM_PL_UNREF       0x02
#define TTM_PL_SYNCCPU     0x03
#define TTM_PL_WAITIDLE    0x04
#define TTM_PL_SETSTATUS   0x05
#define TTM_PL_CREATE_UB   0x06

#endif