• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * (C) Copyright Advanced Micro Devices, Inc. 2002, 2007
3  * Copyright (c) 2008-2009 QUALCOMM USA, INC.
4  *
5  * All source code in this file is licensed under the following license
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * version 2 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you can find it at http://www.fsf.org
18  */
19 #ifndef _MSM_KGSL_H
20 #define _MSM_KGSL_H
21 
22 /*context flags */
23 #define KGSL_CONTEXT_SAVE_GMEM		1
24 #define KGSL_CONTEXT_NO_GMEM_ALLOC	2
25 
26 /* generic flag values */
27 #define KGSL_FLAGS_NORMALMODE  0x00000000
28 #define KGSL_FLAGS_SAFEMODE    0x00000001
29 #define KGSL_FLAGS_INITIALIZED0 0x00000002
30 #define KGSL_FLAGS_INITIALIZED 0x00000004
31 #define KGSL_FLAGS_STARTED     0x00000008
32 #define KGSL_FLAGS_ACTIVE      0x00000010
33 #define KGSL_FLAGS_RESERVED0   0x00000020
34 #define KGSL_FLAGS_RESERVED1   0x00000040
35 #define KGSL_FLAGS_RESERVED2   0x00000080
36 
37 /* device id */
38 enum kgsl_deviceid {
39 	KGSL_DEVICE_ANY		= 0x00000000,
40 	KGSL_DEVICE_YAMATO	= 0x00000001,
41 	KGSL_DEVICE_G12		= 0x00000002,
42 	KGSL_DEVICE_MAX		= 0x00000002
43 };
44 
45 struct kgsl_devinfo {
46 
47 	unsigned int device_id;
48 	/* chip revision id
49 	* coreid:8 majorrev:8 minorrev:8 patch:8
50 	*/
51 	unsigned int chip_id;
52 	unsigned int mmu_enabled;
53 	unsigned int gmem_gpubaseaddr;
54 	/* if gmem_hostbaseaddr is NULL, we would know its not mapped into
55 	 * mmio space */
56 	unsigned int gmem_hostbaseaddr;
57 	unsigned int gmem_sizebytes;
58 };
59 
60 /* this structure defines the region of memory that can be mmap()ed from this
61    driver. The timestamp fields are volatile because they are written by the
62    GPU
63 */
64 struct kgsl_devmemstore {
65 	volatile unsigned int soptimestamp;
66 	unsigned int sbz;
67 	volatile unsigned int eoptimestamp;
68 	unsigned int sbz2;
69 	volatile unsigned int ts_cmp_enable;
70 	unsigned int sbz3;
71 	volatile unsigned int ref_wait_ts;
72 	unsigned int sbz4;
73 };
74 
75 #define KGSL_DEVICE_MEMSTORE_OFFSET(field) \
76 	offsetof(struct kgsl_devmemstore, field)
77 
78 
79 /* timestamp id*/
80 enum kgsl_timestamp_type {
81 	KGSL_TIMESTAMP_CONSUMED = 0x00000001, /* start-of-pipeline timestamp */
82 	KGSL_TIMESTAMP_RETIRED  = 0x00000002, /* end-of-pipeline timestamp*/
83 	KGSL_TIMESTAMP_MAX      = 0x00000002,
84 };
85 
86 /* property types - used with kgsl_device_getproperty */
87 enum kgsl_property_type {
88 	KGSL_PROP_DEVICE_INFO     = 0x00000001,
89 	KGSL_PROP_DEVICE_SHADOW   = 0x00000002,
90 	KGSL_PROP_DEVICE_POWER    = 0x00000003,
91 	KGSL_PROP_SHMEM           = 0x00000004,
92 	KGSL_PROP_SHMEM_APERTURES = 0x00000005,
93 	KGSL_PROP_MMU_ENABLE 	  = 0x00000006,
94 	KGSL_PROP_INTERRUPT_WAITS = 0x00000007,
95 };
96 
97 struct kgsl_shadowprop {
98 	unsigned int gpuaddr;
99 	unsigned int size;
100 	unsigned int flags; /* contains KGSL_FLAGS_ values */
101 };
102 
103 /* ioctls */
104 #define KGSL_IOC_TYPE 0x09
105 
106 /* get misc info about the GPU
107    type should be a value from enum kgsl_property_type
108    value points to a structure that varies based on type
109    sizebytes is sizeof() that structure
110    for KGSL_PROP_DEVICE_INFO, use struct kgsl_devinfo
111    this structure contaings hardware versioning info.
112    for KGSL_PROP_DEVICE_SHADOW, use struct kgsl_shadowprop
113    this is used to find mmap() offset and sizes for mapping
114    struct kgsl_memstore into userspace.
115 */
116 struct kgsl_device_getproperty {
117 	unsigned int type;
118 	void  *value;
119 	unsigned int sizebytes;
120 };
121 
122 #define IOCTL_KGSL_DEVICE_GETPROPERTY \
123 	_IOWR(KGSL_IOC_TYPE, 0x2, struct kgsl_device_getproperty)
124 
125 
126 /* read a GPU register.
127    offsetwords it the 32 bit word offset from the beginning of the
128    GPU register space.
129  */
130 struct kgsl_device_regread {
131 	unsigned int offsetwords;
132 	unsigned int value; /* output param */
133 };
134 
135 #define IOCTL_KGSL_DEVICE_REGREAD \
136 	_IOWR(KGSL_IOC_TYPE, 0x3, struct kgsl_device_regread)
137 
138 
139 /* block until the GPU has executed past a given timestamp
140  * timeout is in milliseconds.
141  */
142 struct kgsl_device_waittimestamp {
143 	unsigned int timestamp;
144 	unsigned int timeout;
145 };
146 
147 #define IOCTL_KGSL_DEVICE_WAITTIMESTAMP \
148 	_IOW(KGSL_IOC_TYPE, 0x6, struct kgsl_device_waittimestamp)
149 
150 
151 /* issue indirect commands to the GPU.
152  * drawctxt_id must have been created with IOCTL_KGSL_DRAWCTXT_CREATE
153  * ibaddr and sizedwords must specify a subset of a buffer created
154  * with IOCTL_KGSL_SHAREDMEM_FROM_PMEM
155  * flags may be a mask of KGSL_CONTEXT_ values
156  * timestamp is a returned counter value which can be passed to
157  * other ioctls to determine when the commands have been executed by
158  * the GPU.
159  */
160 struct kgsl_ringbuffer_issueibcmds {
161 	unsigned int drawctxt_id;
162 	unsigned int ibaddr;
163 	unsigned int sizedwords;
164 	unsigned int timestamp; /*output param */
165 	unsigned int flags;
166 };
167 
168 #define IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS \
169 	_IOWR(KGSL_IOC_TYPE, 0x10, struct kgsl_ringbuffer_issueibcmds)
170 
171 /* read the most recently executed timestamp value
172  * type should be a value from enum kgsl_timestamp_type
173  */
174 struct kgsl_cmdstream_readtimestamp {
175 	unsigned int type;
176 	unsigned int timestamp; /*output param */
177 };
178 
179 #define IOCTL_KGSL_CMDSTREAM_READTIMESTAMP \
180 	_IOR(KGSL_IOC_TYPE, 0x11, struct kgsl_cmdstream_readtimestamp)
181 
182 /* free memory when the GPU reaches a given timestamp.
183  * gpuaddr specify a memory region created by a
184  * IOCTL_KGSL_SHAREDMEM_FROM_PMEM call
185  * type should be a value from enum kgsl_timestamp_type
186  */
187 struct kgsl_cmdstream_freememontimestamp {
188 	unsigned int gpuaddr;
189 	unsigned int type;
190 	unsigned int timestamp;
191 };
192 
193 #define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP \
194 	_IOR(KGSL_IOC_TYPE, 0x12, struct kgsl_cmdstream_freememontimestamp)
195 
196 /* create a draw context, which is used to preserve GPU state.
197  * The flags field may contain a mask KGSL_CONTEXT_*  values
198  */
199 struct kgsl_drawctxt_create {
200 	unsigned int flags;
201 	unsigned int drawctxt_id; /*output param */
202 };
203 
204 #define IOCTL_KGSL_DRAWCTXT_CREATE \
205 	_IOWR(KGSL_IOC_TYPE, 0x13, struct kgsl_drawctxt_create)
206 
207 /* destroy a draw context */
208 struct kgsl_drawctxt_destroy {
209 	unsigned int drawctxt_id;
210 };
211 
212 #define IOCTL_KGSL_DRAWCTXT_DESTROY \
213 	_IOW(KGSL_IOC_TYPE, 0x14, struct kgsl_drawctxt_destroy)
214 
215 /* add a block of pmem or fb into the GPU address space */
216 struct kgsl_sharedmem_from_pmem {
217 	int pmem_fd;
218 	unsigned int gpuaddr;	/*output param */
219 	unsigned int len;
220 	unsigned int offset;
221 };
222 
223 #define IOCTL_KGSL_SHAREDMEM_FROM_PMEM \
224 	_IOWR(KGSL_IOC_TYPE, 0x20, struct kgsl_sharedmem_from_pmem)
225 
226 /* remove memory from the GPU's address space */
227 struct kgsl_sharedmem_free {
228 	unsigned int gpuaddr;
229 };
230 
231 #define IOCTL_KGSL_SHAREDMEM_FREE \
232 	_IOW(KGSL_IOC_TYPE, 0x21, struct kgsl_sharedmem_free)
233 
234 struct kgsl_gmem_desc {
235 	unsigned int x;
236 	unsigned int y;
237 	unsigned int width;
238 	unsigned int height;
239 	unsigned int pitch;
240 };
241 
242 struct kgsl_buffer_desc {
243 	void 		*hostptr;
244 	unsigned int	gpuaddr;
245 	int		size;
246 	unsigned int	format;
247 	unsigned int  	pitch;
248 	unsigned int  	enabled;
249 };
250 
251 struct kgsl_bind_gmem_shadow {
252 	unsigned int drawctxt_id;
253 	struct kgsl_gmem_desc gmem_desc;
254 	unsigned int shadow_x;
255 	unsigned int shadow_y;
256 	struct kgsl_buffer_desc shadow_buffer;
257 	unsigned int buffer_id;
258 };
259 
260 #define IOCTL_KGSL_DRAWCTXT_BIND_GMEM_SHADOW \
261     _IOW(KGSL_IOC_TYPE, 0x22, struct kgsl_bind_gmem_shadow)
262 
263 /* add a block of memory into the GPU address space */
264 struct kgsl_sharedmem_from_vmalloc {
265 	unsigned int gpuaddr;	/*output param */
266 	unsigned int hostptr;
267 	/* If set from user space then will attempt to
268 	 * allocate even if low watermark is crossed */
269 	int force_no_low_watermark;
270 };
271 
272 #define IOCTL_KGSL_SHAREDMEM_FROM_VMALLOC \
273 	_IOWR(KGSL_IOC_TYPE, 0x23, struct kgsl_sharedmem_from_vmalloc)
274 
275 #define IOCTL_KGSL_SHAREDMEM_FLUSH_CACHE \
276 	_IOW(KGSL_IOC_TYPE, 0x24, struct kgsl_sharedmem_free)
277 
278 struct kgsl_drawctxt_set_bin_base_offset {
279 	unsigned int drawctxt_id;
280 	unsigned int offset;
281 };
282 
283 #define IOCTL_KGSL_DRAWCTXT_SET_BIN_BASE_OFFSET \
284 	_IOW(KGSL_IOC_TYPE, 0x25, struct kgsl_drawctxt_set_bin_base_offset)
285 
286 #endif /* _MSM_KGSL_H */
287