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