1 /**************************************************************************
2  *
3  * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
4  * All Rights Reserved.
5  * Copyright (c) 2009 VMware, Inc., Palo Alto, CA., USA
6  * All Rights Reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  **************************************************************************/
22 /*
23  * Authors
24  * Thomas Hellström <thomas-at-tungstengraphics-dot-com>
25  */
26 
27 #ifndef _TTM_PLACEMENT_USER_H_
28 #define _TTM_PLACEMENT_USER_H_
29 
30 #if !defined(__KERNEL__) && !defined(_KERNEL)
31 #include <stdint.h>
32 #else
33 #include <linux/kernel.h>
34 #endif
35 
36 #include "ttm/ttm_placement.h"
37 
38 #define TTM_PLACEMENT_MAJOR 0
39 #define TTM_PLACEMENT_MINOR 1
40 #define TTM_PLACEMENT_PL    0
41 #define TTM_PLACEMENT_DATE  "080819"
42 
43 /**
44  * struct ttm_pl_create_req
45  *
46  * @size: The buffer object size.
47  * @placement: Flags that indicate initial acceptable
48  *  placement.
49  * @page_alignment: Required alignment in pages.
50  *
51  * Input to the TTM_BO_CREATE ioctl.
52  */
53 
54 struct ttm_pl_create_req {
55 	uint64_t size;
56 	uint32_t placement;
57 	uint32_t page_alignment;
58 };
59 
60 /**
61  * struct ttm_pl_create_ub_req
62  *
63  * @size: The buffer object size.
64  * @user_address: User-space address of the memory area that
65  * should be used to back the buffer object cast to 64-bit.
66  * @placement: Flags that indicate initial acceptable
67  *  placement.
68  * @page_alignment: Required alignment in pages.
69  *
70  * Input to the TTM_BO_CREATE_UB ioctl.
71  */
72 
73 struct ttm_pl_create_ub_req {
74 	uint64_t size;
75 	uint64_t user_address;
76 	uint32_t placement;
77 	uint32_t page_alignment;
78 };
79 
80 /**
81  * struct ttm_pl_rep
82  *
83  * @gpu_offset: The current offset into the memory region used.
84  * This can be used directly by the GPU if there are no
85  * additional GPU mapping procedures used by the driver.
86  *
87  * @bo_size: Actual buffer object size.
88  *
89  * @map_handle: Offset into the device address space.
90  * Used for map, seek, read, write. This will never change
91  * during the lifetime of an object.
92  *
93  * @placement: Flag indicating the placement status of
94  * the buffer object using the TTM_PL flags above.
95  *
96  * @sync_object_arg: Used for user-space synchronization and
97  * depends on the synchronization model used. If fences are
98  * used, this is the buffer_object::fence_type_mask
99  *
100  * Output from the TTM_PL_CREATE and TTM_PL_REFERENCE, and
101  * TTM_PL_SETSTATUS ioctls.
102  */
103 
104 struct ttm_pl_rep {
105 	uint64_t gpu_offset;
106 	uint64_t bo_size;
107 	uint64_t map_handle;
108 	uint32_t placement;
109 	uint32_t handle;
110 	uint32_t sync_object_arg;
111 	uint32_t pad64;
112 };
113 
114 /**
115  * struct ttm_pl_setstatus_req
116  *
117  * @set_placement: Placement flags to set.
118  *
119  * @clr_placement: Placement flags to clear.
120  *
121  * @handle: The object handle
122  *
123  * Input to the TTM_PL_SETSTATUS ioctl.
124  */
125 
126 struct ttm_pl_setstatus_req {
127 	uint32_t set_placement;
128 	uint32_t clr_placement;
129 	uint32_t handle;
130 	uint32_t pad64;
131 };
132 
133 /**
134  * struct ttm_pl_reference_req
135  *
136  * @handle: The object to put a reference on.
137  *
138  * Input to the TTM_PL_REFERENCE and the TTM_PL_UNREFERENCE ioctls.
139  */
140 
141 struct ttm_pl_reference_req {
142 	uint32_t handle;
143 	uint32_t pad64;
144 };
145 
146 /*
147  * ACCESS mode flags for SYNCCPU.
148  *
149  * TTM_SYNCCPU_MODE_READ will guarantee that the GPU is not
150  * writing to the buffer.
151  *
152  * TTM_SYNCCPU_MODE_WRITE will guarantee that the GPU is not
153  * accessing the buffer.
154  *
155  * TTM_SYNCCPU_MODE_NO_BLOCK makes sure the call does not wait
156  * for GPU accesses to finish but return -EBUSY.
157  *
158  * TTM_SYNCCPU_MODE_TRYCACHED Try to place the buffer in cacheable
159  * memory while synchronized for CPU.
160  */
161 
162 #define TTM_PL_SYNCCPU_MODE_READ      TTM_ACCESS_READ
163 #define TTM_PL_SYNCCPU_MODE_WRITE     TTM_ACCESS_WRITE
164 #define TTM_PL_SYNCCPU_MODE_NO_BLOCK  (1 << 2)
165 #define TTM_PL_SYNCCPU_MODE_TRYCACHED (1 << 3)
166 
167 /**
168  * struct ttm_pl_synccpu_arg
169  *
170  * @handle: The object to synchronize.
171  *
172  * @access_mode: access mode indicated by the
173  * TTM_SYNCCPU_MODE flags.
174  *
175  * @op: indicates whether to grab or release the
176  * buffer for cpu usage.
177  *
178  * Input to the TTM_PL_SYNCCPU ioctl.
179  */
180 
181 struct ttm_pl_synccpu_arg {
182 	uint32_t handle;
183 	uint32_t access_mode;
184 	enum {
185 		TTM_PL_SYNCCPU_OP_GRAB,
186 		TTM_PL_SYNCCPU_OP_RELEASE
187 	} op;
188 	uint32_t pad64;
189 };
190 
191 /*
192  * Waiting mode flags for the TTM_BO_WAITIDLE ioctl.
193  *
194  * TTM_WAITIDLE_MODE_LAZY: Allow for sleeps during polling
195  * wait.
196  *
197  * TTM_WAITIDLE_MODE_NO_BLOCK: Don't block waiting for GPU,
198  * but return -EBUSY if the buffer is busy.
199  */
200 
201 #define TTM_PL_WAITIDLE_MODE_LAZY     (1 << 0)
202 #define TTM_PL_WAITIDLE_MODE_NO_BLOCK (1 << 1)
203 
204 /**
205  * struct ttm_waitidle_arg
206  *
207  * @handle: The object to synchronize.
208  *
209  * @mode: wait mode indicated by the
210  * TTM_SYNCCPU_MODE flags.
211  *
212  * Argument to the TTM_BO_WAITIDLE ioctl.
213  */
214 
215 struct ttm_pl_waitidle_arg {
216 	uint32_t handle;
217 	uint32_t mode;
218 };
219 
220 union ttm_pl_create_arg {
221 	struct ttm_pl_create_req req;
222 	struct ttm_pl_rep rep;
223 };
224 
225 union ttm_pl_reference_arg {
226 	struct ttm_pl_reference_req req;
227 	struct ttm_pl_rep rep;
228 };
229 
230 union ttm_pl_setstatus_arg {
231 	struct ttm_pl_setstatus_req req;
232 	struct ttm_pl_rep rep;
233 };
234 
235 union ttm_pl_create_ub_arg {
236 	struct ttm_pl_create_ub_req req;
237 	struct ttm_pl_rep rep;
238 };
239 
240 /*
241  * Ioctl offsets.
242  */
243 
244 #define TTM_PL_CREATE      0x00
245 #define TTM_PL_REFERENCE   0x01
246 #define TTM_PL_UNREF       0x02
247 #define TTM_PL_SYNCCPU     0x03
248 #define TTM_PL_WAITIDLE    0x04
249 #define TTM_PL_SETSTATUS   0x05
250 #define TTM_PL_CREATE_UB   0x06
251 
252 #endif
253