1eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#ifndef _MSM_KGSL_H
2eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define _MSM_KGSL_H
3eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
4eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#include <linux/types.h>
5eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#include <linux/ioctl.h>
6eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
7eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
8eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * The KGSL version has proven not to be very useful in userspace if features
9eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * are cherry picked into other trees out of order so it is frozen as of 3.14.
10eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * It is left here for backwards compatabilty and as a reminder that
11eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * software releases are never linear. Also, I like pie.
12eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
13eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
14eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_VERSION_MAJOR        3
15eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_VERSION_MINOR        14
16eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
17eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
18eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * We have traditionally mixed context and issueibcmds / command batch flags
19eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * together into a big flag stew. This worked fine until we started adding a
20eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * lot more command batch flags and we started running out of bits. Turns out
21eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * we have a bit of room in the context type / priority mask that we could use
22eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * for command batches, but that means we need to split out the flags into two
23eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * coherent sets.
24eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
25eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * If any future definitions are for both context and cmdbatch add both defines
26eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * and link the cmdbatch to the context define as we do below. Otherwise feel
27eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * free to add exclusive bits to either set.
28eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
29eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
30eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* --- context flags --- */
31eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_SAVE_GMEM		0x00000001
32eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_NO_GMEM_ALLOC	0x00000002
33eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* This is a cmdbatch exclusive flag - use the CMDBATCH equivalent instead */
34eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_SUBMIT_IB_LIST	0x00000004
35eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_CTX_SWITCH		0x00000008
36eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREAMBLE		0x00000010
37eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TRASH_STATE	0x00000020
38eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PER_CONTEXT_TS	0x00000040
39eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_USER_GENERATED_TS	0x00000080
40eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* This is a cmdbatch exclusive flag - use the CMDBATCH equivalent instead */
41eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_END_OF_FRAME	0x00000100
42eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_NO_FAULT_TOLERANCE 0x00000200
43eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* This is a cmdbatch exclusive flag - use the CMDBATCH equivalent instead */
44eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_SYNC               0x00000400
45eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PWR_CONSTRAINT     0x00000800
46eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PRIORITY_MASK      0x0000F000
47eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PRIORITY_SHIFT     12
48eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PRIORITY_UNDEF     0
49eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
50eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_IFH_NOP            0x00010000
51eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_SECURE             0x00020000
52eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_NO_SNAPSHOT        0x00040000
53eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_SPARSE             0x00080000
54eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
55eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREEMPT_STYLE_MASK       0x0E000000
56eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREEMPT_STYLE_SHIFT      25
57eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREEMPT_STYLE_DEFAULT    0x0
58eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREEMPT_STYLE_RINGBUFFER 0x1
59eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_PREEMPT_STYLE_FINEGRAIN  0x2
60eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
61eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_MASK          0x01F00000
62eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_SHIFT         20
63eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_ANY		0
64eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_GL		1
65eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_CL		2
66eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_C2D		3
67eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_RS		4
68eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_TYPE_UNKNOWN	0x1E
69eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
70203194d7eb6c14621882b043e28839e6045f9dbfThierry Strudel#define KGSL_CONTEXT_INVALIDATE_ON_FAULT 0x10000000
71203194d7eb6c14621882b043e28839e6045f9dbfThierry Strudel
72eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONTEXT_INVALID 0xffffffff
73eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
74eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
75eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * --- command batch flags ---
76eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * The bits that are linked to a KGSL_CONTEXT equivalent are either legacy
77eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * definitions or bits that are valid for both contexts and cmdbatches.  To be
78eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * safe the other 8 bits that are still available in the context field should be
79eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * omitted here in case we need to share - the other bits are available for
80eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * cmdbatch only flags as needed
81eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
82eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_MEMLIST		0x00000001
83eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_MARKER		0x00000002
84eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_SUBMIT_IB_LIST	KGSL_CONTEXT_SUBMIT_IB_LIST /* 0x004 */
85eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_CTX_SWITCH	KGSL_CONTEXT_CTX_SWITCH     /* 0x008 */
86eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_PROFILING		0x00000010
87eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
88eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_CMDBATCH_PROFILING must also be set for KGSL_CMDBATCH_PROFILING_KTIME
89eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * to take effect, as the latter only affects the time data returned.
90eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
91eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_PROFILING_KTIME	0x00000020
92eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_END_OF_FRAME	KGSL_CONTEXT_END_OF_FRAME   /* 0x100 */
93eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_SYNC		KGSL_CONTEXT_SYNC           /* 0x400 */
94eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_PWR_CONSTRAINT	KGSL_CONTEXT_PWR_CONSTRAINT /* 0x800 */
95eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDBATCH_SPARSE	    0x1000 /* 0x1000 */
96eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
97eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
98eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Reserve bits [16:19] and bits [28:31] for possible bits shared between
99eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * contexts and command batches.  Update this comment as new flags are added.
100eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
101eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
102eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
103eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * gpu_command_object flags - these flags communicate the type of command or
104eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * memory object being submitted for a GPU command
105eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
106eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
107eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flags for GPU command objects */
108eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDLIST_IB                  0x00000001U
109eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDLIST_CTXTSWITCH_PREAMBLE 0x00000002U
110eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMDLIST_IB_PREAMBLE         0x00000004U
111eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
112eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flags for GPU command memory objects */
113eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_OBJLIST_MEMOBJ  0x00000008U
114eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_OBJLIST_PROFILE 0x00000010U
115eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
116eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flags for GPU command sync points */
117eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMD_SYNCPOINT_TYPE_TIMESTAMP 0
118eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CMD_SYNCPOINT_TYPE_FENCE 1
119eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
120eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* --- Memory allocation flags --- */
121eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
122eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* General allocation hints */
123eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_SECURE      0x00000008ULL
124eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_GPUREADONLY 0x01000000U
125eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_GPUWRITEONLY 0x02000000U
126eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_FORCE_32BIT 0x100000000ULL
127eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
128eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flag for binding all the virt range to single phys data */
129eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_SPARSE_BIND_MULTIPLE_TO_PHYS 0x400000000ULL
130eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_SPARSE_BIND 0x1ULL
131eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_SPARSE_UNBIND 0x2ULL
132eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
133eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Memory caching hints */
134eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_MASK       0x0C000000U
135eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_SHIFT 26
136eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
137eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_WRITECOMBINE 0
138eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_UNCACHED 1
139eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_WRITETHROUGH 2
140eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CACHEMODE_WRITEBACK 3
141eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
142eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USE_CPU_MAP 0x10000000ULL
143eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_SPARSE_PHYS 0x20000000ULL
144eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_SPARSE_VIRT 0x40000000ULL
145eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
146eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Memory types for which allocations are made */
147eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_MASK		0x0000FF00
148eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_SHIFT		8
149eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
150eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_OBJECTANY			0
151eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_FRAMEBUFFER		1
152eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_RENDERBUFFER		2
153eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_ARRAYBUFFER		3
154eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_ELEMENTARRAYBUFFER		4
155eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_VERTEXARRAYBUFFER		5
156eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_TEXTURE			6
157eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_SURFACE			7
158eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_EGL_SURFACE		8
159eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_GL				9
160eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL				10
161eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL_BUFFER_MAP		11
162eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL_BUFFER_NOMAP		12
163eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL_IMAGE_MAP		13
164eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL_IMAGE_NOMAP		14
165eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_CL_KERNEL_STACK		15
166eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_COMMAND			16
167eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_2D				17
168eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_EGL_IMAGE			18
169eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_EGL_SHADOW			19
170eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_MULTISAMPLE		20
171eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMTYPE_KERNEL			255
172eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
173eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
174eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Alignment hint, passed as the power of 2 exponent.
175eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * i.e 4k (2^12) would be 12, 64k (2^16)would be 16.
176eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
177eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMALIGN_MASK		0x00FF0000
178eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMALIGN_SHIFT		16
179eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
180eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelenum kgsl_user_mem_type {
181eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_PMEM		= 0x00000000,
182eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_ASHMEM	= 0x00000001,
183eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_ADDR		= 0x00000002,
184eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_ION		= 0x00000003,
185eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	/*
186eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	 * ION type is retained for backwards compatibilty but Ion buffers are
187eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	 * dma-bufs so try to use that naming if we can
188eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	 */
189eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_DMABUF       = 0x00000003,
190eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_USER_MEM_TYPE_MAX		= 0x00000007,
191eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
192eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_MASK 0x000000e0
193eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_SHIFT 5
194eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
195eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
196eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Unfortunately, enum kgsl_user_mem_type starts at 0 which does not
197eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * leave a good value for allocated memory. In the flags we use
198eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * 0 to indicate allocated memory and thus need to add 1 to the enum
199eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * values.
200eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
201eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_USERMEM_FLAG(x) (((x) + 1) << KGSL_MEMFLAGS_USERMEM_SHIFT)
202eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
203eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_NOT_USERMEM 0
204eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_PMEM KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_PMEM)
205eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_ASHMEM \
206eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel		KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ASHMEM)
207eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_ADDR KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ADDR)
208eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMFLAGS_USERMEM_ION KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ION)
209eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
210eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* --- generic KGSL flag values --- */
211eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
212eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_NORMALMODE  0x00000000
213eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_SAFEMODE    0x00000001
214eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_INITIALIZED0 0x00000002
215eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_INITIALIZED 0x00000004
216eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_STARTED     0x00000008
217eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_ACTIVE      0x00000010
218eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_RESERVED0   0x00000020
219eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_RESERVED1   0x00000040
220eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_RESERVED2   0x00000080
221eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_SOFT_RESET  0x00000100
222eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_FLAGS_PER_CONTEXT_TIMESTAMPS 0x00000200
223eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
224eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Server Side Sync Timeout in milliseconds */
225eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_SYNCOBJ_SERVER_TIMEOUT 2000
226eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
227eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
228eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Reset status values for context
229eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
230eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelenum kgsl_ctx_reset_stat {
231eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CTX_STAT_NO_ERROR				= 0x00000000,
232eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CTX_STAT_GUILTY_CONTEXT_RESET_EXT		= 0x00000001,
233eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CTX_STAT_INNOCENT_CONTEXT_RESET_EXT	= 0x00000002,
234eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CTX_STAT_UNKNOWN_CONTEXT_RESET_EXT		= 0x00000003
235eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
236eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
237eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONVERT_TO_MBPS(val) \
238eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	(val*1000*1000U)
239eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
240eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* device id */
241eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelenum kgsl_deviceid {
242eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_DEVICE_3D0		= 0x00000000,
243eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_DEVICE_MAX
244eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
245eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
246eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_devinfo {
247eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
248eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int device_id;
249eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	/* chip revision id
250eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	* coreid:8 majorrev:8 minorrev:8 patch:8
251eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	*/
252eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int chip_id;
253eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int mmu_enabled;
254eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gmem_gpubaseaddr;
255eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	/*
256eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	* This field contains the adreno revision
257eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	* number 200, 205, 220, etc...
258eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	*/
259eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int gpu_id;
260eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t gmem_sizebytes;
261eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
262eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
263eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
264eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_devmemstore - this structure defines the region of memory
265eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * that can be mmap()ed from this driver. The timestamp fields are __volatile__
266eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * because they are written by the GPU
267eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @soptimestamp: Start of pipeline timestamp written by GPU before the
268eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * commands in concern are processed
269eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sbz: Unused, kept for 8 byte alignment
270eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @eoptimestamp: End of pipeline timestamp written by GPU after the
271eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * commands in concern are processed
272eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sbz2: Unused, kept for 8 byte alignment
273eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @preempted: Indicates if the context was preempted
274eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sbz3: Unused, kept for 8 byte alignment
275eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @ref_wait_ts: Timestamp on which to generate interrupt, unused now.
276eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sbz4: Unused, kept for 8 byte alignment
277eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @current_context: The current context the GPU is working on
278eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sbz5: Unused, kept for 8 byte alignment
279eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
280eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_devmemstore {
281eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	__volatile__ unsigned int soptimestamp;
282eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sbz;
283eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	__volatile__ unsigned int eoptimestamp;
284eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sbz2;
285eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	__volatile__ unsigned int preempted;
286eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sbz3;
287eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	__volatile__ unsigned int ref_wait_ts;
288eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sbz4;
289eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int current_context;
290eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sbz5;
291eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
292eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
293eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_MEMSTORE_OFFSET(ctxt_id, field) \
294eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	((ctxt_id)*sizeof(struct kgsl_devmemstore) + \
295eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	 offsetof(struct kgsl_devmemstore, field))
296eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
297eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* timestamp id*/
298eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelenum kgsl_timestamp_type {
299eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_TIMESTAMP_CONSUMED = 0x00000001, /* start-of-pipeline timestamp */
300eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_TIMESTAMP_RETIRED  = 0x00000002, /* end-of-pipeline timestamp*/
301eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_TIMESTAMP_QUEUED   = 0x00000003,
302eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
303eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
304eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* property types - used with kgsl_device_getproperty */
305eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_DEVICE_INFO		0x1
306eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_DEVICE_SHADOW		0x2
307eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_DEVICE_POWER		0x3
308eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_SHMEM			0x4
309eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_SHMEM_APERTURES	0x5
310eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_MMU_ENABLE		0x6
311eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_INTERRUPT_WAITS	0x7
312eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_VERSION		0x8
313eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_GPU_RESET_STAT	0x9
314eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_PWRCTRL		0xE
315eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_PWR_CONSTRAINT	0x12
316eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_UCHE_GMEM_VADDR	0x13
317eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_SP_GENERIC_MEM	0x14
318eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_UCODE_VERSION		0x15
319eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_GPMU_VERSION		0x16
320eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_HIGHEST_BANK_BIT	0x17
321eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_DEVICE_BITNESS	0x18
322eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PROP_DEVICE_QDSS_STM	0x19
32331c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudel#define KGSL_PROP_DEVICE_QTIMER	0x20
324eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
325eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_shadowprop {
326eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
327eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
328eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags; /* contains KGSL_FLAGS_ values */
329eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
330eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
331eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_qdss_stm_prop {
332eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpuaddr;
333eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
334eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
335eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
33631c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudelstruct kgsl_qtimer_prop {
33731c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudel	uint64_t gpuaddr;
33831c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudel	uint64_t size;
33931c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudel};
34031c96166ed82efe27caf9bf4ff6683b69d8e40b8Thierry Strudel
341eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_version {
342eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drv_major;
343eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drv_minor;
344eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int dev_major;
345eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int dev_minor;
346eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
347eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
348eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sp_generic_mem {
349eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t local;
350eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t pvt;
351eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
352eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
353eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_ucode_version {
354eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int pfp;
355eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int pm4;
356eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
357eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
358eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpmu_version {
359eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int major;
360eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int minor;
361eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int features;
362eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
363eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
364eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Performance counter groups */
365eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
366eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_CP 0x0
367eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_RBBM 0x1
368eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_PC 0x2
369eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_VFD 0x3
370eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_HLSQ 0x4
371eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_VPC 0x5
372eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TSE 0x6
373eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_RAS 0x7
374eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_UCHE 0x8
375eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TP 0x9
376eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_SP 0xA
377eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_RB 0xB
378eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_PWR 0xC
379eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_VBIF 0xD
380eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_VBIF_PWR 0xE
381eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_MH 0xF
382eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_PA_SU 0x10
383eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_SQ 0x11
384eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_SX 0x12
385eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TCF 0x13
386eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TCM 0x14
387eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TCR 0x15
388eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_L2 0x16
389eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_VSC 0x17
390eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_CCU 0x18
391eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_LRZ 0x19
392eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_CMP 0x1A
393eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_ALWAYSON 0x1B
394eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_SP_PWR 0x1C
395eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_TP_PWR 0x1D
396eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_RB_PWR 0x1E
397eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_CCU_PWR 0x1F
398eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_UCHE_PWR 0x20
399eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_CP_PWR 0x21
400eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_GPMU_PWR 0x22
401eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_ALWAYSON_PWR 0x23
402eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_GROUP_MAX 0x24
403eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
404eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_NOT_USED 0xFFFFFFFF
405eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_PERFCOUNTER_BROKEN 0xFFFFFFFE
406eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
407eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* structure holds list of ibs */
408eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_ibdesc {
409eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
410eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long __pad;
411eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t sizedwords;
412eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int ctrl;
413eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
414eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
415eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
416eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_cmdbatch_profiling_buffer
417eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @wall_clock_s: Ringbuffer submission time (seconds).
418eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *                If KGSL_CMDBATCH_PROFILING_KTIME is set, time is provided
419eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *                in kernel clocks, otherwise wall clock time is used.
420eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @wall_clock_ns: Ringbuffer submission time (nanoseconds).
421eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *                 If KGSL_CMDBATCH_PROFILING_KTIME is set time is provided
422eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *                 in kernel clocks, otherwise wall clock time is used.
423eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpu_ticks_queued: GPU ticks at ringbuffer submission
424eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpu_ticks_submitted: GPU ticks when starting cmdbatch execution
425eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpu_ticks_retired: GPU ticks when finishing cmdbatch execution
426eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
427eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This structure defines the profiling buffer used to measure cmdbatch
428eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * execution time
429eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
430eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdbatch_profiling_buffer {
431eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t wall_clock_s;
432eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t wall_clock_ns;
433eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpu_ticks_queued;
434eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpu_ticks_submitted;
435eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpu_ticks_retired;
436eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
437eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
438eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* ioctls */
439eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_IOC_TYPE 0x09
440eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
441eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* get misc info about the GPU
442eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   type should be a value from enum kgsl_property_type
443eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   value points to a structure that varies based on type
444eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   sizebytes is sizeof() that structure
445eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   for KGSL_PROP_DEVICE_INFO, use struct kgsl_devinfo
446eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   this structure contaings hardware versioning info.
447eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   for KGSL_PROP_DEVICE_SHADOW, use struct kgsl_shadowprop
448eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   this is used to find mmap() offset and sizes for mapping
449eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   struct kgsl_memstore into userspace.
450eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel*/
451eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_device_getproperty {
452eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
453eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	void *value;
454eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t sizebytes;
455eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
456eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
457eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DEVICE_GETPROPERTY \
458eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x2, struct kgsl_device_getproperty)
459eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
460eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* IOCTL_KGSL_DEVICE_READ (0x3) - removed 03/2012
461eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
462eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
463eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* block until the GPU has executed past a given timestamp
464eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * timeout is in milliseconds.
465eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
466eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_device_waittimestamp {
467eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
468eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timeout;
469eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
470eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
471eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DEVICE_WAITTIMESTAMP \
472eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x6, struct kgsl_device_waittimestamp)
473eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
474eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_device_waittimestamp_ctxtid {
475eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
476eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
477eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timeout;
478eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
479eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
480eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID \
481eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x7, struct kgsl_device_waittimestamp_ctxtid)
482eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
483eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* DEPRECATED: issue indirect commands to the GPU.
484eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * drawctxt_id must have been created with IOCTL_KGSL_DRAWCTXT_CREATE
485eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * ibaddr and sizedwords must specify a subset of a buffer created
486eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * with IOCTL_KGSL_SHAREDMEM_FROM_PMEM
487eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * flags may be a mask of KGSL_CONTEXT_ values
488eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * timestamp is a returned counter value which can be passed to
489eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * other ioctls to determine when the commands have been executed by
490eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * the GPU.
491eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
492eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This fucntion is deprecated - consider using IOCTL_KGSL_SUBMIT_COMMANDS
493eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * instead
494eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
495eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_ringbuffer_issueibcmds {
496eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drawctxt_id;
497eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long ibdesc_addr;
498eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numibs;
499eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp; /*output param */
500eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
501eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
502eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
503eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS \
504eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x10, struct kgsl_ringbuffer_issueibcmds)
505eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
506eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* read the most recently executed timestamp value
507eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * type should be a value from enum kgsl_timestamp_type
508eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
509eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdstream_readtimestamp {
510eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
511eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp; /*output param */
512eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
513eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
514eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_OLD \
515eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOR(KGSL_IOC_TYPE, 0x11, struct kgsl_cmdstream_readtimestamp)
516eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
517eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP \
518eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x11, struct kgsl_cmdstream_readtimestamp)
519eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
520eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* free memory when the GPU reaches a given timestamp.
521eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * gpuaddr specify a memory region created by a
522eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_SHAREDMEM_FROM_PMEM call
523eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * type should be a value from enum kgsl_timestamp_type
524eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
525eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdstream_freememontimestamp {
526eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
527eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
528eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
529eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
530eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
531eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP \
532eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x12, struct kgsl_cmdstream_freememontimestamp)
533eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
534eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Previous versions of this header had incorrectly defined
535eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP as a read-only ioctl instead
536eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   of a write only ioctl.  To ensure binary compatability, the following
537eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel   #define will be used to intercept the incorrect ioctl
538eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel*/
539eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
540eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_OLD \
541eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOR(KGSL_IOC_TYPE, 0x12, struct kgsl_cmdstream_freememontimestamp)
542eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
543eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* create a draw context, which is used to preserve GPU state.
544eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * The flags field may contain a mask KGSL_CONTEXT_*  values
545eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
546eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_drawctxt_create {
547eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
548eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drawctxt_id; /*output param */
549eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
550eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
551eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DRAWCTXT_CREATE \
552eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x13, struct kgsl_drawctxt_create)
553eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
554eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* destroy a draw context */
555eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_drawctxt_destroy {
556eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drawctxt_id;
557eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
558eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
559eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DRAWCTXT_DESTROY \
560eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x14, struct kgsl_drawctxt_destroy)
561eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
562eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* add a block of pmem, fb, ashmem or user allocated address
563eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * into the GPU address space */
564eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_map_user_mem {
565eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fd;
566eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;   /*output param */
567eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t len;
568eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t offset;
569eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long hostptr;   /*input param */
570eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	enum kgsl_user_mem_type memtype;
571eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
572eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
573eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
574eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_MAP_USER_MEM \
575eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x15, struct kgsl_map_user_mem)
576eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
577eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdstream_readtimestamp_ctxtid {
578eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
579eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
580eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp; /*output param */
581eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
582eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
583eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_CTXTID \
584eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x16, struct kgsl_cmdstream_readtimestamp_ctxtid)
585eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
586eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdstream_freememontimestamp_ctxtid {
587eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
588eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
589eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
590eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
591eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
592eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
593eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_CTXTID \
594eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x17, \
595eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_cmdstream_freememontimestamp_ctxtid)
596eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
597eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* add a block of pmem or fb into the GPU address space */
598eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sharedmem_from_pmem {
599eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel        int pmem_fd;
600eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel        unsigned long gpuaddr;  /*output param */
601eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel        unsigned int len;
602eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel        unsigned int offset;
603eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
604eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
605eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SHAREDMEM_FROM_PMEM \
606eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel        _IOWR(KGSL_IOC_TYPE, 0x20, struct kgsl_sharedmem_from_pmem)
607eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
608eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* remove memory from the GPU's address space */
609eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sharedmem_free {
610eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
611eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
612eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
613eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SHAREDMEM_FREE \
614eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x21, struct kgsl_sharedmem_free)
615eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
616eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cff_user_event {
617eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned char cff_opcode;
618eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op1;
619eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op2;
620eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op3;
621eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op4;
622eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op5;
623eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2];
624eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
625eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
626eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CFF_USER_EVENT \
627eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x31, struct kgsl_cff_user_event)
628eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
629eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gmem_desc {
630eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int x;
631eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int y;
632eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int width;
633eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int height;
634eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int pitch;
635eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
636eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
637eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_buffer_desc {
638eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	void 			*hostptr;
639eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long	gpuaddr;
640eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int				size;
641eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int	format;
642eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int  	pitch;
643eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int  	enabled;
644eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
645eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
646eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_bind_gmem_shadow {
647eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drawctxt_id;
648eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_gmem_desc gmem_desc;
649eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int shadow_x;
650eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int shadow_y;
651eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_buffer_desc shadow_buffer;
652eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int buffer_id;
653eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
654eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
655eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DRAWCTXT_BIND_GMEM_SHADOW \
656eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel    _IOW(KGSL_IOC_TYPE, 0x22, struct kgsl_bind_gmem_shadow)
657eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
658eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* add a block of memory into the GPU address space */
659eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
660eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
661eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_SHAREDMEM_FROM_VMALLOC deprecated 09/2012
662eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * use IOCTL_KGSL_GPUMEM_ALLOC instead
663eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
664eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
665eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sharedmem_from_vmalloc {
666eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;	/*output param */
667eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int hostptr;
668eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
669eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
670eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
671eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SHAREDMEM_FROM_VMALLOC \
672eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x23, struct kgsl_sharedmem_from_vmalloc)
673eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
674eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
675eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This is being deprecated in favor of IOCTL_KGSL_GPUMEM_CACHE_SYNC which
676eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * supports both directions (flush and invalidate). This code will still
677eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * work, but by definition it will do a flush of the cache which might not be
678eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * what you want to have happen on a buffer following a GPU operation.  It is
679eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * safer to go with IOCTL_KGSL_GPUMEM_CACHE_SYNC
680eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
681eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
682eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SHAREDMEM_FLUSH_CACHE \
683eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x24, struct kgsl_sharedmem_free)
684eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
685eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_drawctxt_set_bin_base_offset {
686eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int drawctxt_id;
687eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int offset;
688eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
689eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
690eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_DRAWCTXT_SET_BIN_BASE_OFFSET \
691eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x25, struct kgsl_drawctxt_set_bin_base_offset)
692eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
693eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelenum kgsl_cmdwindow_type {
694eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_MIN     = 0x00000000,
695eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_2D      = 0x00000000,
696eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_3D      = 0x00000001, /* legacy */
697eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_MMU     = 0x00000002,
698eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_ARBITER = 0x000000FF,
699eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	KGSL_CMDWINDOW_MAX     = 0x000000FF,
700eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
701eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
702eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* write to the command window */
703eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmdwindow_write {
704eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	enum kgsl_cmdwindow_type target;
705eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int addr;
706eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int data;
707eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
708eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
709eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CMDWINDOW_WRITE \
710eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x2e, struct kgsl_cmdwindow_write)
711eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
712eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_alloc {
713eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr; /* output param */
714eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
715eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
716eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
717eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
718eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_ALLOC \
719eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x2f, struct kgsl_gpumem_alloc)
720eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
721eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cff_syncmem {
722eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
723eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t len;
724eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2]; /* For future binary compatibility */
725eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
726eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
727eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CFF_SYNCMEM \
728eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x30, struct kgsl_cff_syncmem)
729eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
730eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
731eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * A timestamp event allows the user space to register an action following an
732eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * expired timestamp. Note IOCTL_KGSL_TIMESTAMP_EVENT has been redefined to
733eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * _IOWR to support fences which need to return a fd for the priv parameter.
734eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
735eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
736eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_timestamp_event {
737eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int type;                /* Type of event (see list below) */
738eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;  /* Timestamp to trigger event on */
739eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id; /* Context for the timestamp */
740eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	void *priv;	 /* Pointer to the event specific blob */
741eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t len;              /* Size of the event specific blob */
742eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
743eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
744eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_TIMESTAMP_EVENT_OLD \
745eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x31, struct kgsl_timestamp_event)
746eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
747eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* A genlock timestamp event releases an existing lock on timestamp expire */
748eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
749eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_TIMESTAMP_EVENT_GENLOCK 1
750eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
751eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_timestamp_event_genlock {
752eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int handle; /* Handle of the genlock lock to release */
753eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
754eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
755eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* A fence timestamp event releases an existing lock on timestamp expire */
756eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
757eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_TIMESTAMP_EVENT_FENCE 2
758eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
759eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_timestamp_event_fence {
760eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fence_fd; /* Fence to signal */
761eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
762eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
763eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
764eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Set a property within the kernel.  Uses the same structure as
765eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_GETPROPERTY
766eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
767eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
768eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SETPROPERTY \
769eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x32, struct kgsl_device_getproperty)
770eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
771eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_TIMESTAMP_EVENT \
772eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x33, struct kgsl_timestamp_event)
773eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
774eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
775eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpumem_alloc_id - argument to IOCTL_KGSL_GPUMEM_ALLOC_ID
776eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: returned id value for this allocation.
777eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: mask of KGSL_MEM* values requested and actual flags on return.
778eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: requested size of the allocation and actual size on return.
779eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @mmapsize: returned size to pass to mmap() which may be larger than 'size'
780eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: returned GPU address for the allocation
781eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
782eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Allocate memory for access by the GPU. The flags and size fields are echoed
783eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * back by the kernel, so that the caller can know if the request was
784eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * adjusted.
785eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
786eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Supported flags:
787eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_MEMFLAGS_GPUREADONLY: the GPU will be unable to write to the buffer
788eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_MEMTYPE*: usage hint for debugging aid
789eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_MEMALIGN*: alignment hint, may be ignored or adjusted by the kernel.
790eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_MEMFLAGS_USE_CPU_MAP: If set on call and return, the returned GPU
791eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * address will be 0. Calling mmap() will set the GPU address.
792eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
793eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_alloc_id {
794eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
795eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
796eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
797eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t mmapsize;
798eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
799eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use*/
800eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long __pad[2];
801eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
802eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
803eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_ALLOC_ID \
804eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x34, struct kgsl_gpumem_alloc_id)
805eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
806eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
807eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpumem_free_id - argument to IOCTL_KGSL_GPUMEM_FREE_ID
808eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: GPU allocation id to free
809eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
810eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Free an allocation by id, in case a GPU address has not been assigned or
811eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * is unknown. Freeing an allocation by id with this ioctl or by GPU address
812eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * with IOCTL_KGSL_SHAREDMEM_FREE are equivalent.
813eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
814eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_free_id {
815eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
816eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use*/
817eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad;
818eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
819eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
820eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_FREE_ID \
821eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x35, struct kgsl_gpumem_free_id)
822eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
823eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
824eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpumem_get_info - argument to IOCTL_KGSL_GPUMEM_GET_INFO
825eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: GPU address to query. Also set on return.
826eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: GPU allocation id to query. Also set on return.
827eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: returned mask of KGSL_MEM* values.
828eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: returned size of the allocation.
829eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @mmapsize: returned size to pass mmap(), which may be larger than 'size'
830eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @useraddr: returned address of the userspace mapping for this buffer
831eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
832eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This ioctl allows querying of all user visible attributes of an existing
833eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * allocation, by either the GPU address or the id returned by a previous
834eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * call to IOCTL_KGSL_GPUMEM_ALLOC_ID. Legacy allocation ioctls may not
835eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * return all attributes so this ioctl can be used to look them up if needed.
836eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
837eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
838eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_get_info {
839eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
840eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
841eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
842eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
843eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t mmapsize;
844eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long useraddr;
845eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use*/
846eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long __pad[4];
847eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
848eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
849eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_GET_INFO\
850eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x36, struct kgsl_gpumem_get_info)
851eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
852eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
853eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpumem_sync_cache - argument to IOCTL_KGSL_GPUMEM_SYNC_CACHE
854eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: GPU address of the buffer to sync.
855eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: id of the buffer to sync. Either gpuaddr or id is sufficient.
856eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @op: a mask of KGSL_GPUMEM_CACHE_* values
857eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset: offset into the buffer
858eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @length: number of bytes starting from offset to perform
859eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * the cache operation on
860eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
861eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Sync the L2 cache for memory headed to and from the GPU - this replaces
862eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * KGSL_SHAREDMEM_FLUSH_CACHE since it can handle cache management for both
863eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * directions
864eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
865eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
866eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_sync_cache {
867eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long gpuaddr;
868eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
869eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op;
870eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t offset;
871eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t length;
872eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
873eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
874eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_CLEAN (1 << 0)
875eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_TO_GPU KGSL_GPUMEM_CACHE_CLEAN
876eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
877eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_INV (1 << 1)
878eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_FROM_GPU KGSL_GPUMEM_CACHE_INV
879eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
880eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_FLUSH \
881eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	(KGSL_GPUMEM_CACHE_CLEAN | KGSL_GPUMEM_CACHE_INV)
882eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
883eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flag to ensure backwards compatibility of kgsl_gpumem_sync_cache struct */
884eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUMEM_CACHE_RANGE (1 << 31U)
885eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
886eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_SYNC_CACHE \
887eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x37, struct kgsl_gpumem_sync_cache)
888eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
889eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
890eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_perfcounter_get - argument to IOCTL_KGSL_PERFCOUNTER_GET
891eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @groupid: Performance counter group ID
892eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @countable: Countable to select within the group
893eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset: Return offset of the reserved LO counter
894eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset_hi: Return offset of the reserved HI counter
895eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
896eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Get an available performance counter from a specified groupid.  The offset
897eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * of the performance counter will be returned after successfully assigning
898eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * the countable to the counter for the specified group.  An error will be
899eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * returned and an offset of 0 if the groupid is invalid or there are no
900eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * more counters left.  After successfully getting a perfcounter, the user
901eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * must call kgsl_perfcounter_put(groupid, contable) when finished with
902eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * the perfcounter to clear up perfcounter resources.
903eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
904eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
905eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_perfcounter_get {
906eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int groupid;
907eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int countable;
908eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int offset;
909eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int offset_hi;
910eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
911eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad; /* For future binary compatibility */
912eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
913eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
914eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_PERFCOUNTER_GET \
915eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x38, struct kgsl_perfcounter_get)
916eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
917eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
918eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_perfcounter_put - argument to IOCTL_KGSL_PERFCOUNTER_PUT
919eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @groupid: Performance counter group ID
920eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @countable: Countable to release within the group
921eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
922eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Put an allocated performance counter to allow others to have access to the
923eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * resource that was previously taken.  This is only to be called after
924eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * successfully getting a performance counter from kgsl_perfcounter_get().
925eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
926eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
927eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_perfcounter_put {
928eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int groupid;
929eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int countable;
930eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
931eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2]; /* For future binary compatibility */
932eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
933eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
934eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_PERFCOUNTER_PUT \
935eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x39, struct kgsl_perfcounter_put)
936eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
937eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
938eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_perfcounter_query - argument to IOCTL_KGSL_PERFCOUNTER_QUERY
939eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @groupid: Performance counter group ID
940eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @countable: Return active countables array
941eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of active countables array
942eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @max_counters: Return total number counters for the group ID
943eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
944eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Query the available performance counters given a groupid.  The array
945eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * *countables is used to return the current active countables in counters.
946eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * The size of the array is passed in so the kernel will only write at most
947eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * size or counter->size for the group id.  The total number of available
948eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * counters for the group ID is returned in max_counters.
949eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * If the array or size passed in are invalid, then only the maximum number
950eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * of counters will be returned, no data will be written to *countables.
951eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * If the groupid is invalid an error code will be returned.
952eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
953eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
954eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_perfcounter_query {
955eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int groupid;
956eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	/* Array to return the current countable for up to size counters */
957eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int *countables;
958eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int count;
959eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int max_counters;
960eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
961eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2]; /* For future binary compatibility */
962eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
963eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
964eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_PERFCOUNTER_QUERY \
965eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x3A, struct kgsl_perfcounter_query)
966eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
967eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
968eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_perfcounter_query - argument to IOCTL_KGSL_PERFCOUNTER_QUERY
969eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @groupid: Performance counter group IDs
970eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @countable: Performance counter countable IDs
971eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @value: Return performance counter reads
972eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of all arrays (groupid/countable pair and return value)
973eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
974eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Read in the current value of a performance counter given by the groupid
975eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * and countable.
976eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
977eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
978eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
979eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_perfcounter_read_group {
980eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int groupid;
981eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int countable;
982eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned long long value;
983eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
984eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
985eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_perfcounter_read {
986eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_perfcounter_read_group *reads;
987eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int count;
988eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
989eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2]; /* For future binary compatibility */
990eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
991eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
992eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_PERFCOUNTER_READ \
993eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x3B, struct kgsl_perfcounter_read)
994eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
995eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpumem_sync_cache_bulk - argument to
996eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_GPUMEM_SYNC_CACHE_BULK
997eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id_list: list of GPU buffer ids of the buffers to sync
998eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @count: number of GPU buffer ids in id_list
999eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @op: a mask of KGSL_GPUMEM_CACHE_* values
1000eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1001eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Sync the cache for memory headed to and from the GPU. Certain
1002eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * optimizations can be made on the cache operation based on the total
1003eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * size of the working set of memory to be managed.
1004eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1005eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpumem_sync_cache_bulk {
1006eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int *id_list;
1007eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int count;
1008eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op;
1009eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1010eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[2]; /* For future binary compatibility */
1011eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1012eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1013eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUMEM_SYNC_CACHE_BULK \
1014eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x3C, struct kgsl_gpumem_sync_cache_bulk)
1015eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1016eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/*
1017eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_cmd_syncpoint_timestamp
1018eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: ID of a KGSL context
1019eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @timestamp: GPU timestamp
1020eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1021eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This structure defines a syncpoint comprising a context/timestamp pair. A
1022eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * list of these may be passed by IOCTL_KGSL_SUBMIT_COMMANDS to define
1023eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * dependencies that must be met before the command can be submitted to the
1024eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * hardware
1025eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1026eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmd_syncpoint_timestamp {
1027eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1028eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
1029eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1030eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1031eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmd_syncpoint_fence {
1032eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fd;
1033eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1034eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1035eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1036eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_cmd_syncpoint - Define a sync point for a command batch
1037eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: type of sync point defined here
1038eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @priv: Pointer to the type specific buffer
1039eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of the type specific buffer
1040eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1041eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This structure contains pointers defining a specific command sync point.
1042eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * The pointer and size should point to a type appropriate structure.
1043eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1044eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cmd_syncpoint {
1045eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int type;
1046eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	void *priv;
1047eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
1048eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1049eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1050eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flag to indicate that the cmdlist may contain memlists */
1051eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_IBDESC_MEMLIST 0x1
1052eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1053eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Flag to point out the cmdbatch profiling buffer in the memlist */
1054eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_IBDESC_PROFILING_BUFFER 0x2
1055eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1056eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1057eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_submit_commands - Argument to IOCTL_KGSL_SUBMIT_COMMANDS
1058eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: KGSL context ID that owns the commands
1059eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags:
1060eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @cmdlist: User pointer to a list of kgsl_ibdesc structures
1061eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numcmds: Number of commands listed in cmdlist
1062eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @synclist: User pointer to a list of kgsl_cmd_syncpoint structures
1063eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numsyncs: Number of sync points listed in synclist
1064eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @timestamp: On entry the a user defined timestamp, on exist the timestamp
1065eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * assigned to the command batch
1066eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1067eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This structure specifies a command to send to the GPU hardware.  This is
1068eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * similar to kgsl_issueibcmds expect that it doesn't support the legacy way to
1069eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * submit IB lists and it adds sync points to block the IB until the
1070eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * dependencies are satisified.  This entry point is the new and preferred way
1071eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * to submit commands to the GPU. The memory list can be used to specify all
1072eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * memory that is referrenced in the current set of commands.
1073eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1074eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1075eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_submit_commands {
1076eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1077eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
1078eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_ibdesc *cmdlist;
1079eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numcmds;
1080eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	struct kgsl_cmd_syncpoint *synclist;
1081eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numsyncs;
1082eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
1083eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1084eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[4];
1085eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1086eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1087eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SUBMIT_COMMANDS \
1088eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x3D, struct kgsl_submit_commands)
1089eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1090eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1091eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_device_constraint - device constraint argument
1092eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: KGSL context ID
1093eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: type of constraint i.e pwrlevel/none
1094eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @data: constraint data
1095eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: size of the constraint data
1096eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1097eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_device_constraint {
1098eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
1099eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1100eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	void *data;
1101eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	size_t size;
1102eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1103eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1104eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Constraint Type*/
1105eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONSTRAINT_NONE 0
1106eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONSTRAINT_PWRLEVEL 1
1107eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1108eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* PWRLEVEL constraint level*/
1109eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* set to min frequency */
1110eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONSTRAINT_PWR_MIN    0
1111eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* set to max frequency */
1112eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_CONSTRAINT_PWR_MAX    1
1113eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1114eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_device_constraint_pwrlevel {
1115eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int level;
1116eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1117eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1118eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1119eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_syncsource_create - Argument to IOCTL_KGSL_SYNCSOURCE_CREATE
1120eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: returned id for the syncsource that was created.
1121eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1122eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This ioctl creates a userspace sync timeline.
1123eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1124eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1125eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_syncsource_create {
1126eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1127eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1128eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[3];
1129eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1130eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1131eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SYNCSOURCE_CREATE \
1132eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x40, struct kgsl_syncsource_create)
1133eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1134eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1135eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_syncsource_destroy - Argument to IOCTL_KGSL_SYNCSOURCE_DESTROY
1136eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: syncsource id to destroy
1137eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1138eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * This ioctl creates a userspace sync timeline.
1139eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1140eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1141eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_syncsource_destroy {
1142eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1143eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1144eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[3];
1145eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1146eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1147eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SYNCSOURCE_DESTROY \
1148eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x41, struct kgsl_syncsource_destroy)
1149eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1150eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1151eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_syncsource_create_fence - Argument to
1152eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *     IOCTL_KGSL_SYNCSOURCE_CREATE_FENCE
1153eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: syncsource id
1154eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @fence_fd: returned sync_fence fd
1155eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1156eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Create a fence that may be signaled by userspace by calling
1157eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_SYNCSOURCE_SIGNAL_FENCE. There are no order dependencies between
1158eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * these fences.
1159eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1160eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_syncsource_create_fence {
1161eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1162eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fence_fd;
1163eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1164eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[4];
1165eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1166eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1167eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1168eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_syncsource_signal_fence - Argument to
1169eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *     IOCTL_KGSL_SYNCSOURCE_SIGNAL_FENCE
1170eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: syncsource id
1171eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @fence_fd: sync_fence fd to signal
1172eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1173eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Signal a fence that was created by a IOCTL_KGSL_SYNCSOURCE_CREATE_FENCE
1174eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * call using the same syncsource id. This allows a fence to be shared
1175eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * to other processes but only signaled by the process owning the fd
1176eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * used to create the fence.
1177eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1178eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SYNCSOURCE_CREATE_FENCE \
1179eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x42, struct kgsl_syncsource_create_fence)
1180eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1181eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_syncsource_signal_fence {
1182eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1183eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fence_fd;
1184eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* private: reserved for future use */
1185eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int __pad[4];
1186eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1187eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1188eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SYNCSOURCE_SIGNAL_FENCE \
1189eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x43, struct kgsl_syncsource_signal_fence)
1190eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1191eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1192eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_cff_sync_gpuobj - Argument to IOCTL_KGSL_CFF_SYNC_GPUOBJ
1193eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset: Offset into the GPU object to sync
1194eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @length: Number of bytes to sync
1195eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: ID of the GPU object to sync
1196eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1197eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_cff_sync_gpuobj {
1198eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t offset;
1199eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t length;
1200eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1201eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1202eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1203eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_CFF_SYNC_GPUOBJ \
1204eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x44, struct kgsl_cff_sync_gpuobj)
1205eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1206eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1207eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_alloc - Argument to IOCTL_KGSL_GPUOBJ_ALLOC
1208eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size in bytes of the object to allocate
1209eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: mask of KGSL_MEMFLAG_* bits
1210eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @va_len: Size in bytes of the virtual region to allocate
1211eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @mmapsize: Returns the mmap() size of the object
1212eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Returns the GPU object ID of the new object
1213eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @metadata_len: Length of the metdata to copy from the user
1214eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @metadata: Pointer to the user specified metadata to store for the object
1215eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1216eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_alloc {
1217eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1218eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1219eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t va_len;
1220eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t mmapsize;
1221eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1222eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int metadata_len;
1223eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t metadata;
1224eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1225eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1226eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/* Let the user know that this header supports the gpuobj metadata */
1227eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUOBJ_ALLOC_METADATA_MAX 64
1228eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1229eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_ALLOC \
1230eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x45, struct kgsl_gpuobj_alloc)
1231eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1232eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1233eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_free - Argument to IOCTL_KGLS_GPUOBJ_FREE
1234eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Mask of: KGSL_GUPOBJ_FREE_ON_EVENT
1235eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @priv: Pointer to the private object if KGSL_GPUOBJ_FREE_ON_EVENT is
1236eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * specified
1237eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: ID of the GPU object to free
1238eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: If KGSL_GPUOBJ_FREE_ON_EVENT is specified, the type of asynchronous
1239eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * event to free on
1240eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @len: Length of the data passed in priv
1241eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1242eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_free {
1243eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1244eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t priv;
1245eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1246eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
1247eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int len;
1248eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1249eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1250eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUOBJ_FREE_ON_EVENT 1
1251eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1252eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPU_EVENT_TIMESTAMP 1
1253eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPU_EVENT_FENCE     2
1254eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1255eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1256eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpu_event_timestamp - Specifies a timestamp event to free a GPU
1257eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * object on
1258eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: ID of the timestamp event to wait for
1259eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @timestamp: Timestamp of the timestamp event to wait for
1260eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1261eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpu_event_timestamp {
1262eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1263eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
1264eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1265eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1266eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1267eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpu_event_fence - Specifies a fence ID to to free a GPU object on
1268eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @fd: File descriptor for the fence
1269eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1270eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpu_event_fence {
1271eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fd;
1272eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1273eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1274eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_FREE \
1275eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x46, struct kgsl_gpuobj_free)
1276eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1277eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1278eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_info - argument to IOCTL_KGSL_GPUOBJ_INFO
1279eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: GPU address of the object
1280eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Current flags for the object
1281eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of the object
1282eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @va_len: VA size of the object
1283eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @va_addr: Virtual address of the object (if it is mapped)
1284eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * id - GPU object ID of the object to query
1285eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1286eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_info {
1287eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpuaddr;
1288eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1289eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1290eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t va_len;
1291eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t va_addr;
1292eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1293eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1294eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1295eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_INFO \
1296eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x47, struct kgsl_gpuobj_info)
1297eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1298eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1299eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_import - argument to IOCTL_KGSL_GPUOBJ_IMPORT
1300eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @priv: Pointer to the private data for the import type
1301eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @priv_len: Length of the private data
1302eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Mask of KGSL_MEMFLAG_ flags
1303eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: Type of the import (KGSL_USER_MEM_TYPE_*)
1304eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Returns the ID of the new GPU object
1305eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1306eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_import {
1307eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t priv;
1308eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t priv_len;
1309eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1310eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
1311eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1312eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1313eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1314eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1315eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_import_dma_buf - import a dmabuf object
1316eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @fd: File descriptor for the dma-buf object
1317eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1318eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_import_dma_buf {
1319eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	int fd;
1320eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1321eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1322eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1323eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_import_useraddr - import an object based on a useraddr
1324eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @virtaddr: Virtual address of the object to import
1325eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1326eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_import_useraddr {
1327eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t virtaddr;
1328eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1329eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1330eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_IMPORT \
1331eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x48, struct kgsl_gpuobj_import)
1332eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1333eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1334eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_sync_obj - Individual GPU object to sync
1335eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset: Offset within the GPU object to sync
1336eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @length: Number of bytes to sync
1337eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: ID of the GPU object to sync
1338eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @op: Cache operation to execute
1339eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1340eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1341eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_sync_obj {
1342eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t offset;
1343eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t length;
1344eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1345eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int op;
1346eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1347eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1348eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1349eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_sync - Argument for IOCTL_KGSL_GPUOBJ_SYNC
1350eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @objs: Pointer to an array of kgsl_gpuobj_sync_obj structs
1351eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @obj_len: Size of each item in the array
1352eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @count: Number of items in the array
1353eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1354eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1355eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_sync {
1356eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t objs;
1357eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int obj_len;
1358eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int count;
1359eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1360eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1361eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_SYNC \
1362eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x49, struct kgsl_gpuobj_sync)
1363eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1364eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1365eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_command_object - GPU command object
1366eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @offset: GPU address offset of the object
1367eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: GPU address of the object
1368eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of the object
1369eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Current flags for the object
1370eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id - GPU command object ID
1371eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1372eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_command_object {
1373eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t offset;
1374eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpuaddr;
1375eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1376eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int flags;
1377eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1378eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1379eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1380eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1381eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_command_syncpoint - GPU syncpoint object
1382eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @priv: Pointer to the type specific buffer
1383eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of the type specific buffer
1384eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: type of sync point defined here
1385eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1386eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_command_syncpoint {
1387eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t priv;
1388eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1389eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
1390eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1391eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1392eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1393eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_command_object - Argument for IOCTL_KGSL_GPU_COMMAND
1394eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Current flags for the object
1395eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @cmdlist: List of kgsl_command_objects for submission
1396eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @cmd_size: Size of kgsl_command_objects structure
1397eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numcmds: Number of kgsl_command_objects in command list
1398eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @objlist: List of kgsl_command_objects for tracking
1399eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @obj_size: Size of kgsl_command_objects structure
1400eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numobjs: Number of kgsl_command_objects in object list
1401eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @synclist: List of kgsl_command_syncpoints
1402eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sync_size: Size of kgsl_command_syncpoint structure
1403eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numsyncs: Number of kgsl_command_syncpoints in syncpoint list
1404eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: Context ID submittin ghte kgsl_gpu_command
1405eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @timestamp: Timestamp for the submitted commands
1406eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1407eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpu_command {
1408eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1409eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t cmdlist;
1410eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int cmdsize;
1411eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numcmds;
1412eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t objlist;
1413eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int objsize;
1414eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numobjs;
1415eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t synclist;
1416eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int syncsize;
1417eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numsyncs;
1418eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1419eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
1420eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1421eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1422eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPU_COMMAND \
1423eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x4A, struct kgsl_gpu_command)
1424eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1425eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1426eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_preemption_counters_query - argument to
1427eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_PREEMPTIONCOUNTER_QUERY
1428eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @counters: Return preemption counters array
1429eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size_user: Size allocated by userspace
1430eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size_priority_level: Size of preemption counters for each
1431eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * priority level
1432eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @max_priority_level: Return max number of priority levels
1433eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1434eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * Query the available preemption counters. The array counters
1435eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * is used to return preemption counters. The size of the array
1436eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * is passed in so the kernel will only write at most size_user
1437eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * or max available preemption counters.  The total number of
1438eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * preemption counters is returned in max_priority_level. If the
1439eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * array or size passed in are invalid, then an error is
1440eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * returned back.
1441eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1442eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_preemption_counters_query {
1443eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t counters;
1444eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int size_user;
1445eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int size_priority_level;
1446eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int max_priority_level;
1447eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1448eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1449eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_PREEMPTIONCOUNTER_QUERY \
1450eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x4B, struct kgsl_preemption_counters_query)
1451eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1452eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1453eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpuobj_set_info - argument for IOCTL_KGSL_GPUOBJ_SET_INFO
1454eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Flags to indicate which paramaters to change
1455eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @metadata:  If KGSL_GPUOBJ_SET_INFO_METADATA is set, a pointer to the new
1456eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * metadata
1457eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: GPU memory object ID to change
1458eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @metadata_len:  If KGSL_GPUOBJ_SET_INFO_METADATA is set, the length of the
1459eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * new metadata string
1460eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @type: If KGSL_GPUOBJ_SET_INFO_TYPE is set, the new type of the memory object
1461eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1462eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1463eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUOBJ_SET_INFO_METADATA (1 << 0)
1464eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define KGSL_GPUOBJ_SET_INFO_TYPE (1 << 1)
1465eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1466eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpuobj_set_info {
1467eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1468eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t metadata;
1469eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1470eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int metadata_len;
1471eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int type;
1472eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1473eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1474eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPUOBJ_SET_INFO \
1475eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x4C, struct kgsl_gpuobj_set_info)
1476eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1477eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1478eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_phys_alloc - Argument for IOCTL_KGSL_SPARSE_PHYS_ALLOC
1479eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size in bytes to back
1480eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @pagesize: Pagesize alignment required
1481eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Flags for this allocation
1482eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Returned ID for this allocation
1483eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1484eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_phys_alloc {
1485eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1486eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t pagesize;
1487eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1488eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1489eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1490eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1491eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SPARSE_PHYS_ALLOC \
1492eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x50, struct kgsl_sparse_phys_alloc)
1493eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1494eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1495eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_phys_free - Argument for IOCTL_KGSL_SPARSE_PHYS_FREE
1496eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: ID to free
1497eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1498eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_phys_free {
1499eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1500eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1501eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1502eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SPARSE_PHYS_FREE \
1503eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x51, struct kgsl_sparse_phys_free)
1504eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1505eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1506eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_virt_alloc - Argument for IOCTL_KGSL_SPARSE_VIRT_ALLOC
1507eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size in bytes to reserve
1508eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @pagesize: Pagesize alignment required
1509eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Flags for this allocation
1510eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Returned ID for this allocation
1511eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @gpuaddr: Returned GPU address for this allocation
1512eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1513eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_virt_alloc {
1514eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1515eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t pagesize;
1516eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1517eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t gpuaddr;
1518eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1519eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1520eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1521eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SPARSE_VIRT_ALLOC \
1522eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x52, struct kgsl_sparse_virt_alloc)
1523eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1524eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1525eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_virt_free - Argument for IOCTL_KGSL_SPARSE_VIRT_FREE
1526eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: ID to free
1527eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1528eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_virt_free {
1529eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1530eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1531eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1532eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SPARSE_VIRT_FREE \
1533eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x53, struct kgsl_sparse_virt_free)
1534eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1535eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1536eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_binding_object - Argument for kgsl_sparse_bind
1537eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @virtoffset: Offset into the virtual ID
1538eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @physoffset: Offset into the physical ID (bind only)
1539eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size in bytes to reserve
1540eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Flags for this kgsl_sparse_binding_object
1541eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Physical ID to bind (bind only)
1542eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1543eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_binding_object {
1544eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t virtoffset;
1545eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t physoffset;
1546eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t size;
1547eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1548eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1549eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1550eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1551eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1552eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_sparse_bind - Argument for IOCTL_KGSL_SPARSE_BIND
1553eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @list: List of kgsl_sparse_bind_objects to bind/unbind
1554eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Virtual ID to bind/unbind
1555eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @size: Size of kgsl_sparse_bind_object
1556eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @count: Number of elements in list
1557eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel *
1558eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1559eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_sparse_bind {
1560eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t list;
1561eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1562eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int size;
1563eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int count;
1564eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1565eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1566eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_SPARSE_BIND \
1567eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOW(KGSL_IOC_TYPE, 0x54, struct kgsl_sparse_bind)
1568eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1569eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel/**
1570eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * struct kgsl_gpu_sparse_command - Argument for
1571eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * IOCTL_KGSL_GPU_SPARSE_COMMAND
1572eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @flags: Current flags for the object
1573eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sparselist: List of kgsl_sparse_binding_object to bind/unbind
1574eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @synclist: List of kgsl_command_syncpoints
1575eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sparsesize: Size of kgsl_sparse_binding_object
1576eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numsparse: Number of elements in list
1577eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @sync_size: Size of kgsl_command_syncpoint structure
1578eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @numsyncs: Number of kgsl_command_syncpoints in syncpoint list
1579eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @context_id: Context ID submitting the kgsl_gpu_command
1580eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @timestamp: Timestamp for the submitted commands
1581eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel * @id: Virtual ID to bind/unbind
1582eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel */
1583eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudelstruct kgsl_gpu_sparse_command {
1584eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t flags;
1585eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t sparselist;
1586eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	uint64_t synclist;
1587eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int sparsesize;
1588eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numsparse;
1589eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int syncsize;
1590eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int numsyncs;
1591eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int context_id;
1592eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int timestamp;
1593eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	unsigned int id;
1594eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel};
1595eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1596eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#define IOCTL_KGSL_GPU_SPARSE_COMMAND \
1597eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel	_IOWR(KGSL_IOC_TYPE, 0x55, struct kgsl_gpu_sparse_command)
1598eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel
1599eaaae07f42deb6723ff2804e87964da172b94e6bThierry Strudel#endif /* _MSM_KGSL_H */
1600