linux/include/uapi/drm/tegra_drm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: MIT */
   2/* Copyright (c) 2012-2020 NVIDIA Corporation */
   3
   4#ifndef _UAPI_TEGRA_DRM_H_
   5#define _UAPI_TEGRA_DRM_H_
   6
   7#include "drm.h"
   8
   9#if defined(__cplusplus)
  10extern "C" {
  11#endif
  12
  13/* Tegra DRM legacy UAPI. Only enabled with STAGING */
  14
  15#define DRM_TEGRA_GEM_CREATE_TILED     (1 << 0)
  16#define DRM_TEGRA_GEM_CREATE_BOTTOM_UP (1 << 1)
  17
  18/**
  19 * struct drm_tegra_gem_create - parameters for the GEM object creation IOCTL
  20 */
  21struct drm_tegra_gem_create {
  22        /**
  23         * @size:
  24         *
  25         * The size, in bytes, of the buffer object to be created.
  26         */
  27        __u64 size;
  28
  29        /**
  30         * @flags:
  31         *
  32         * A bitmask of flags that influence the creation of GEM objects:
  33         *
  34         * DRM_TEGRA_GEM_CREATE_TILED
  35         *   Use the 16x16 tiling format for this buffer.
  36         *
  37         * DRM_TEGRA_GEM_CREATE_BOTTOM_UP
  38         *   The buffer has a bottom-up layout.
  39         */
  40        __u32 flags;
  41
  42        /**
  43         * @handle:
  44         *
  45         * The handle of the created GEM object. Set by the kernel upon
  46         * successful completion of the IOCTL.
  47         */
  48        __u32 handle;
  49};
  50
  51/**
  52 * struct drm_tegra_gem_mmap - parameters for the GEM mmap IOCTL
  53 */
  54struct drm_tegra_gem_mmap {
  55        /**
  56         * @handle:
  57         *
  58         * Handle of the GEM object to obtain an mmap offset for.
  59         */
  60        __u32 handle;
  61
  62        /**
  63         * @pad:
  64         *
  65         * Structure padding that may be used in the future. Must be 0.
  66         */
  67        __u32 pad;
  68
  69        /**
  70         * @offset:
  71         *
  72         * The mmap offset for the given GEM object. Set by the kernel upon
  73         * successful completion of the IOCTL.
  74         */
  75        __u64 offset;
  76};
  77
  78/**
  79 * struct drm_tegra_syncpt_read - parameters for the read syncpoint IOCTL
  80 */
  81struct drm_tegra_syncpt_read {
  82        /**
  83         * @id:
  84         *
  85         * ID of the syncpoint to read the current value from.
  86         */
  87        __u32 id;
  88
  89        /**
  90         * @value:
  91         *
  92         * The current syncpoint value. Set by the kernel upon successful
  93         * completion of the IOCTL.
  94         */
  95        __u32 value;
  96};
  97
  98/**
  99 * struct drm_tegra_syncpt_incr - parameters for the increment syncpoint IOCTL
 100 */
 101struct drm_tegra_syncpt_incr {
 102        /**
 103         * @id:
 104         *
 105         * ID of the syncpoint to increment.
 106         */
 107        __u32 id;
 108
 109        /**
 110         * @pad:
 111         *
 112         * Structure padding that may be used in the future. Must be 0.
 113         */
 114        __u32 pad;
 115};
 116
 117/**
 118 * struct drm_tegra_syncpt_wait - parameters for the wait syncpoint IOCTL
 119 */
 120struct drm_tegra_syncpt_wait {
 121        /**
 122         * @id:
 123         *
 124         * ID of the syncpoint to wait on.
 125         */
 126        __u32 id;
 127
 128        /**
 129         * @thresh:
 130         *
 131         * Threshold value for which to wait.
 132         */
 133        __u32 thresh;
 134
 135        /**
 136         * @timeout:
 137         *
 138         * Timeout, in milliseconds, to wait.
 139         */
 140        __u32 timeout;
 141
 142        /**
 143         * @value:
 144         *
 145         * The new syncpoint value after the wait. Set by the kernel upon
 146         * successful completion of the IOCTL.
 147         */
 148        __u32 value;
 149};
 150
 151#define DRM_TEGRA_NO_TIMEOUT    (0xffffffff)
 152
 153/**
 154 * struct drm_tegra_open_channel - parameters for the open channel IOCTL
 155 */
 156struct drm_tegra_open_channel {
 157        /**
 158         * @client:
 159         *
 160         * The client ID for this channel.
 161         */
 162        __u32 client;
 163
 164        /**
 165         * @pad:
 166         *
 167         * Structure padding that may be used in the future. Must be 0.
 168         */
 169        __u32 pad;
 170
 171        /**
 172         * @context:
 173         *
 174         * The application context of this channel. Set by the kernel upon
 175         * successful completion of the IOCTL. This context needs to be passed
 176         * to the DRM_TEGRA_CHANNEL_CLOSE or the DRM_TEGRA_SUBMIT IOCTLs.
 177         */
 178        __u64 context;
 179};
 180
 181/**
 182 * struct drm_tegra_close_channel - parameters for the close channel IOCTL
 183 */
 184struct drm_tegra_close_channel {
 185        /**
 186         * @context:
 187         *
 188         * The application context of this channel. This is obtained from the
 189         * DRM_TEGRA_OPEN_CHANNEL IOCTL.
 190         */
 191        __u64 context;
 192};
 193
 194/**
 195 * struct drm_tegra_get_syncpt - parameters for the get syncpoint IOCTL
 196 */
 197struct drm_tegra_get_syncpt {
 198        /**
 199         * @context:
 200         *
 201         * The application context identifying the channel for which to obtain
 202         * the syncpoint ID.
 203         */
 204        __u64 context;
 205
 206        /**
 207         * @index:
 208         *
 209         * Index of the client syncpoint for which to obtain the ID.
 210         */
 211        __u32 index;
 212
 213        /**
 214         * @id:
 215         *
 216         * The ID of the given syncpoint. Set by the kernel upon successful
 217         * completion of the IOCTL.
 218         */
 219        __u32 id;
 220};
 221
 222/**
 223 * struct drm_tegra_get_syncpt_base - parameters for the get wait base IOCTL
 224 */
 225struct drm_tegra_get_syncpt_base {
 226        /**
 227         * @context:
 228         *
 229         * The application context identifying for which channel to obtain the
 230         * wait base.
 231         */
 232        __u64 context;
 233
 234        /**
 235         * @syncpt:
 236         *
 237         * ID of the syncpoint for which to obtain the wait base.
 238         */
 239        __u32 syncpt;
 240
 241        /**
 242         * @id:
 243         *
 244         * The ID of the wait base corresponding to the client syncpoint. Set
 245         * by the kernel upon successful completion of the IOCTL.
 246         */
 247        __u32 id;
 248};
 249
 250/**
 251 * struct drm_tegra_syncpt - syncpoint increment operation
 252 */
 253struct drm_tegra_syncpt {
 254        /**
 255         * @id:
 256         *
 257         * ID of the syncpoint to operate on.
 258         */
 259        __u32 id;
 260
 261        /**
 262         * @incrs:
 263         *
 264         * Number of increments to perform for the syncpoint.
 265         */
 266        __u32 incrs;
 267};
 268
 269/**
 270 * struct drm_tegra_cmdbuf - structure describing a command buffer
 271 */
 272struct drm_tegra_cmdbuf {
 273        /**
 274         * @handle:
 275         *
 276         * Handle to a GEM object containing the command buffer.
 277         */
 278        __u32 handle;
 279
 280        /**
 281         * @offset:
 282         *
 283         * Offset, in bytes, into the GEM object identified by @handle at
 284         * which the command buffer starts.
 285         */
 286        __u32 offset;
 287
 288        /**
 289         * @words:
 290         *
 291         * Number of 32-bit words in this command buffer.
 292         */
 293        __u32 words;
 294
 295        /**
 296         * @pad:
 297         *
 298         * Structure padding that may be used in the future. Must be 0.
 299         */
 300        __u32 pad;
 301};
 302
 303/**
 304 * struct drm_tegra_reloc - GEM object relocation structure
 305 */
 306struct drm_tegra_reloc {
 307        struct {
 308                /**
 309                 * @cmdbuf.handle:
 310                 *
 311                 * Handle to the GEM object containing the command buffer for
 312                 * which to perform this GEM object relocation.
 313                 */
 314                __u32 handle;
 315
 316                /**
 317                 * @cmdbuf.offset:
 318                 *
 319                 * Offset, in bytes, into the command buffer at which to
 320                 * insert the relocated address.
 321                 */
 322                __u32 offset;
 323        } cmdbuf;
 324        struct {
 325                /**
 326                 * @target.handle:
 327                 *
 328                 * Handle to the GEM object to be relocated.
 329                 */
 330                __u32 handle;
 331
 332                /**
 333                 * @target.offset:
 334                 *
 335                 * Offset, in bytes, into the target GEM object at which the
 336                 * relocated data starts.
 337                 */
 338                __u32 offset;
 339        } target;
 340
 341        /**
 342         * @shift:
 343         *
 344         * The number of bits by which to shift relocated addresses.
 345         */
 346        __u32 shift;
 347
 348        /**
 349         * @pad:
 350         *
 351         * Structure padding that may be used in the future. Must be 0.
 352         */
 353        __u32 pad;
 354};
 355
 356/**
 357 * struct drm_tegra_waitchk - wait check structure
 358 */
 359struct drm_tegra_waitchk {
 360        /**
 361         * @handle:
 362         *
 363         * Handle to the GEM object containing a command stream on which to
 364         * perform the wait check.
 365         */
 366        __u32 handle;
 367
 368        /**
 369         * @offset:
 370         *
 371         * Offset, in bytes, of the location in the command stream to perform
 372         * the wait check on.
 373         */
 374        __u32 offset;
 375
 376        /**
 377         * @syncpt:
 378         *
 379         * ID of the syncpoint to wait check.
 380         */
 381        __u32 syncpt;
 382
 383        /**
 384         * @thresh:
 385         *
 386         * Threshold value for which to check.
 387         */
 388        __u32 thresh;
 389};
 390
 391/**
 392 * struct drm_tegra_submit - job submission structure
 393 */
 394struct drm_tegra_submit {
 395        /**
 396         * @context:
 397         *
 398         * The application context identifying the channel to use for the
 399         * execution of this job.
 400         */
 401        __u64 context;
 402
 403        /**
 404         * @num_syncpts:
 405         *
 406         * The number of syncpoints operated on by this job. This defines the
 407         * length of the array pointed to by @syncpts.
 408         */
 409        __u32 num_syncpts;
 410
 411        /**
 412         * @num_cmdbufs:
 413         *
 414         * The number of command buffers to execute as part of this job. This
 415         * defines the length of the array pointed to by @cmdbufs.
 416         */
 417        __u32 num_cmdbufs;
 418
 419        /**
 420         * @num_relocs:
 421         *
 422         * The number of relocations to perform before executing this job.
 423         * This defines the length of the array pointed to by @relocs.
 424         */
 425        __u32 num_relocs;
 426
 427        /**
 428         * @num_waitchks:
 429         *
 430         * The number of wait checks to perform as part of this job. This
 431         * defines the length of the array pointed to by @waitchks.
 432         */
 433        __u32 num_waitchks;
 434
 435        /**
 436         * @waitchk_mask:
 437         *
 438         * Bitmask of valid wait checks.
 439         */
 440        __u32 waitchk_mask;
 441
 442        /**
 443         * @timeout:
 444         *
 445         * Timeout, in milliseconds, before this job is cancelled.
 446         */
 447        __u32 timeout;
 448
 449        /**
 450         * @syncpts:
 451         *
 452         * A pointer to an array of &struct drm_tegra_syncpt structures that
 453         * specify the syncpoint operations performed as part of this job.
 454         * The number of elements in the array must be equal to the value
 455         * given by @num_syncpts.
 456         */
 457        __u64 syncpts;
 458
 459        /**
 460         * @cmdbufs:
 461         *
 462         * A pointer to an array of &struct drm_tegra_cmdbuf structures that
 463         * define the command buffers to execute as part of this job. The
 464         * number of elements in the array must be equal to the value given
 465         * by @num_syncpts.
 466         */
 467        __u64 cmdbufs;
 468
 469        /**
 470         * @relocs:
 471         *
 472         * A pointer to an array of &struct drm_tegra_reloc structures that
 473         * specify the relocations that need to be performed before executing
 474         * this job. The number of elements in the array must be equal to the
 475         * value given by @num_relocs.
 476         */
 477        __u64 relocs;
 478
 479        /**
 480         * @waitchks:
 481         *
 482         * A pointer to an array of &struct drm_tegra_waitchk structures that
 483         * specify the wait checks to be performed while executing this job.
 484         * The number of elements in the array must be equal to the value
 485         * given by @num_waitchks.
 486         */
 487        __u64 waitchks;
 488
 489        /**
 490         * @fence:
 491         *
 492         * The threshold of the syncpoint associated with this job after it
 493         * has been completed. Set by the kernel upon successful completion of
 494         * the IOCTL. This can be used with the DRM_TEGRA_SYNCPT_WAIT IOCTL to
 495         * wait for this job to be finished.
 496         */
 497        __u32 fence;
 498
 499        /**
 500         * @reserved:
 501         *
 502         * This field is reserved for future use. Must be 0.
 503         */
 504        __u32 reserved[5];
 505};
 506
 507#define DRM_TEGRA_GEM_TILING_MODE_PITCH 0
 508#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
 509#define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2
 510
 511/**
 512 * struct drm_tegra_gem_set_tiling - parameters for the set tiling IOCTL
 513 */
 514struct drm_tegra_gem_set_tiling {
 515        /**
 516         * @handle:
 517         *
 518         * Handle to the GEM object for which to set the tiling parameters.
 519         */
 520        __u32 handle;
 521
 522        /**
 523         * @mode:
 524         *
 525         * The tiling mode to set. Must be one of:
 526         *
 527         * DRM_TEGRA_GEM_TILING_MODE_PITCH
 528         *   pitch linear format
 529         *
 530         * DRM_TEGRA_GEM_TILING_MODE_TILED
 531         *   16x16 tiling format
 532         *
 533         * DRM_TEGRA_GEM_TILING_MODE_BLOCK
 534         *   16Bx2 tiling format
 535         */
 536        __u32 mode;
 537
 538        /**
 539         * @value:
 540         *
 541         * The value to set for the tiling mode parameter.
 542         */
 543        __u32 value;
 544
 545        /**
 546         * @pad:
 547         *
 548         * Structure padding that may be used in the future. Must be 0.
 549         */
 550        __u32 pad;
 551};
 552
 553/**
 554 * struct drm_tegra_gem_get_tiling - parameters for the get tiling IOCTL
 555 */
 556struct drm_tegra_gem_get_tiling {
 557        /**
 558         * @handle:
 559         *
 560         * Handle to the GEM object for which to query the tiling parameters.
 561         */
 562        __u32 handle;
 563
 564        /**
 565         * @mode:
 566         *
 567         * The tiling mode currently associated with the GEM object. Set by
 568         * the kernel upon successful completion of the IOCTL.
 569         */
 570        __u32 mode;
 571
 572        /**
 573         * @value:
 574         *
 575         * The tiling mode parameter currently associated with the GEM object.
 576         * Set by the kernel upon successful completion of the IOCTL.
 577         */
 578        __u32 value;
 579
 580        /**
 581         * @pad:
 582         *
 583         * Structure padding that may be used in the future. Must be 0.
 584         */
 585        __u32 pad;
 586};
 587
 588#define DRM_TEGRA_GEM_BOTTOM_UP         (1 << 0)
 589#define DRM_TEGRA_GEM_FLAGS             (DRM_TEGRA_GEM_BOTTOM_UP)
 590
 591/**
 592 * struct drm_tegra_gem_set_flags - parameters for the set flags IOCTL
 593 */
 594struct drm_tegra_gem_set_flags {
 595        /**
 596         * @handle:
 597         *
 598         * Handle to the GEM object for which to set the flags.
 599         */
 600        __u32 handle;
 601
 602        /**
 603         * @flags:
 604         *
 605         * The flags to set for the GEM object.
 606         */
 607        __u32 flags;
 608};
 609
 610/**
 611 * struct drm_tegra_gem_get_flags - parameters for the get flags IOCTL
 612 */
 613struct drm_tegra_gem_get_flags {
 614        /**
 615         * @handle:
 616         *
 617         * Handle to the GEM object for which to query the flags.
 618         */
 619        __u32 handle;
 620
 621        /**
 622         * @flags:
 623         *
 624         * The flags currently associated with the GEM object. Set by the
 625         * kernel upon successful completion of the IOCTL.
 626         */
 627        __u32 flags;
 628};
 629
 630#define DRM_TEGRA_GEM_CREATE            0x00
 631#define DRM_TEGRA_GEM_MMAP              0x01
 632#define DRM_TEGRA_SYNCPT_READ           0x02
 633#define DRM_TEGRA_SYNCPT_INCR           0x03
 634#define DRM_TEGRA_SYNCPT_WAIT           0x04
 635#define DRM_TEGRA_OPEN_CHANNEL          0x05
 636#define DRM_TEGRA_CLOSE_CHANNEL         0x06
 637#define DRM_TEGRA_GET_SYNCPT            0x07
 638#define DRM_TEGRA_SUBMIT                0x08
 639#define DRM_TEGRA_GET_SYNCPT_BASE       0x09
 640#define DRM_TEGRA_GEM_SET_TILING        0x0a
 641#define DRM_TEGRA_GEM_GET_TILING        0x0b
 642#define DRM_TEGRA_GEM_SET_FLAGS         0x0c
 643#define DRM_TEGRA_GEM_GET_FLAGS         0x0d
 644
 645#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
 646#define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
 647#define DRM_IOCTL_TEGRA_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_READ, struct drm_tegra_syncpt_read)
 648#define DRM_IOCTL_TEGRA_SYNCPT_INCR DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_INCR, struct drm_tegra_syncpt_incr)
 649#define DRM_IOCTL_TEGRA_SYNCPT_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_WAIT, struct drm_tegra_syncpt_wait)
 650#define DRM_IOCTL_TEGRA_OPEN_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_OPEN_CHANNEL, struct drm_tegra_open_channel)
 651#define DRM_IOCTL_TEGRA_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_CLOSE_CHANNEL, struct drm_tegra_close_channel)
 652#define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt)
 653#define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit)
 654#define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base)
 655#define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling)
 656#define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
 657#define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
 658#define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
 659
 660/* New Tegra DRM UAPI */
 661
 662/*
 663 * Reported by the driver in the `capabilities` field.
 664 *
 665 * DRM_TEGRA_CHANNEL_CAP_CACHE_COHERENT: If set, the engine is cache coherent
 666 * with regard to the system memory.
 667 */
 668#define DRM_TEGRA_CHANNEL_CAP_CACHE_COHERENT (1 << 0)
 669
 670struct drm_tegra_channel_open {
 671        /**
 672         * @host1x_class: [in]
 673         *
 674         * Host1x class of the engine that will be programmed using this
 675         * channel.
 676         */
 677        __u32 host1x_class;
 678
 679        /**
 680         * @flags: [in]
 681         *
 682         * Flags.
 683         */
 684        __u32 flags;
 685
 686        /**
 687         * @context: [out]
 688         *
 689         * Opaque identifier corresponding to the opened channel.
 690         */
 691        __u32 context;
 692
 693        /**
 694         * @version: [out]
 695         *
 696         * Version of the engine hardware. This can be used by userspace
 697         * to determine how the engine needs to be programmed.
 698         */
 699        __u32 version;
 700
 701        /**
 702         * @capabilities: [out]
 703         *
 704         * Flags describing the hardware capabilities.
 705         */
 706        __u32 capabilities;
 707        __u32 padding;
 708};
 709
 710struct drm_tegra_channel_close {
 711        /**
 712         * @context: [in]
 713         *
 714         * Identifier of the channel to close.
 715         */
 716        __u32 context;
 717        __u32 padding;
 718};
 719
 720/*
 721 * Mapping flags that can be used to influence how the mapping is created.
 722 *
 723 * DRM_TEGRA_CHANNEL_MAP_READ: create mapping that allows HW read access
 724 * DRM_TEGRA_CHANNEL_MAP_WRITE: create mapping that allows HW write access
 725 */
 726#define DRM_TEGRA_CHANNEL_MAP_READ  (1 << 0)
 727#define DRM_TEGRA_CHANNEL_MAP_WRITE (1 << 1)
 728#define DRM_TEGRA_CHANNEL_MAP_READ_WRITE (DRM_TEGRA_CHANNEL_MAP_READ | \
 729                                          DRM_TEGRA_CHANNEL_MAP_WRITE)
 730
 731struct drm_tegra_channel_map {
 732        /**
 733         * @context: [in]
 734         *
 735         * Identifier of the channel to which make memory available for.
 736         */
 737        __u32 context;
 738
 739        /**
 740         * @handle: [in]
 741         *
 742         * GEM handle of the memory to map.
 743         */
 744        __u32 handle;
 745
 746        /**
 747         * @flags: [in]
 748         *
 749         * Flags.
 750         */
 751        __u32 flags;
 752
 753        /**
 754         * @mapping: [out]
 755         *
 756         * Identifier corresponding to the mapping, to be used for
 757         * relocations or unmapping later.
 758         */
 759        __u32 mapping;
 760};
 761
 762struct drm_tegra_channel_unmap {
 763        /**
 764         * @context: [in]
 765         *
 766         * Channel identifier of the channel to unmap memory from.
 767         */
 768        __u32 context;
 769
 770        /**
 771         * @mapping: [in]
 772         *
 773         * Mapping identifier of the memory mapping to unmap.
 774         */
 775        __u32 mapping;
 776};
 777
 778/* Submission */
 779
 780/**
 781 * Specify that bit 39 of the patched-in address should be set to switch
 782 * swizzling between Tegra and non-Tegra sector layout on systems that store
 783 * surfaces in system memory in non-Tegra sector layout.
 784 */
 785#define DRM_TEGRA_SUBMIT_RELOC_SECTOR_LAYOUT (1 << 0)
 786
 787struct drm_tegra_submit_buf {
 788        /**
 789         * @mapping: [in]
 790         *
 791         * Identifier of the mapping to use in the submission.
 792         */
 793        __u32 mapping;
 794
 795        /**
 796         * @flags: [in]
 797         *
 798         * Flags.
 799         */
 800        __u32 flags;
 801
 802        /**
 803         * Information for relocation patching.
 804         */
 805        struct {
 806                /**
 807                 * @target_offset: [in]
 808                 *
 809                 * Offset from the start of the mapping of the data whose
 810                 * address is to be patched into the gather.
 811                 */
 812                __u64 target_offset;
 813
 814                /**
 815                 * @gather_offset_words: [in]
 816                 *
 817                 * Offset in words from the start of the gather data to
 818                 * where the address should be patched into.
 819                 */
 820                __u32 gather_offset_words;
 821
 822                /**
 823                 * @shift: [in]
 824                 *
 825                 * Number of bits the address should be shifted right before
 826                 * patching in.
 827                 */
 828                __u32 shift;
 829        } reloc;
 830};
 831
 832/**
 833 * Execute `words` words of Host1x opcodes specified in the `gather_data_ptr`
 834 * buffer. Each GATHER_UPTR command uses successive words from the buffer.
 835 */
 836#define DRM_TEGRA_SUBMIT_CMD_GATHER_UPTR                0
 837/**
 838 * Wait for a syncpoint to reach a value before continuing with further
 839 * commands.
 840 */
 841#define DRM_TEGRA_SUBMIT_CMD_WAIT_SYNCPT                1
 842/**
 843 * Wait for a syncpoint to reach a value before continuing with further
 844 * commands. The threshold is calculated relative to the start of the job.
 845 */
 846#define DRM_TEGRA_SUBMIT_CMD_WAIT_SYNCPT_RELATIVE       2
 847
 848struct drm_tegra_submit_cmd_gather_uptr {
 849        __u32 words;
 850        __u32 reserved[3];
 851};
 852
 853struct drm_tegra_submit_cmd_wait_syncpt {
 854        __u32 id;
 855        __u32 value;
 856        __u32 reserved[2];
 857};
 858
 859struct drm_tegra_submit_cmd {
 860        /**
 861         * @type: [in]
 862         *
 863         * Command type to execute. One of the DRM_TEGRA_SUBMIT_CMD*
 864         * defines.
 865         */
 866        __u32 type;
 867
 868        /**
 869         * @flags: [in]
 870         *
 871         * Flags.
 872         */
 873        __u32 flags;
 874
 875        union {
 876                struct drm_tegra_submit_cmd_gather_uptr gather_uptr;
 877                struct drm_tegra_submit_cmd_wait_syncpt wait_syncpt;
 878                __u32 reserved[4];
 879        };
 880};
 881
 882struct drm_tegra_submit_syncpt {
 883        /**
 884         * @id: [in]
 885         *
 886         * ID of the syncpoint that the job will increment.
 887         */
 888        __u32 id;
 889
 890        /**
 891         * @flags: [in]
 892         *
 893         * Flags.
 894         */
 895        __u32 flags;
 896
 897        /**
 898         * @increments: [in]
 899         *
 900         * Number of times the job will increment this syncpoint.
 901         */
 902        __u32 increments;
 903
 904        /**
 905         * @value: [out]
 906         *
 907         * Value the syncpoint will have once the job has completed all
 908         * its specified syncpoint increments.
 909         *
 910         * Note that the kernel may increment the syncpoint before or after
 911         * the job. These increments are not reflected in this field.
 912         *
 913         * If the job hangs or times out, not all of the increments may
 914         * get executed.
 915         */
 916        __u32 value;
 917};
 918
 919struct drm_tegra_channel_submit {
 920        /**
 921         * @context: [in]
 922         *
 923         * Identifier of the channel to submit this job to.
 924         */
 925        __u32 context;
 926
 927        /**
 928         * @num_bufs: [in]
 929         *
 930         * Number of elements in the `bufs_ptr` array.
 931         */
 932        __u32 num_bufs;
 933
 934        /**
 935         * @num_cmds: [in]
 936         *
 937         * Number of elements in the `cmds_ptr` array.
 938         */
 939        __u32 num_cmds;
 940
 941        /**
 942         * @gather_data_words: [in]
 943         *
 944         * Number of 32-bit words in the `gather_data_ptr` array.
 945         */
 946        __u32 gather_data_words;
 947
 948        /**
 949         * @bufs_ptr: [in]
 950         *
 951         * Pointer to an array of drm_tegra_submit_buf structures.
 952         */
 953        __u64 bufs_ptr;
 954
 955        /**
 956         * @cmds_ptr: [in]
 957         *
 958         * Pointer to an array of drm_tegra_submit_cmd structures.
 959         */
 960        __u64 cmds_ptr;
 961
 962        /**
 963         * @gather_data_ptr: [in]
 964         *
 965         * Pointer to an array of Host1x opcodes to be used by GATHER_UPTR
 966         * commands.
 967         */
 968        __u64 gather_data_ptr;
 969
 970        /**
 971         * @syncobj_in: [in]
 972         *
 973         * Handle for DRM syncobj that will be waited before submission.
 974         * Ignored if zero.
 975         */
 976        __u32 syncobj_in;
 977
 978        /**
 979         * @syncobj_out: [in]
 980         *
 981         * Handle for DRM syncobj that will have its fence replaced with
 982         * the job's completion fence. Ignored if zero.
 983         */
 984        __u32 syncobj_out;
 985
 986        /**
 987         * @syncpt_incr: [in,out]
 988         *
 989         * Information about the syncpoint the job will increment.
 990         */
 991        struct drm_tegra_submit_syncpt syncpt;
 992};
 993
 994struct drm_tegra_syncpoint_allocate {
 995        /**
 996         * @id: [out]
 997         *
 998         * ID of allocated syncpoint.
 999         */
1000        __u32 id;
1001        __u32 padding;
1002};
1003
1004struct drm_tegra_syncpoint_free {
1005        /**
1006         * @id: [in]
1007         *
1008         * ID of syncpoint to free.
1009         */
1010        __u32 id;
1011        __u32 padding;
1012};
1013
1014struct drm_tegra_syncpoint_wait {
1015        /**
1016         * @timeout: [in]
1017         *
1018         * Absolute timestamp at which the wait will time out.
1019         */
1020        __s64 timeout_ns;
1021
1022        /**
1023         * @id: [in]
1024         *
1025         * ID of syncpoint to wait on.
1026         */
1027        __u32 id;
1028
1029        /**
1030         * @threshold: [in]
1031         *
1032         * Threshold to wait for.
1033         */
1034        __u32 threshold;
1035
1036        /**
1037         * @value: [out]
1038         *
1039         * Value of the syncpoint upon wait completion.
1040         */
1041        __u32 value;
1042
1043        __u32 padding;
1044};
1045
1046#define DRM_IOCTL_TEGRA_CHANNEL_OPEN DRM_IOWR(DRM_COMMAND_BASE + 0x10, struct drm_tegra_channel_open)
1047#define DRM_IOCTL_TEGRA_CHANNEL_CLOSE DRM_IOWR(DRM_COMMAND_BASE + 0x11, struct drm_tegra_channel_close)
1048#define DRM_IOCTL_TEGRA_CHANNEL_MAP DRM_IOWR(DRM_COMMAND_BASE + 0x12, struct drm_tegra_channel_map)
1049#define DRM_IOCTL_TEGRA_CHANNEL_UNMAP DRM_IOWR(DRM_COMMAND_BASE + 0x13, struct drm_tegra_channel_unmap)
1050#define DRM_IOCTL_TEGRA_CHANNEL_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + 0x14, struct drm_tegra_channel_submit)
1051
1052#define DRM_IOCTL_TEGRA_SYNCPOINT_ALLOCATE DRM_IOWR(DRM_COMMAND_BASE + 0x20, struct drm_tegra_syncpoint_allocate)
1053#define DRM_IOCTL_TEGRA_SYNCPOINT_FREE DRM_IOWR(DRM_COMMAND_BASE + 0x21, struct drm_tegra_syncpoint_free)
1054#define DRM_IOCTL_TEGRA_SYNCPOINT_WAIT DRM_IOWR(DRM_COMMAND_BASE + 0x22, struct drm_tegra_syncpoint_wait)
1055
1056#if defined(__cplusplus)
1057}
1058#endif
1059
1060#endif
1061