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