1 /* $NetBSD: tegra_drm.h,v 1.2 2021/12/18 23:45:46 riastradh Exp $ */ 2 3 /* 4 * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 #ifndef _UAPI_TEGRA_DRM_H_ 26 #define _UAPI_TEGRA_DRM_H_ 27 28 #include "drm.h" 29 30 #if defined(__cplusplus) 31 extern "C" { 32 #endif 33 34 #define DRM_TEGRA_GEM_CREATE_TILED (1 << 0) 35 #define DRM_TEGRA_GEM_CREATE_BOTTOM_UP (1 << 1) 36 37 /** 38 * struct drm_tegra_gem_create - parameters for the GEM object creation IOCTL 39 */ 40 struct drm_tegra_gem_create { 41 /** 42 * @size: 43 * 44 * The size, in bytes, of the buffer object to be created. 45 */ 46 __u64 size; 47 48 /** 49 * @flags: 50 * 51 * A bitmask of flags that influence the creation of GEM objects: 52 * 53 * DRM_TEGRA_GEM_CREATE_TILED 54 * Use the 16x16 tiling format for this buffer. 55 * 56 * DRM_TEGRA_GEM_CREATE_BOTTOM_UP 57 * The buffer has a bottom-up layout. 58 */ 59 __u32 flags; 60 61 /** 62 * @handle: 63 * 64 * The handle of the created GEM object. Set by the kernel upon 65 * successful completion of the IOCTL. 66 */ 67 __u32 handle; 68 }; 69 70 /** 71 * struct drm_tegra_gem_mmap - parameters for the GEM mmap IOCTL 72 */ 73 struct drm_tegra_gem_mmap { 74 /** 75 * @handle: 76 * 77 * Handle of the GEM object to obtain an mmap offset for. 78 */ 79 __u32 handle; 80 81 /** 82 * @pad: 83 * 84 * Structure padding that may be used in the future. Must be 0. 85 */ 86 __u32 pad; 87 88 /** 89 * @offset: 90 * 91 * The mmap offset for the given GEM object. Set by the kernel upon 92 * successful completion of the IOCTL. 93 */ 94 __u64 offset; 95 }; 96 97 /** 98 * struct drm_tegra_syncpt_read - parameters for the read syncpoint IOCTL 99 */ 100 struct drm_tegra_syncpt_read { 101 /** 102 * @id: 103 * 104 * ID of the syncpoint to read the current value from. 105 */ 106 __u32 id; 107 108 /** 109 * @value: 110 * 111 * The current syncpoint value. Set by the kernel upon successful 112 * completion of the IOCTL. 113 */ 114 __u32 value; 115 }; 116 117 /** 118 * struct drm_tegra_syncpt_incr - parameters for the increment syncpoint IOCTL 119 */ 120 struct drm_tegra_syncpt_incr { 121 /** 122 * @id: 123 * 124 * ID of the syncpoint to increment. 125 */ 126 __u32 id; 127 128 /** 129 * @pad: 130 * 131 * Structure padding that may be used in the future. Must be 0. 132 */ 133 __u32 pad; 134 }; 135 136 /** 137 * struct drm_tegra_syncpt_wait - parameters for the wait syncpoint IOCTL 138 */ 139 struct drm_tegra_syncpt_wait { 140 /** 141 * @id: 142 * 143 * ID of the syncpoint to wait on. 144 */ 145 __u32 id; 146 147 /** 148 * @thresh: 149 * 150 * Threshold value for which to wait. 151 */ 152 __u32 thresh; 153 154 /** 155 * @timeout: 156 * 157 * Timeout, in milliseconds, to wait. 158 */ 159 __u32 timeout; 160 161 /** 162 * @value: 163 * 164 * The new syncpoint value after the wait. Set by the kernel upon 165 * successful completion of the IOCTL. 166 */ 167 __u32 value; 168 }; 169 170 #define DRM_TEGRA_NO_TIMEOUT (0xffffffff) 171 172 /** 173 * struct drm_tegra_open_channel - parameters for the open channel IOCTL 174 */ 175 struct drm_tegra_open_channel { 176 /** 177 * @client: 178 * 179 * The client ID for this channel. 180 */ 181 __u32 client; 182 183 /** 184 * @pad: 185 * 186 * Structure padding that may be used in the future. Must be 0. 187 */ 188 __u32 pad; 189 190 /** 191 * @context: 192 * 193 * The application context of this channel. Set by the kernel upon 194 * successful completion of the IOCTL. This context needs to be passed 195 * to the DRM_TEGRA_CHANNEL_CLOSE or the DRM_TEGRA_SUBMIT IOCTLs. 196 */ 197 __u64 context; 198 }; 199 200 /** 201 * struct drm_tegra_close_channel - parameters for the close channel IOCTL 202 */ 203 struct drm_tegra_close_channel { 204 /** 205 * @context: 206 * 207 * The application context of this channel. This is obtained from the 208 * DRM_TEGRA_OPEN_CHANNEL IOCTL. 209 */ 210 __u64 context; 211 }; 212 213 /** 214 * struct drm_tegra_get_syncpt - parameters for the get syncpoint IOCTL 215 */ 216 struct drm_tegra_get_syncpt { 217 /** 218 * @context: 219 * 220 * The application context identifying the channel for which to obtain 221 * the syncpoint ID. 222 */ 223 __u64 context; 224 225 /** 226 * @index: 227 * 228 * Index of the client syncpoint for which to obtain the ID. 229 */ 230 __u32 index; 231 232 /** 233 * @id: 234 * 235 * The ID of the given syncpoint. Set by the kernel upon successful 236 * completion of the IOCTL. 237 */ 238 __u32 id; 239 }; 240 241 /** 242 * struct drm_tegra_get_syncpt_base - parameters for the get wait base IOCTL 243 */ 244 struct drm_tegra_get_syncpt_base { 245 /** 246 * @context: 247 * 248 * The application context identifying for which channel to obtain the 249 * wait base. 250 */ 251 __u64 context; 252 253 /** 254 * @syncpt: 255 * 256 * ID of the syncpoint for which to obtain the wait base. 257 */ 258 __u32 syncpt; 259 260 /** 261 * @id: 262 * 263 * The ID of the wait base corresponding to the client syncpoint. Set 264 * by the kernel upon successful completion of the IOCTL. 265 */ 266 __u32 id; 267 }; 268 269 /** 270 * struct drm_tegra_syncpt - syncpoint increment operation 271 */ 272 struct drm_tegra_syncpt { 273 /** 274 * @id: 275 * 276 * ID of the syncpoint to operate on. 277 */ 278 __u32 id; 279 280 /** 281 * @incrs: 282 * 283 * Number of increments to perform for the syncpoint. 284 */ 285 __u32 incrs; 286 }; 287 288 /** 289 * struct drm_tegra_cmdbuf - structure describing a command buffer 290 */ 291 struct drm_tegra_cmdbuf { 292 /** 293 * @handle: 294 * 295 * Handle to a GEM object containing the command buffer. 296 */ 297 __u32 handle; 298 299 /** 300 * @offset: 301 * 302 * Offset, in bytes, into the GEM object identified by @handle at 303 * which the command buffer starts. 304 */ 305 __u32 offset; 306 307 /** 308 * @words: 309 * 310 * Number of 32-bit words in this command buffer. 311 */ 312 __u32 words; 313 314 /** 315 * @pad: 316 * 317 * Structure padding that may be used in the future. Must be 0. 318 */ 319 __u32 pad; 320 }; 321 322 /** 323 * struct drm_tegra_reloc - GEM object relocation structure 324 */ 325 struct drm_tegra_reloc { 326 struct { 327 /** 328 * @cmdbuf.handle: 329 * 330 * Handle to the GEM object containing the command buffer for 331 * which to perform this GEM object relocation. 332 */ 333 __u32 handle; 334 335 /** 336 * @cmdbuf.offset: 337 * 338 * Offset, in bytes, into the command buffer at which to 339 * insert the relocated address. 340 */ 341 __u32 offset; 342 } cmdbuf; 343 struct { 344 /** 345 * @target.handle: 346 * 347 * Handle to the GEM object to be relocated. 348 */ 349 __u32 handle; 350 351 /** 352 * @target.offset: 353 * 354 * Offset, in bytes, into the target GEM object at which the 355 * relocated data starts. 356 */ 357 __u32 offset; 358 } target; 359 360 /** 361 * @shift: 362 * 363 * The number of bits by which to shift relocated addresses. 364 */ 365 __u32 shift; 366 367 /** 368 * @pad: 369 * 370 * Structure padding that may be used in the future. Must be 0. 371 */ 372 __u32 pad; 373 }; 374 375 /** 376 * struct drm_tegra_waitchk - wait check structure 377 */ 378 struct drm_tegra_waitchk { 379 /** 380 * @handle: 381 * 382 * Handle to the GEM object containing a command stream on which to 383 * perform the wait check. 384 */ 385 __u32 handle; 386 387 /** 388 * @offset: 389 * 390 * Offset, in bytes, of the location in the command stream to perform 391 * the wait check on. 392 */ 393 __u32 offset; 394 395 /** 396 * @syncpt: 397 * 398 * ID of the syncpoint to wait check. 399 */ 400 __u32 syncpt; 401 402 /** 403 * @thresh: 404 * 405 * Threshold value for which to check. 406 */ 407 __u32 thresh; 408 }; 409 410 /** 411 * struct drm_tegra_submit - job submission structure 412 */ 413 struct drm_tegra_submit { 414 /** 415 * @context: 416 * 417 * The application context identifying the channel to use for the 418 * execution of this job. 419 */ 420 __u64 context; 421 422 /** 423 * @num_syncpts: 424 * 425 * The number of syncpoints operated on by this job. This defines the 426 * length of the array pointed to by @syncpts. 427 */ 428 __u32 num_syncpts; 429 430 /** 431 * @num_cmdbufs: 432 * 433 * The number of command buffers to execute as part of this job. This 434 * defines the length of the array pointed to by @cmdbufs. 435 */ 436 __u32 num_cmdbufs; 437 438 /** 439 * @num_relocs: 440 * 441 * The number of relocations to perform before executing this job. 442 * This defines the length of the array pointed to by @relocs. 443 */ 444 __u32 num_relocs; 445 446 /** 447 * @num_waitchks: 448 * 449 * The number of wait checks to perform as part of this job. This 450 * defines the length of the array pointed to by @waitchks. 451 */ 452 __u32 num_waitchks; 453 454 /** 455 * @waitchk_mask: 456 * 457 * Bitmask of valid wait checks. 458 */ 459 __u32 waitchk_mask; 460 461 /** 462 * @timeout: 463 * 464 * Timeout, in milliseconds, before this job is cancelled. 465 */ 466 __u32 timeout; 467 468 /** 469 * @syncpts: 470 * 471 * A pointer to an array of &struct drm_tegra_syncpt structures that 472 * specify the syncpoint operations performed as part of this job. 473 * The number of elements in the array must be equal to the value 474 * given by @num_syncpts. 475 */ 476 __u64 syncpts; 477 478 /** 479 * @cmdbufs: 480 * 481 * A pointer to an array of &struct drm_tegra_cmdbuf structures that 482 * define the command buffers to execute as part of this job. The 483 * number of elements in the array must be equal to the value given 484 * by @num_syncpts. 485 */ 486 __u64 cmdbufs; 487 488 /** 489 * @relocs: 490 * 491 * A pointer to an array of &struct drm_tegra_reloc structures that 492 * specify the relocations that need to be performed before executing 493 * this job. The number of elements in the array must be equal to the 494 * value given by @num_relocs. 495 */ 496 __u64 relocs; 497 498 /** 499 * @waitchks: 500 * 501 * A pointer to an array of &struct drm_tegra_waitchk structures that 502 * specify the wait checks to be performed while executing this job. 503 * The number of elements in the array must be equal to the value 504 * given by @num_waitchks. 505 */ 506 __u64 waitchks; 507 508 /** 509 * @fence: 510 * 511 * The threshold of the syncpoint associated with this job after it 512 * has been completed. Set by the kernel upon successful completion of 513 * the IOCTL. This can be used with the DRM_TEGRA_SYNCPT_WAIT IOCTL to 514 * wait for this job to be finished. 515 */ 516 __u32 fence; 517 518 /** 519 * @reserved: 520 * 521 * This field is reserved for future use. Must be 0. 522 */ 523 __u32 reserved[5]; 524 }; 525 526 #define DRM_TEGRA_GEM_TILING_MODE_PITCH 0 527 #define DRM_TEGRA_GEM_TILING_MODE_TILED 1 528 #define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2 529 530 /** 531 * struct drm_tegra_gem_set_tiling - parameters for the set tiling IOCTL 532 */ 533 struct drm_tegra_gem_set_tiling { 534 /** 535 * @handle: 536 * 537 * Handle to the GEM object for which to set the tiling parameters. 538 */ 539 __u32 handle; 540 541 /** 542 * @mode: 543 * 544 * The tiling mode to set. Must be one of: 545 * 546 * DRM_TEGRA_GEM_TILING_MODE_PITCH 547 * pitch linear format 548 * 549 * DRM_TEGRA_GEM_TILING_MODE_TILED 550 * 16x16 tiling format 551 * 552 * DRM_TEGRA_GEM_TILING_MODE_BLOCK 553 * 16Bx2 tiling format 554 */ 555 __u32 mode; 556 557 /** 558 * @value: 559 * 560 * The value to set for the tiling mode parameter. 561 */ 562 __u32 value; 563 564 /** 565 * @pad: 566 * 567 * Structure padding that may be used in the future. Must be 0. 568 */ 569 __u32 pad; 570 }; 571 572 /** 573 * struct drm_tegra_gem_get_tiling - parameters for the get tiling IOCTL 574 */ 575 struct drm_tegra_gem_get_tiling { 576 /** 577 * @handle: 578 * 579 * Handle to the GEM object for which to query the tiling parameters. 580 */ 581 __u32 handle; 582 583 /** 584 * @mode: 585 * 586 * The tiling mode currently associated with the GEM object. Set by 587 * the kernel upon successful completion of the IOCTL. 588 */ 589 __u32 mode; 590 591 /** 592 * @value: 593 * 594 * The tiling mode parameter currently associated with the GEM object. 595 * Set by the kernel upon successful completion of the IOCTL. 596 */ 597 __u32 value; 598 599 /** 600 * @pad: 601 * 602 * Structure padding that may be used in the future. Must be 0. 603 */ 604 __u32 pad; 605 }; 606 607 #define DRM_TEGRA_GEM_BOTTOM_UP (1 << 0) 608 #define DRM_TEGRA_GEM_FLAGS (DRM_TEGRA_GEM_BOTTOM_UP) 609 610 /** 611 * struct drm_tegra_gem_set_flags - parameters for the set flags IOCTL 612 */ 613 struct drm_tegra_gem_set_flags { 614 /** 615 * @handle: 616 * 617 * Handle to the GEM object for which to set the flags. 618 */ 619 __u32 handle; 620 621 /** 622 * @flags: 623 * 624 * The flags to set for the GEM object. 625 */ 626 __u32 flags; 627 }; 628 629 /** 630 * struct drm_tegra_gem_get_flags - parameters for the get flags IOCTL 631 */ 632 struct drm_tegra_gem_get_flags { 633 /** 634 * @handle: 635 * 636 * Handle to the GEM object for which to query the flags. 637 */ 638 __u32 handle; 639 640 /** 641 * @flags: 642 * 643 * The flags currently associated with the GEM object. Set by the 644 * kernel upon successful completion of the IOCTL. 645 */ 646 __u32 flags; 647 }; 648 649 #define DRM_TEGRA_GEM_CREATE 0x00 650 #define DRM_TEGRA_GEM_MMAP 0x01 651 #define DRM_TEGRA_SYNCPT_READ 0x02 652 #define DRM_TEGRA_SYNCPT_INCR 0x03 653 #define DRM_TEGRA_SYNCPT_WAIT 0x04 654 #define DRM_TEGRA_OPEN_CHANNEL 0x05 655 #define DRM_TEGRA_CLOSE_CHANNEL 0x06 656 #define DRM_TEGRA_GET_SYNCPT 0x07 657 #define DRM_TEGRA_SUBMIT 0x08 658 #define DRM_TEGRA_GET_SYNCPT_BASE 0x09 659 #define DRM_TEGRA_GEM_SET_TILING 0x0a 660 #define DRM_TEGRA_GEM_GET_TILING 0x0b 661 #define DRM_TEGRA_GEM_SET_FLAGS 0x0c 662 #define DRM_TEGRA_GEM_GET_FLAGS 0x0d 663 664 #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create) 665 #define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap) 666 #define DRM_IOCTL_TEGRA_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_READ, struct drm_tegra_syncpt_read) 667 #define DRM_IOCTL_TEGRA_SYNCPT_INCR DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_INCR, struct drm_tegra_syncpt_incr) 668 #define DRM_IOCTL_TEGRA_SYNCPT_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_WAIT, struct drm_tegra_syncpt_wait) 669 #define DRM_IOCTL_TEGRA_OPEN_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_OPEN_CHANNEL, struct drm_tegra_open_channel) 670 #define DRM_IOCTL_TEGRA_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_CLOSE_CHANNEL, struct drm_tegra_close_channel) 671 #define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt) 672 #define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit) 673 #define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base) 674 #define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling) 675 #define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling) 676 #define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags) 677 #define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags) 678 679 #if defined(__cplusplus) 680 } 681 #endif 682 683 #endif 684