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