1#ifndef _MSM_KGSL_H
2#define _MSM_KGSL_H
3
4#define KGSL_VERSION_MAJOR        3
5#define KGSL_VERSION_MINOR        12
6
7/*context flags */
8#define KGSL_CONTEXT_SAVE_GMEM		0x00000001
9#define KGSL_CONTEXT_NO_GMEM_ALLOC	0x00000002
10#define KGSL_CONTEXT_SUBMIT_IB_LIST	0x00000004
11#define KGSL_CONTEXT_CTX_SWITCH		0x00000008
12#define KGSL_CONTEXT_PREAMBLE		0x00000010
13#define KGSL_CONTEXT_TRASH_STATE	0x00000020
14#define KGSL_CONTEXT_PER_CONTEXT_TS	0x00000040
15
16#define KGSL_CONTEXT_INVALID 0xffffffff
17
18/* Memory allocayion flags */
19#define KGSL_MEMFLAGS_GPUREADONLY	0x01000000
20
21/* generic flag values */
22#define KGSL_FLAGS_NORMALMODE  0x00000000
23#define KGSL_FLAGS_SAFEMODE    0x00000001
24#define KGSL_FLAGS_INITIALIZED0 0x00000002
25#define KGSL_FLAGS_INITIALIZED 0x00000004
26#define KGSL_FLAGS_STARTED     0x00000008
27#define KGSL_FLAGS_ACTIVE      0x00000010
28#define KGSL_FLAGS_RESERVED0   0x00000020
29#define KGSL_FLAGS_RESERVED1   0x00000040
30#define KGSL_FLAGS_RESERVED2   0x00000080
31#define KGSL_FLAGS_SOFT_RESET  0x00000100
32#define KGSL_FLAGS_PER_CONTEXT_TIMESTAMPS 0x00000200
33
34/* Clock flags to show which clocks should be controled by a given platform */
35#define KGSL_CLK_SRC	0x00000001
36#define KGSL_CLK_CORE	0x00000002
37#define KGSL_CLK_IFACE	0x00000004
38#define KGSL_CLK_MEM	0x00000008
39#define KGSL_CLK_MEM_IFACE 0x00000010
40#define KGSL_CLK_AXI	0x00000020
41
42/*
43 * Reset status values for context
44 */
45enum kgsl_ctx_reset_stat {
46	KGSL_CTX_STAT_NO_ERROR				= 0x00000000,
47	KGSL_CTX_STAT_GUILTY_CONTEXT_RESET_EXT		= 0x00000001,
48	KGSL_CTX_STAT_INNOCENT_CONTEXT_RESET_EXT	= 0x00000002,
49	KGSL_CTX_STAT_UNKNOWN_CONTEXT_RESET_EXT		= 0x00000003
50};
51
52#define KGSL_CONVERT_TO_MBPS(val) \
53	(val*1000*1000U)
54
55/* device id */
56enum kgsl_deviceid {
57	KGSL_DEVICE_3D0		= 0x00000000,
58	KGSL_DEVICE_2D0		= 0x00000001,
59	KGSL_DEVICE_2D1		= 0x00000002,
60	KGSL_DEVICE_MAX		= 0x00000003
61};
62
63enum kgsl_user_mem_type {
64	KGSL_USER_MEM_TYPE_PMEM		= 0x00000000,
65	KGSL_USER_MEM_TYPE_ASHMEM	= 0x00000001,
66	KGSL_USER_MEM_TYPE_ADDR		= 0x00000002,
67	KGSL_USER_MEM_TYPE_ION		= 0x00000003,
68	KGSL_USER_MEM_TYPE_MAX		= 0x00000004,
69};
70
71struct kgsl_devinfo {
72
73	unsigned int device_id;
74	/* chip revision id
75	* coreid:8 majorrev:8 minorrev:8 patch:8
76	*/
77	unsigned int chip_id;
78	unsigned int mmu_enabled;
79	unsigned int gmem_gpubaseaddr;
80	/*
81	* This field contains the adreno revision
82	* number 200, 205, 220, etc...
83	*/
84	unsigned int gpu_id;
85	unsigned int gmem_sizebytes;
86};
87
88/* this structure defines the region of memory that can be mmap()ed from this
89   driver. The timestamp fields are volatile because they are written by the
90   GPU
91*/
92struct kgsl_devmemstore {
93	volatile unsigned int soptimestamp;
94	unsigned int sbz;
95	volatile unsigned int eoptimestamp;
96	unsigned int sbz2;
97	volatile unsigned int ts_cmp_enable;
98	unsigned int sbz3;
99	volatile unsigned int ref_wait_ts;
100	unsigned int sbz4;
101	unsigned int current_context;
102	unsigned int sbz5;
103};
104
105#define KGSL_MEMSTORE_OFFSET(ctxt_id, field) \
106	((ctxt_id)*sizeof(struct kgsl_devmemstore) + \
107	 offsetof(struct kgsl_devmemstore, field))
108
109/* timestamp id*/
110enum kgsl_timestamp_type {
111	KGSL_TIMESTAMP_CONSUMED = 0x00000001, /* start-of-pipeline timestamp */
112	KGSL_TIMESTAMP_RETIRED  = 0x00000002, /* end-of-pipeline timestamp*/
113	KGSL_TIMESTAMP_QUEUED   = 0x00000003,
114};
115
116/* property types - used with kgsl_device_getproperty */
117enum kgsl_property_type {
118	KGSL_PROP_DEVICE_INFO     = 0x00000001,
119	KGSL_PROP_DEVICE_SHADOW   = 0x00000002,
120	KGSL_PROP_DEVICE_POWER    = 0x00000003,
121	KGSL_PROP_SHMEM           = 0x00000004,
122	KGSL_PROP_SHMEM_APERTURES = 0x00000005,
123	KGSL_PROP_MMU_ENABLE 	  = 0x00000006,
124	KGSL_PROP_INTERRUPT_WAITS = 0x00000007,
125	KGSL_PROP_VERSION         = 0x00000008,
126	KGSL_PROP_GPU_RESET_STAT  = 0x00000009,
127	KGSL_PROP_PWRCTRL         = 0x0000000E,
128};
129
130struct kgsl_shadowprop {
131	unsigned int gpuaddr;
132	unsigned int size;
133	unsigned int flags; /* contains KGSL_FLAGS_ values */
134};
135
136struct kgsl_version {
137	unsigned int drv_major;
138	unsigned int drv_minor;
139	unsigned int dev_major;
140	unsigned int dev_minor;
141};
142
143/* structure holds list of ibs */
144struct kgsl_ibdesc {
145	unsigned int gpuaddr;
146	void *hostptr;
147	unsigned int sizedwords;
148	unsigned int ctrl;
149};
150
151/* ioctls */
152#define KGSL_IOC_TYPE 0x09
153
154/* get misc info about the GPU
155   type should be a value from enum kgsl_property_type
156   value points to a structure that varies based on type
157   sizebytes is sizeof() that structure
158   for KGSL_PROP_DEVICE_INFO, use struct kgsl_devinfo
159   this structure contaings hardware versioning info.
160   for KGSL_PROP_DEVICE_SHADOW, use struct kgsl_shadowprop
161   this is used to find mmap() offset and sizes for mapping
162   struct kgsl_memstore into userspace.
163*/
164struct kgsl_device_getproperty {
165	unsigned int type;
166	void  *value;
167	unsigned int sizebytes;
168};
169
170#define IOCTL_KGSL_DEVICE_GETPROPERTY \
171	_IOWR(KGSL_IOC_TYPE, 0x2, struct kgsl_device_getproperty)
172
173/* IOCTL_KGSL_DEVICE_READ (0x3) - removed 03/2012
174 */
175
176/* block until the GPU has executed past a given timestamp
177 * timeout is in milliseconds.
178 */
179struct kgsl_device_waittimestamp {
180	unsigned int timestamp;
181	unsigned int timeout;
182};
183
184#define IOCTL_KGSL_DEVICE_WAITTIMESTAMP \
185	_IOW(KGSL_IOC_TYPE, 0x6, struct kgsl_device_waittimestamp)
186
187struct kgsl_device_waittimestamp_ctxtid {
188	unsigned int context_id;
189	unsigned int timestamp;
190	unsigned int timeout;
191};
192
193#define IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID \
194	_IOW(KGSL_IOC_TYPE, 0x7, struct kgsl_device_waittimestamp_ctxtid)
195
196/* issue indirect commands to the GPU.
197 * drawctxt_id must have been created with IOCTL_KGSL_DRAWCTXT_CREATE
198 * ibaddr and sizedwords must specify a subset of a buffer created
199 * with IOCTL_KGSL_SHAREDMEM_FROM_PMEM
200 * flags may be a mask of KGSL_CONTEXT_ values
201 * timestamp is a returned counter value which can be passed to
202 * other ioctls to determine when the commands have been executed by
203 * the GPU.
204 */
205struct kgsl_ringbuffer_issueibcmds {
206	unsigned int drawctxt_id;
207	unsigned int ibdesc_addr;
208	unsigned int numibs;
209	unsigned int timestamp; /*output param */
210	unsigned int flags;
211};
212
213#define IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS \
214	_IOWR(KGSL_IOC_TYPE, 0x10, struct kgsl_ringbuffer_issueibcmds)
215
216/* read the most recently executed timestamp value
217 * type should be a value from enum kgsl_timestamp_type
218 */
219struct kgsl_cmdstream_readtimestamp {
220	unsigned int type;
221	unsigned int timestamp; /*output param */
222};
223
224#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_OLD \
225	_IOR(KGSL_IOC_TYPE, 0x11, struct kgsl_cmdstream_readtimestamp)
226
227#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP \
228	_IOWR(KGSL_IOC_TYPE, 0x11, struct kgsl_cmdstream_readtimestamp)
229
230/* free memory when the GPU reaches a given timestamp.
231 * gpuaddr specify a memory region created by a
232 * IOCTL_KGSL_SHAREDMEM_FROM_PMEM call
233 * type should be a value from enum kgsl_timestamp_type
234 */
235struct kgsl_cmdstream_freememontimestamp {
236	unsigned int gpuaddr;
237	unsigned int type;
238	unsigned int timestamp;
239};
240
241#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP \
242	_IOW(KGSL_IOC_TYPE, 0x12, struct kgsl_cmdstream_freememontimestamp)
243
244/* Previous versions of this header had incorrectly defined
245   IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP as a read-only ioctl instead
246   of a write only ioctl.  To ensure binary compatability, the following
247   #define will be used to intercept the incorrect ioctl
248*/
249
250#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_OLD \
251	_IOR(KGSL_IOC_TYPE, 0x12, struct kgsl_cmdstream_freememontimestamp)
252
253/* create a draw context, which is used to preserve GPU state.
254 * The flags field may contain a mask KGSL_CONTEXT_*  values
255 */
256struct kgsl_drawctxt_create {
257	unsigned int flags;
258	unsigned int drawctxt_id; /*output param */
259};
260
261#define IOCTL_KGSL_DRAWCTXT_CREATE \
262	_IOWR(KGSL_IOC_TYPE, 0x13, struct kgsl_drawctxt_create)
263
264/* destroy a draw context */
265struct kgsl_drawctxt_destroy {
266	unsigned int drawctxt_id;
267};
268
269#define IOCTL_KGSL_DRAWCTXT_DESTROY \
270	_IOW(KGSL_IOC_TYPE, 0x14, struct kgsl_drawctxt_destroy)
271
272/* add a block of pmem, fb, ashmem or user allocated address
273 * into the GPU address space */
274struct kgsl_map_user_mem {
275	int fd;
276	unsigned int gpuaddr;   /*output param */
277	unsigned int len;
278	unsigned int offset;
279	unsigned int hostptr;   /*input param */
280	enum kgsl_user_mem_type memtype;
281	unsigned int reserved;	/* May be required to add
282				params for another mem type */
283};
284
285#define IOCTL_KGSL_MAP_USER_MEM \
286	_IOWR(KGSL_IOC_TYPE, 0x15, struct kgsl_map_user_mem)
287
288struct kgsl_cmdstream_readtimestamp_ctxtid {
289	unsigned int context_id;
290	unsigned int type;
291	unsigned int timestamp; /*output param */
292};
293
294#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_CTXTID \
295	_IOWR(KGSL_IOC_TYPE, 0x16, struct kgsl_cmdstream_readtimestamp_ctxtid)
296
297struct kgsl_cmdstream_freememontimestamp_ctxtid {
298	unsigned int context_id;
299	unsigned int gpuaddr;
300	unsigned int type;
301	unsigned int timestamp;
302};
303
304#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_CTXTID \
305	_IOW(KGSL_IOC_TYPE, 0x17, \
306	struct kgsl_cmdstream_freememontimestamp_ctxtid)
307
308/* add a block of pmem or fb into the GPU address space */
309struct kgsl_sharedmem_from_pmem {
310	int pmem_fd;
311	unsigned int gpuaddr;	/*output param */
312	unsigned int len;
313	unsigned int offset;
314};
315
316#define IOCTL_KGSL_SHAREDMEM_FROM_PMEM \
317	_IOWR(KGSL_IOC_TYPE, 0x20, struct kgsl_sharedmem_from_pmem)
318
319/* remove memory from the GPU's address space */
320struct kgsl_sharedmem_free {
321	unsigned int gpuaddr;
322};
323
324#define IOCTL_KGSL_SHAREDMEM_FREE \
325	_IOW(KGSL_IOC_TYPE, 0x21, struct kgsl_sharedmem_free)
326
327struct kgsl_cff_user_event {
328	unsigned char cff_opcode;
329	unsigned int op1;
330	unsigned int op2;
331	unsigned int op3;
332	unsigned int op4;
333	unsigned int op5;
334	unsigned int __pad[2];
335};
336
337#define IOCTL_KGSL_CFF_USER_EVENT \
338	_IOW(KGSL_IOC_TYPE, 0x31, struct kgsl_cff_user_event)
339
340struct kgsl_gmem_desc {
341	unsigned int x;
342	unsigned int y;
343	unsigned int width;
344	unsigned int height;
345	unsigned int pitch;
346};
347
348struct kgsl_buffer_desc {
349	void 			*hostptr;
350	unsigned int	gpuaddr;
351	int				size;
352	unsigned int	format;
353	unsigned int  	pitch;
354	unsigned int  	enabled;
355};
356
357struct kgsl_bind_gmem_shadow {
358	unsigned int drawctxt_id;
359	struct kgsl_gmem_desc gmem_desc;
360	unsigned int shadow_x;
361	unsigned int shadow_y;
362	struct kgsl_buffer_desc shadow_buffer;
363	unsigned int buffer_id;
364};
365
366#define IOCTL_KGSL_DRAWCTXT_BIND_GMEM_SHADOW \
367    _IOW(KGSL_IOC_TYPE, 0x22, struct kgsl_bind_gmem_shadow)
368
369/* add a block of memory into the GPU address space */
370struct kgsl_sharedmem_from_vmalloc {
371	unsigned int gpuaddr;	/*output param */
372	unsigned int hostptr;
373	unsigned int flags;
374};
375
376#define IOCTL_KGSL_SHAREDMEM_FROM_VMALLOC \
377	_IOWR(KGSL_IOC_TYPE, 0x23, struct kgsl_sharedmem_from_vmalloc)
378
379#define IOCTL_KGSL_SHAREDMEM_FLUSH_CACHE \
380	_IOW(KGSL_IOC_TYPE, 0x24, struct kgsl_sharedmem_free)
381
382struct kgsl_drawctxt_set_bin_base_offset {
383	unsigned int drawctxt_id;
384	unsigned int offset;
385};
386
387#define IOCTL_KGSL_DRAWCTXT_SET_BIN_BASE_OFFSET \
388	_IOW(KGSL_IOC_TYPE, 0x25, struct kgsl_drawctxt_set_bin_base_offset)
389
390enum kgsl_cmdwindow_type {
391	KGSL_CMDWINDOW_MIN     = 0x00000000,
392	KGSL_CMDWINDOW_2D      = 0x00000000,
393	KGSL_CMDWINDOW_3D      = 0x00000001, /* legacy */
394	KGSL_CMDWINDOW_MMU     = 0x00000002,
395	KGSL_CMDWINDOW_ARBITER = 0x000000FF,
396	KGSL_CMDWINDOW_MAX     = 0x000000FF,
397};
398
399/* write to the command window */
400struct kgsl_cmdwindow_write {
401	enum kgsl_cmdwindow_type target;
402	unsigned int addr;
403	unsigned int data;
404};
405
406#define IOCTL_KGSL_CMDWINDOW_WRITE \
407	_IOW(KGSL_IOC_TYPE, 0x2e, struct kgsl_cmdwindow_write)
408
409struct kgsl_gpumem_alloc {
410	unsigned long gpuaddr;
411	size_t size;
412	unsigned int flags;
413};
414
415#define IOCTL_KGSL_GPUMEM_ALLOC \
416	_IOWR(KGSL_IOC_TYPE, 0x2f, struct kgsl_gpumem_alloc)
417
418struct kgsl_cff_syncmem {
419	unsigned int gpuaddr;
420	unsigned int len;
421	unsigned int __pad[2]; /* For future binary compatibility */
422};
423
424#define IOCTL_KGSL_CFF_SYNCMEM \
425	_IOW(KGSL_IOC_TYPE, 0x30, struct kgsl_cff_syncmem)
426
427/*
428 * A timestamp event allows the user space to register an action following an
429 * expired timestamp. Note IOCTL_KGSL_TIMESTAMP_EVENT has been redefined to
430 * _IOWR to support fences which need to return a fd for the priv parameter.
431 */
432
433struct kgsl_timestamp_event {
434	int type;                /* Type of event (see list below) */
435	unsigned int timestamp;  /* Timestamp to trigger event on */
436	unsigned int context_id; /* Context for the timestamp */
437	void *priv;              /* Pointer to the event specific blob */
438	size_t len;              /* Size of the event specific blob */
439};
440
441#define IOCTL_KGSL_TIMESTAMP_EVENT_OLD \
442	_IOW(KGSL_IOC_TYPE, 0x31, struct kgsl_timestamp_event)
443
444/* A genlock timestamp event releases an existing lock on timestamp expire */
445
446#define KGSL_TIMESTAMP_EVENT_GENLOCK 1
447
448struct kgsl_timestamp_event_genlock {
449	int handle; /* Handle of the genlock lock to release */
450};
451
452/* A fence timestamp event releases an existing lock on timestamp expire */
453
454#define KGSL_TIMESTAMP_EVENT_FENCE 2
455
456struct kgsl_timestamp_event_fence {
457	int fence_fd; /* Fence to signal */
458};
459
460/*
461 * Set a property within the kernel.  Uses the same structure as
462 * IOCTL_KGSL_GETPROPERTY
463 */
464
465#define IOCTL_KGSL_SETPROPERTY \
466	_IOW(KGSL_IOC_TYPE, 0x32, struct kgsl_device_getproperty)
467
468#define IOCTL_KGSL_TIMESTAMP_EVENT \
469	_IOWR(KGSL_IOC_TYPE, 0x33, struct kgsl_timestamp_event)
470
471#ifdef __KERNEL__
472#ifdef CONFIG_MSM_KGSL_DRM
473int kgsl_gem_obj_addr(int drm_fd, int handle, unsigned long *start,
474			unsigned long *len);
475#else
476#define kgsl_gem_obj_addr(...) 0
477#endif
478#endif
479#endif /* _MSM_KGSL_H */
480