Linux 6.9-rc1
[linux-2.6-microblaze.git] / include / uapi / drm / tegra_drm.h
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)
10 extern "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  */
21 struct 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  */
54 struct 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  */
81 struct 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  */
101 struct 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  */
120 struct 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  */
156 struct 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  */
184 struct 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  */
197 struct 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  */
225 struct 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  */
253 struct 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  */
272 struct 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  */
306 struct 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  */
359 struct 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  */
394 struct 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  */
514 struct 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  */
556 struct 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  */
594 struct 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  */
613 struct 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
670 struct 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
710 struct 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
731 struct 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
762 struct 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
787 struct 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
848 struct drm_tegra_submit_cmd_gather_uptr {
849         __u32 words;
850         __u32 reserved[3];
851 };
852
853 struct drm_tegra_submit_cmd_wait_syncpt {
854         __u32 id;
855         __u32 value;
856         __u32 reserved[2];
857 };
858
859 struct 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
882 struct 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
919 struct 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
994 struct drm_tegra_syncpoint_allocate {
995         /**
996          * @id: [out]
997          *
998          * ID of allocated syncpoint.
999          */
1000         __u32 id;
1001         __u32 padding;
1002 };
1003
1004 struct drm_tegra_syncpoint_free {
1005         /**
1006          * @id: [in]
1007          *
1008          * ID of syncpoint to free.
1009          */
1010         __u32 id;
1011         __u32 padding;
1012 };
1013
1014 struct 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