xref: /rockchip-linux_mpp/osal/linux/drm.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /**
2*437bfbebSnyanmisaka  * \file drm.h
3*437bfbebSnyanmisaka  * Header for the Direct Rendering Manager
4*437bfbebSnyanmisaka  *
5*437bfbebSnyanmisaka  * \author Rickard E. (Rik) Faith <faith@valinux.com>
6*437bfbebSnyanmisaka  *
7*437bfbebSnyanmisaka  * \par Acknowledgments:
8*437bfbebSnyanmisaka  * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic \c cmpxchg.
9*437bfbebSnyanmisaka  */
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka /*
12*437bfbebSnyanmisaka  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
13*437bfbebSnyanmisaka  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
14*437bfbebSnyanmisaka  * All rights reserved.
15*437bfbebSnyanmisaka  *
16*437bfbebSnyanmisaka  * Permission is hereby granted, free of charge, to any person obtaining a
17*437bfbebSnyanmisaka  * copy of this software and associated documentation files (the "Software"),
18*437bfbebSnyanmisaka  * to deal in the Software without restriction, including without limitation
19*437bfbebSnyanmisaka  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
20*437bfbebSnyanmisaka  * and/or sell copies of the Software, and to permit persons to whom the
21*437bfbebSnyanmisaka  * Software is furnished to do so, subject to the following conditions:
22*437bfbebSnyanmisaka  *
23*437bfbebSnyanmisaka  * The above copyright notice and this permission notice (including the next
24*437bfbebSnyanmisaka  * paragraph) shall be included in all copies or substantial portions of the
25*437bfbebSnyanmisaka  * Software.
26*437bfbebSnyanmisaka  *
27*437bfbebSnyanmisaka  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28*437bfbebSnyanmisaka  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29*437bfbebSnyanmisaka  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
30*437bfbebSnyanmisaka  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
31*437bfbebSnyanmisaka  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
32*437bfbebSnyanmisaka  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33*437bfbebSnyanmisaka  * OTHER DEALINGS IN THE SOFTWARE.
34*437bfbebSnyanmisaka  */
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #ifndef _DRM_H_
37*437bfbebSnyanmisaka #define _DRM_H_
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka #if defined(__KERNEL__)
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #include <linux/types.h>
42*437bfbebSnyanmisaka #include <asm/ioctl.h>
43*437bfbebSnyanmisaka typedef unsigned int drm_handle_t;
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka #elif defined(__linux__)
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka #include <linux/types.h>
48*437bfbebSnyanmisaka #include <asm/ioctl.h>
49*437bfbebSnyanmisaka typedef unsigned int drm_handle_t;
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka #else /* One of the BSDs */
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka #include <sys/ioccom.h>
54*437bfbebSnyanmisaka #include <sys/types.h>
55*437bfbebSnyanmisaka typedef int8_t   __s8;
56*437bfbebSnyanmisaka typedef uint8_t  __u8;
57*437bfbebSnyanmisaka typedef int16_t  __s16;
58*437bfbebSnyanmisaka typedef uint16_t __u16;
59*437bfbebSnyanmisaka typedef int32_t  __s32;
60*437bfbebSnyanmisaka typedef uint32_t __u32;
61*437bfbebSnyanmisaka typedef int64_t  __s64;
62*437bfbebSnyanmisaka typedef uint64_t __u64;
63*437bfbebSnyanmisaka typedef size_t   __kernel_size_t;
64*437bfbebSnyanmisaka typedef unsigned long drm_handle_t;
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka #endif
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka #if defined(__cplusplus)
69*437bfbebSnyanmisaka extern "C" {
70*437bfbebSnyanmisaka #endif
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka #define __user
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka #define DRM_NAME    "drm"     /**< Name in kernel, /dev, and /proc */
75*437bfbebSnyanmisaka #define DRM_MIN_ORDER   5     /**< At least 2^5 bytes = 32 bytes */
76*437bfbebSnyanmisaka #define DRM_MAX_ORDER   22    /**< Up to 2^22 bytes = 4MB */
77*437bfbebSnyanmisaka #define DRM_RAM_PERCENT 10    /**< How much system ram can we lock? */
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka #define _DRM_LOCK_HELD  0x80000000U /**< Hardware lock is held */
80*437bfbebSnyanmisaka #define _DRM_LOCK_CONT  0x40000000U /**< Hardware lock is contended */
81*437bfbebSnyanmisaka #define _DRM_LOCK_IS_HELD(lock)    ((lock) & _DRM_LOCK_HELD)
82*437bfbebSnyanmisaka #define _DRM_LOCK_IS_CONT(lock)    ((lock) & _DRM_LOCK_CONT)
83*437bfbebSnyanmisaka #define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka typedef unsigned int drm_context_t;
86*437bfbebSnyanmisaka typedef unsigned int drm_drawable_t;
87*437bfbebSnyanmisaka typedef unsigned int drm_magic_t;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka /**
90*437bfbebSnyanmisaka  * Cliprect.
91*437bfbebSnyanmisaka  *
92*437bfbebSnyanmisaka  * \warning: If you change this structure, make sure you change
93*437bfbebSnyanmisaka  * XF86DRIClipRectRec in the server as well
94*437bfbebSnyanmisaka  *
95*437bfbebSnyanmisaka  * \note KW: Actually it's illegal to change either for
96*437bfbebSnyanmisaka  * backwards-compatibility reasons.
97*437bfbebSnyanmisaka  */
98*437bfbebSnyanmisaka struct drm_clip_rect {
99*437bfbebSnyanmisaka     unsigned short x1;
100*437bfbebSnyanmisaka     unsigned short y1;
101*437bfbebSnyanmisaka     unsigned short x2;
102*437bfbebSnyanmisaka     unsigned short y2;
103*437bfbebSnyanmisaka };
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka /**
106*437bfbebSnyanmisaka  * Drawable information.
107*437bfbebSnyanmisaka  */
108*437bfbebSnyanmisaka struct drm_drawable_info {
109*437bfbebSnyanmisaka     unsigned int num_rects;
110*437bfbebSnyanmisaka     struct drm_clip_rect *rects;
111*437bfbebSnyanmisaka };
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka /**
114*437bfbebSnyanmisaka  * Texture region,
115*437bfbebSnyanmisaka  */
116*437bfbebSnyanmisaka struct drm_tex_region {
117*437bfbebSnyanmisaka     unsigned char next;
118*437bfbebSnyanmisaka     unsigned char prev;
119*437bfbebSnyanmisaka     unsigned char in_use;
120*437bfbebSnyanmisaka     unsigned char padding;
121*437bfbebSnyanmisaka     unsigned int age;
122*437bfbebSnyanmisaka };
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka /**
125*437bfbebSnyanmisaka  * Hardware lock.
126*437bfbebSnyanmisaka  *
127*437bfbebSnyanmisaka  * The lock structure is a simple cache-line aligned integer.  To avoid
128*437bfbebSnyanmisaka  * processor bus contention on a multiprocessor system, there should not be any
129*437bfbebSnyanmisaka  * other data stored in the same cache line.
130*437bfbebSnyanmisaka  */
131*437bfbebSnyanmisaka struct drm_hw_lock {
132*437bfbebSnyanmisaka     __volatile__ unsigned int lock;     /**< lock variable */
133*437bfbebSnyanmisaka     char padding[60];           /**< Pad to cache line */
134*437bfbebSnyanmisaka };
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka /**
137*437bfbebSnyanmisaka  * DRM_IOCTL_VERSION ioctl argument type.
138*437bfbebSnyanmisaka  *
139*437bfbebSnyanmisaka  * \sa drmGetVersion().
140*437bfbebSnyanmisaka  */
141*437bfbebSnyanmisaka struct drm_version {
142*437bfbebSnyanmisaka     int version_major;    /**< Major version */
143*437bfbebSnyanmisaka     int version_minor;    /**< Minor version */
144*437bfbebSnyanmisaka     int version_patchlevel;   /**< Patch level */
145*437bfbebSnyanmisaka     __kernel_size_t name_len;     /**< Length of name buffer */
146*437bfbebSnyanmisaka     char __user *name;    /**< Name of driver */
147*437bfbebSnyanmisaka     __kernel_size_t date_len;     /**< Length of date buffer */
148*437bfbebSnyanmisaka     char __user *date;    /**< User-space buffer to hold date */
149*437bfbebSnyanmisaka     __kernel_size_t desc_len;     /**< Length of desc buffer */
150*437bfbebSnyanmisaka     char __user *desc;    /**< User-space buffer to hold desc */
151*437bfbebSnyanmisaka };
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka /**
154*437bfbebSnyanmisaka  * DRM_IOCTL_GET_UNIQUE ioctl argument type.
155*437bfbebSnyanmisaka  *
156*437bfbebSnyanmisaka  * \sa drmGetBusid() and drmSetBusId().
157*437bfbebSnyanmisaka  */
158*437bfbebSnyanmisaka struct drm_unique {
159*437bfbebSnyanmisaka     __kernel_size_t unique_len;   /**< Length of unique */
160*437bfbebSnyanmisaka     char __user *unique;      /**< Unique name for driver instantiation */
161*437bfbebSnyanmisaka };
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka struct drm_list {
164*437bfbebSnyanmisaka     int count;        /**< Length of user-space structures */
165*437bfbebSnyanmisaka     struct drm_version __user *version;
166*437bfbebSnyanmisaka };
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka struct drm_block {
169*437bfbebSnyanmisaka     int unused;
170*437bfbebSnyanmisaka };
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka /**
173*437bfbebSnyanmisaka  * DRM_IOCTL_CONTROL ioctl argument type.
174*437bfbebSnyanmisaka  *
175*437bfbebSnyanmisaka  * \sa drmCtlInstHandler() and drmCtlUninstHandler().
176*437bfbebSnyanmisaka  */
177*437bfbebSnyanmisaka struct drm_control {
178*437bfbebSnyanmisaka     enum {
179*437bfbebSnyanmisaka         DRM_ADD_COMMAND,
180*437bfbebSnyanmisaka         DRM_RM_COMMAND,
181*437bfbebSnyanmisaka         DRM_INST_HANDLER,
182*437bfbebSnyanmisaka         DRM_UNINST_HANDLER
183*437bfbebSnyanmisaka     } func;
184*437bfbebSnyanmisaka     int irq;
185*437bfbebSnyanmisaka };
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka /**
188*437bfbebSnyanmisaka  * Type of memory to map.
189*437bfbebSnyanmisaka  */
190*437bfbebSnyanmisaka enum drm_map_type {
191*437bfbebSnyanmisaka     _DRM_FRAME_BUFFER = 0,    /**< WC (no caching), no core dump */
192*437bfbebSnyanmisaka     _DRM_REGISTERS = 1,   /**< no caching, no core dump */
193*437bfbebSnyanmisaka     _DRM_SHM = 2,         /**< shared, cached */
194*437bfbebSnyanmisaka     _DRM_AGP = 3,         /**< AGP/GART */
195*437bfbebSnyanmisaka     _DRM_SCATTER_GATHER = 4,  /**< Scatter/gather memory for PCI DMA */
196*437bfbebSnyanmisaka     _DRM_CONSISTENT = 5   /**< Consistent memory for PCI DMA */
197*437bfbebSnyanmisaka };
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka /**
200*437bfbebSnyanmisaka  * Memory mapping flags.
201*437bfbebSnyanmisaka  */
202*437bfbebSnyanmisaka enum drm_map_flags {
203*437bfbebSnyanmisaka     _DRM_RESTRICTED = 0x01,      /**< Cannot be mapped to user-virtual */
204*437bfbebSnyanmisaka     _DRM_READ_ONLY = 0x02,
205*437bfbebSnyanmisaka     _DRM_LOCKED = 0x04,      /**< shared, cached, locked */
206*437bfbebSnyanmisaka     _DRM_KERNEL = 0x08,      /**< kernel requires access */
207*437bfbebSnyanmisaka     _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
208*437bfbebSnyanmisaka     _DRM_CONTAINS_LOCK = 0x20,   /**< SHM page that contains lock */
209*437bfbebSnyanmisaka     _DRM_REMOVABLE = 0x40,       /**< Removable mapping */
210*437bfbebSnyanmisaka     _DRM_DRIVER = 0x80       /**< Managed by driver */
211*437bfbebSnyanmisaka };
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka struct drm_ctx_priv_map {
214*437bfbebSnyanmisaka     unsigned int ctx_id;     /**< Context requesting private mapping */
215*437bfbebSnyanmisaka     void *handle;        /**< Handle of map */
216*437bfbebSnyanmisaka };
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka /**
219*437bfbebSnyanmisaka  * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
220*437bfbebSnyanmisaka  * argument type.
221*437bfbebSnyanmisaka  *
222*437bfbebSnyanmisaka  * \sa drmAddMap().
223*437bfbebSnyanmisaka  */
224*437bfbebSnyanmisaka struct drm_map {
225*437bfbebSnyanmisaka     unsigned long offset;    /**< Requested physical address (0 for SAREA)*/
226*437bfbebSnyanmisaka     unsigned long size;  /**< Requested physical size (bytes) */
227*437bfbebSnyanmisaka     enum drm_map_type type;  /**< Type of memory to map */
228*437bfbebSnyanmisaka     enum drm_map_flags flags;    /**< Flags */
229*437bfbebSnyanmisaka     void *handle;        /**< User-space: "Handle" to pass to mmap() */
230*437bfbebSnyanmisaka     /**< Kernel-space: kernel-virtual address */
231*437bfbebSnyanmisaka     int mtrr;        /**< MTRR slot used */
232*437bfbebSnyanmisaka     /*   Private data */
233*437bfbebSnyanmisaka };
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka /**
236*437bfbebSnyanmisaka  * DRM_IOCTL_GET_CLIENT ioctl argument type.
237*437bfbebSnyanmisaka  */
238*437bfbebSnyanmisaka struct drm_client {
239*437bfbebSnyanmisaka     int idx;        /**< Which client desired? */
240*437bfbebSnyanmisaka     int auth;       /**< Is client authenticated? */
241*437bfbebSnyanmisaka     unsigned long pid;  /**< Process ID */
242*437bfbebSnyanmisaka     unsigned long uid;  /**< User ID */
243*437bfbebSnyanmisaka     unsigned long magic;    /**< Magic */
244*437bfbebSnyanmisaka     unsigned long iocs; /**< Ioctl count */
245*437bfbebSnyanmisaka };
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka enum drm_stat_type {
248*437bfbebSnyanmisaka     _DRM_STAT_LOCK,
249*437bfbebSnyanmisaka     _DRM_STAT_OPENS,
250*437bfbebSnyanmisaka     _DRM_STAT_CLOSES,
251*437bfbebSnyanmisaka     _DRM_STAT_IOCTLS,
252*437bfbebSnyanmisaka     _DRM_STAT_LOCKS,
253*437bfbebSnyanmisaka     _DRM_STAT_UNLOCKS,
254*437bfbebSnyanmisaka     _DRM_STAT_VALUE,    /**< Generic value */
255*437bfbebSnyanmisaka     _DRM_STAT_BYTE,     /**< Generic byte counter (1024bytes/K) */
256*437bfbebSnyanmisaka     _DRM_STAT_COUNT,    /**< Generic non-byte counter (1000/k) */
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka     _DRM_STAT_IRQ,      /**< IRQ */
259*437bfbebSnyanmisaka     _DRM_STAT_PRIMARY,  /**< Primary DMA bytes */
260*437bfbebSnyanmisaka     _DRM_STAT_SECONDARY,    /**< Secondary DMA bytes */
261*437bfbebSnyanmisaka     _DRM_STAT_DMA,      /**< DMA */
262*437bfbebSnyanmisaka     _DRM_STAT_SPECIAL,  /**< Special DMA (e.g., priority or polled) */
263*437bfbebSnyanmisaka     _DRM_STAT_MISSED    /**< Missed DMA opportunity */
264*437bfbebSnyanmisaka     /* Add to the *END* of the list */
265*437bfbebSnyanmisaka };
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka /**
268*437bfbebSnyanmisaka  * DRM_IOCTL_GET_STATS ioctl argument type.
269*437bfbebSnyanmisaka  */
270*437bfbebSnyanmisaka struct drm_stats {
271*437bfbebSnyanmisaka     unsigned long count;
272*437bfbebSnyanmisaka     struct {
273*437bfbebSnyanmisaka         unsigned long value;
274*437bfbebSnyanmisaka         enum drm_stat_type type;
275*437bfbebSnyanmisaka     } data[15];
276*437bfbebSnyanmisaka };
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka /**
279*437bfbebSnyanmisaka  * Hardware locking flags.
280*437bfbebSnyanmisaka  */
281*437bfbebSnyanmisaka enum drm_lock_flags {
282*437bfbebSnyanmisaka     _DRM_LOCK_READY = 0x01,      /**< Wait until hardware is ready for DMA */
283*437bfbebSnyanmisaka     _DRM_LOCK_QUIESCENT = 0x02,  /**< Wait until hardware quiescent */
284*437bfbebSnyanmisaka     _DRM_LOCK_FLUSH = 0x04,      /**< Flush this context's DMA queue first */
285*437bfbebSnyanmisaka     _DRM_LOCK_FLUSH_ALL = 0x08,  /**< Flush all DMA queues first */
286*437bfbebSnyanmisaka     /* These *HALT* flags aren't supported yet
287*437bfbebSnyanmisaka        -- they will be used to support the
288*437bfbebSnyanmisaka        full-screen DGA-like mode. */
289*437bfbebSnyanmisaka     _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
290*437bfbebSnyanmisaka     _DRM_HALT_CUR_QUEUES = 0x20  /**< Halt all current queues */
291*437bfbebSnyanmisaka };
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka /**
294*437bfbebSnyanmisaka  * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
295*437bfbebSnyanmisaka  *
296*437bfbebSnyanmisaka  * \sa drmGetLock() and drmUnlock().
297*437bfbebSnyanmisaka  */
298*437bfbebSnyanmisaka struct drm_lock {
299*437bfbebSnyanmisaka     int context;
300*437bfbebSnyanmisaka     enum drm_lock_flags flags;
301*437bfbebSnyanmisaka };
302*437bfbebSnyanmisaka 
303*437bfbebSnyanmisaka /**
304*437bfbebSnyanmisaka  * DMA flags
305*437bfbebSnyanmisaka  *
306*437bfbebSnyanmisaka  * \warning
307*437bfbebSnyanmisaka  * These values \e must match xf86drm.h.
308*437bfbebSnyanmisaka  *
309*437bfbebSnyanmisaka  * \sa drm_dma.
310*437bfbebSnyanmisaka  */
311*437bfbebSnyanmisaka enum drm_dma_flags {
312*437bfbebSnyanmisaka     /* Flags for DMA buffer dispatch */
313*437bfbebSnyanmisaka     _DRM_DMA_BLOCK = 0x01,        /**<
314*437bfbebSnyanmisaka                        * Block until buffer dispatched.
315*437bfbebSnyanmisaka                        *
316*437bfbebSnyanmisaka                        * \note The buffer may not yet have
317*437bfbebSnyanmisaka                        * been processed by the hardware --
318*437bfbebSnyanmisaka                        * getting a hardware lock with the
319*437bfbebSnyanmisaka                        * hardware quiescent will ensure
320*437bfbebSnyanmisaka                        * that the buffer has been
321*437bfbebSnyanmisaka                        * processed.
322*437bfbebSnyanmisaka                        */
323*437bfbebSnyanmisaka     _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
324*437bfbebSnyanmisaka     _DRM_DMA_PRIORITY = 0x04,     /**< High priority dispatch */
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka     /* Flags for DMA buffer request */
327*437bfbebSnyanmisaka     _DRM_DMA_WAIT = 0x10,         /**< Wait for free buffers */
328*437bfbebSnyanmisaka     _DRM_DMA_SMALLER_OK = 0x20,   /**< Smaller-than-requested buffers OK */
329*437bfbebSnyanmisaka     _DRM_DMA_LARGER_OK = 0x40     /**< Larger-than-requested buffers OK */
330*437bfbebSnyanmisaka };
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka /**
333*437bfbebSnyanmisaka  * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
334*437bfbebSnyanmisaka  *
335*437bfbebSnyanmisaka  * \sa drmAddBufs().
336*437bfbebSnyanmisaka  */
337*437bfbebSnyanmisaka struct drm_buf_desc {
338*437bfbebSnyanmisaka     int count;       /**< Number of buffers of this size */
339*437bfbebSnyanmisaka     int size;        /**< Size in bytes */
340*437bfbebSnyanmisaka     int low_mark;        /**< Low water mark */
341*437bfbebSnyanmisaka     int high_mark;       /**< High water mark */
342*437bfbebSnyanmisaka     enum {
343*437bfbebSnyanmisaka         _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */
344*437bfbebSnyanmisaka         _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */
345*437bfbebSnyanmisaka         _DRM_SG_BUFFER = 0x04,  /**< Scatter/gather memory buffer */
346*437bfbebSnyanmisaka         _DRM_FB_BUFFER = 0x08,  /**< Buffer is in frame buffer */
347*437bfbebSnyanmisaka         _DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */
348*437bfbebSnyanmisaka     } flags;
349*437bfbebSnyanmisaka     unsigned long agp_start; /**<
350*437bfbebSnyanmisaka                   * Start address of where the AGP buffers are
351*437bfbebSnyanmisaka                   * in the AGP aperture
352*437bfbebSnyanmisaka                   */
353*437bfbebSnyanmisaka };
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka /**
356*437bfbebSnyanmisaka  * DRM_IOCTL_INFO_BUFS ioctl argument type.
357*437bfbebSnyanmisaka  */
358*437bfbebSnyanmisaka struct drm_buf_info {
359*437bfbebSnyanmisaka     int count;      /**< Entries in list */
360*437bfbebSnyanmisaka     struct drm_buf_desc __user *list;
361*437bfbebSnyanmisaka };
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka /**
364*437bfbebSnyanmisaka  * DRM_IOCTL_FREE_BUFS ioctl argument type.
365*437bfbebSnyanmisaka  */
366*437bfbebSnyanmisaka struct drm_buf_free {
367*437bfbebSnyanmisaka     int count;
368*437bfbebSnyanmisaka     int __user *list;
369*437bfbebSnyanmisaka };
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka /**
372*437bfbebSnyanmisaka  * Buffer information
373*437bfbebSnyanmisaka  *
374*437bfbebSnyanmisaka  * \sa drm_buf_map.
375*437bfbebSnyanmisaka  */
376*437bfbebSnyanmisaka struct drm_buf_pub {
377*437bfbebSnyanmisaka     int idx;               /**< Index into the master buffer list */
378*437bfbebSnyanmisaka     int total;             /**< Buffer size */
379*437bfbebSnyanmisaka     int used;              /**< Amount of buffer in use (for DMA) */
380*437bfbebSnyanmisaka     void __user *address;          /**< Address of buffer */
381*437bfbebSnyanmisaka };
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka /**
384*437bfbebSnyanmisaka  * DRM_IOCTL_MAP_BUFS ioctl argument type.
385*437bfbebSnyanmisaka  */
386*437bfbebSnyanmisaka struct drm_buf_map {
387*437bfbebSnyanmisaka     int count;      /**< Length of the buffer list */
388*437bfbebSnyanmisaka #ifdef __cplusplus
389*437bfbebSnyanmisaka     void __user *virt;
390*437bfbebSnyanmisaka #else
391*437bfbebSnyanmisaka     void __user *virtual;       /**< Mmap'd area in user-virtual */
392*437bfbebSnyanmisaka #endif
393*437bfbebSnyanmisaka     struct drm_buf_pub __user *list;    /**< Buffer information */
394*437bfbebSnyanmisaka };
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka /**
397*437bfbebSnyanmisaka  * DRM_IOCTL_DMA ioctl argument type.
398*437bfbebSnyanmisaka  *
399*437bfbebSnyanmisaka  * Indices here refer to the offset into the buffer list in drm_buf_get.
400*437bfbebSnyanmisaka  *
401*437bfbebSnyanmisaka  * \sa drmDMA().
402*437bfbebSnyanmisaka  */
403*437bfbebSnyanmisaka struct drm_dma {
404*437bfbebSnyanmisaka     int context;              /**< Context handle */
405*437bfbebSnyanmisaka     int send_count;           /**< Number of buffers to send */
406*437bfbebSnyanmisaka     int __user *send_indices;     /**< List of handles to buffers */
407*437bfbebSnyanmisaka     int __user *send_sizes;       /**< Lengths of data to send */
408*437bfbebSnyanmisaka     enum drm_dma_flags flags;     /**< Flags */
409*437bfbebSnyanmisaka     int request_count;        /**< Number of buffers requested */
410*437bfbebSnyanmisaka     int request_size;         /**< Desired size for buffers */
411*437bfbebSnyanmisaka     int __user *request_indices;      /**< Buffer information */
412*437bfbebSnyanmisaka     int __user *request_sizes;
413*437bfbebSnyanmisaka     int granted_count;        /**< Number of buffers granted */
414*437bfbebSnyanmisaka };
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka enum drm_ctx_flags {
417*437bfbebSnyanmisaka     _DRM_CONTEXT_PRESERVED = 0x01,
418*437bfbebSnyanmisaka     _DRM_CONTEXT_2DONLY = 0x02
419*437bfbebSnyanmisaka };
420*437bfbebSnyanmisaka 
421*437bfbebSnyanmisaka /**
422*437bfbebSnyanmisaka  * DRM_IOCTL_ADD_CTX ioctl argument type.
423*437bfbebSnyanmisaka  *
424*437bfbebSnyanmisaka  * \sa drmCreateContext() and drmDestroyContext().
425*437bfbebSnyanmisaka  */
426*437bfbebSnyanmisaka struct drm_ctx {
427*437bfbebSnyanmisaka     drm_context_t handle;
428*437bfbebSnyanmisaka     enum drm_ctx_flags flags;
429*437bfbebSnyanmisaka };
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka /**
432*437bfbebSnyanmisaka  * DRM_IOCTL_RES_CTX ioctl argument type.
433*437bfbebSnyanmisaka  */
434*437bfbebSnyanmisaka struct drm_ctx_res {
435*437bfbebSnyanmisaka     int count;
436*437bfbebSnyanmisaka     struct drm_ctx __user *contexts;
437*437bfbebSnyanmisaka };
438*437bfbebSnyanmisaka 
439*437bfbebSnyanmisaka /**
440*437bfbebSnyanmisaka  * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
441*437bfbebSnyanmisaka  */
442*437bfbebSnyanmisaka struct drm_draw {
443*437bfbebSnyanmisaka     drm_drawable_t handle;
444*437bfbebSnyanmisaka };
445*437bfbebSnyanmisaka 
446*437bfbebSnyanmisaka /**
447*437bfbebSnyanmisaka  * DRM_IOCTL_UPDATE_DRAW ioctl argument type.
448*437bfbebSnyanmisaka  */
449*437bfbebSnyanmisaka typedef enum {
450*437bfbebSnyanmisaka     DRM_DRAWABLE_CLIPRECTS
451*437bfbebSnyanmisaka } drm_drawable_info_type_t;
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka struct drm_update_draw {
454*437bfbebSnyanmisaka     drm_drawable_t handle;
455*437bfbebSnyanmisaka     unsigned int type;
456*437bfbebSnyanmisaka     unsigned int num;
457*437bfbebSnyanmisaka     unsigned long long data;
458*437bfbebSnyanmisaka };
459*437bfbebSnyanmisaka 
460*437bfbebSnyanmisaka /**
461*437bfbebSnyanmisaka  * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
462*437bfbebSnyanmisaka  */
463*437bfbebSnyanmisaka struct drm_auth {
464*437bfbebSnyanmisaka     drm_magic_t magic;
465*437bfbebSnyanmisaka };
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka /**
468*437bfbebSnyanmisaka  * DRM_IOCTL_IRQ_BUSID ioctl argument type.
469*437bfbebSnyanmisaka  *
470*437bfbebSnyanmisaka  * \sa drmGetInterruptFromBusID().
471*437bfbebSnyanmisaka  */
472*437bfbebSnyanmisaka struct drm_irq_busid {
473*437bfbebSnyanmisaka     int irq;    /**< IRQ number */
474*437bfbebSnyanmisaka     int busnum; /**< bus number */
475*437bfbebSnyanmisaka     int devnum; /**< device number */
476*437bfbebSnyanmisaka     int funcnum;    /**< function number */
477*437bfbebSnyanmisaka };
478*437bfbebSnyanmisaka 
479*437bfbebSnyanmisaka enum drm_vblank_seq_type {
480*437bfbebSnyanmisaka     _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
481*437bfbebSnyanmisaka     _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
482*437bfbebSnyanmisaka     /* bits 1-6 are reserved for high crtcs */
483*437bfbebSnyanmisaka     _DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
484*437bfbebSnyanmisaka     _DRM_VBLANK_EVENT = 0x4000000,   /**< Send event instead of blocking */
485*437bfbebSnyanmisaka     _DRM_VBLANK_FLIP = 0x8000000,   /**< Scheduled buffer swap should flip */
486*437bfbebSnyanmisaka     _DRM_VBLANK_NEXTONMISS = 0x10000000,    /**< If missed, wait for next vblank */
487*437bfbebSnyanmisaka     _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
488*437bfbebSnyanmisaka     _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking, unsupported */
489*437bfbebSnyanmisaka };
490*437bfbebSnyanmisaka #define _DRM_VBLANK_HIGH_CRTC_SHIFT 1
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka #define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE)
493*437bfbebSnyanmisaka #define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \
494*437bfbebSnyanmisaka                 _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)
495*437bfbebSnyanmisaka 
496*437bfbebSnyanmisaka struct drm_wait_vblank_request {
497*437bfbebSnyanmisaka     enum drm_vblank_seq_type type;
498*437bfbebSnyanmisaka     unsigned int sequence;
499*437bfbebSnyanmisaka     unsigned long signal;
500*437bfbebSnyanmisaka };
501*437bfbebSnyanmisaka 
502*437bfbebSnyanmisaka struct drm_wait_vblank_reply {
503*437bfbebSnyanmisaka     enum drm_vblank_seq_type type;
504*437bfbebSnyanmisaka     unsigned int sequence;
505*437bfbebSnyanmisaka     long tval_sec;
506*437bfbebSnyanmisaka     long tval_usec;
507*437bfbebSnyanmisaka };
508*437bfbebSnyanmisaka 
509*437bfbebSnyanmisaka /**
510*437bfbebSnyanmisaka  * DRM_IOCTL_WAIT_VBLANK ioctl argument type.
511*437bfbebSnyanmisaka  *
512*437bfbebSnyanmisaka  * \sa drmWaitVBlank().
513*437bfbebSnyanmisaka  */
514*437bfbebSnyanmisaka union drm_wait_vblank {
515*437bfbebSnyanmisaka     struct drm_wait_vblank_request request;
516*437bfbebSnyanmisaka     struct drm_wait_vblank_reply reply;
517*437bfbebSnyanmisaka };
518*437bfbebSnyanmisaka 
519*437bfbebSnyanmisaka #define _DRM_PRE_MODESET 1
520*437bfbebSnyanmisaka #define _DRM_POST_MODESET 2
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka /**
523*437bfbebSnyanmisaka  * DRM_IOCTL_MODESET_CTL ioctl argument type
524*437bfbebSnyanmisaka  *
525*437bfbebSnyanmisaka  * \sa drmModesetCtl().
526*437bfbebSnyanmisaka  */
527*437bfbebSnyanmisaka struct drm_modeset_ctl {
528*437bfbebSnyanmisaka     __u32 crtc;
529*437bfbebSnyanmisaka     __u32 cmd;
530*437bfbebSnyanmisaka };
531*437bfbebSnyanmisaka 
532*437bfbebSnyanmisaka /**
533*437bfbebSnyanmisaka  * DRM_IOCTL_AGP_ENABLE ioctl argument type.
534*437bfbebSnyanmisaka  *
535*437bfbebSnyanmisaka  * \sa drmAgpEnable().
536*437bfbebSnyanmisaka  */
537*437bfbebSnyanmisaka struct drm_agp_mode {
538*437bfbebSnyanmisaka     unsigned long mode; /**< AGP mode */
539*437bfbebSnyanmisaka };
540*437bfbebSnyanmisaka 
541*437bfbebSnyanmisaka /**
542*437bfbebSnyanmisaka  * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
543*437bfbebSnyanmisaka  *
544*437bfbebSnyanmisaka  * \sa drmAgpAlloc() and drmAgpFree().
545*437bfbebSnyanmisaka  */
546*437bfbebSnyanmisaka struct drm_agp_buffer {
547*437bfbebSnyanmisaka     unsigned long size; /**< In bytes -- will round to page boundary */
548*437bfbebSnyanmisaka     unsigned long handle;   /**< Used for binding / unbinding */
549*437bfbebSnyanmisaka     unsigned long type; /**< Type of memory to allocate */
550*437bfbebSnyanmisaka     unsigned long physical; /**< Physical used by i810 */
551*437bfbebSnyanmisaka };
552*437bfbebSnyanmisaka 
553*437bfbebSnyanmisaka /**
554*437bfbebSnyanmisaka  * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
555*437bfbebSnyanmisaka  *
556*437bfbebSnyanmisaka  * \sa drmAgpBind() and drmAgpUnbind().
557*437bfbebSnyanmisaka  */
558*437bfbebSnyanmisaka struct drm_agp_binding {
559*437bfbebSnyanmisaka     unsigned long handle;   /**< From drm_agp_buffer */
560*437bfbebSnyanmisaka     unsigned long offset;   /**< In bytes -- will round to page boundary */
561*437bfbebSnyanmisaka };
562*437bfbebSnyanmisaka 
563*437bfbebSnyanmisaka /**
564*437bfbebSnyanmisaka  * DRM_IOCTL_AGP_INFO ioctl argument type.
565*437bfbebSnyanmisaka  *
566*437bfbebSnyanmisaka  * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(),
567*437bfbebSnyanmisaka  * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(),
568*437bfbebSnyanmisaka  * drmAgpVendorId() and drmAgpDeviceId().
569*437bfbebSnyanmisaka  */
570*437bfbebSnyanmisaka struct drm_agp_info {
571*437bfbebSnyanmisaka     int agp_version_major;
572*437bfbebSnyanmisaka     int agp_version_minor;
573*437bfbebSnyanmisaka     unsigned long mode;
574*437bfbebSnyanmisaka     unsigned long aperture_base;    /* physical address */
575*437bfbebSnyanmisaka     unsigned long aperture_size;    /* bytes */
576*437bfbebSnyanmisaka     unsigned long memory_allowed;   /* bytes */
577*437bfbebSnyanmisaka     unsigned long memory_used;
578*437bfbebSnyanmisaka 
579*437bfbebSnyanmisaka     /* PCI information */
580*437bfbebSnyanmisaka     unsigned short id_vendor;
581*437bfbebSnyanmisaka     unsigned short id_device;
582*437bfbebSnyanmisaka };
583*437bfbebSnyanmisaka 
584*437bfbebSnyanmisaka /**
585*437bfbebSnyanmisaka  * DRM_IOCTL_SG_ALLOC ioctl argument type.
586*437bfbebSnyanmisaka  */
587*437bfbebSnyanmisaka struct drm_scatter_gather {
588*437bfbebSnyanmisaka     unsigned long size; /**< In bytes -- will round to page boundary */
589*437bfbebSnyanmisaka     unsigned long handle;   /**< Used for mapping / unmapping */
590*437bfbebSnyanmisaka };
591*437bfbebSnyanmisaka 
592*437bfbebSnyanmisaka /**
593*437bfbebSnyanmisaka  * DRM_IOCTL_SET_VERSION ioctl argument type.
594*437bfbebSnyanmisaka  */
595*437bfbebSnyanmisaka struct drm_set_version {
596*437bfbebSnyanmisaka     int drm_di_major;
597*437bfbebSnyanmisaka     int drm_di_minor;
598*437bfbebSnyanmisaka     int drm_dd_major;
599*437bfbebSnyanmisaka     int drm_dd_minor;
600*437bfbebSnyanmisaka };
601*437bfbebSnyanmisaka 
602*437bfbebSnyanmisaka /** DRM_IOCTL_GEM_CLOSE ioctl argument type */
603*437bfbebSnyanmisaka struct drm_gem_close {
604*437bfbebSnyanmisaka     /** Handle of the object to be closed. */
605*437bfbebSnyanmisaka     __u32 handle;
606*437bfbebSnyanmisaka     __u32 pad;
607*437bfbebSnyanmisaka };
608*437bfbebSnyanmisaka 
609*437bfbebSnyanmisaka /** DRM_IOCTL_GEM_FLINK ioctl argument type */
610*437bfbebSnyanmisaka struct drm_gem_flink {
611*437bfbebSnyanmisaka     /** Handle for the object being named */
612*437bfbebSnyanmisaka     __u32 handle;
613*437bfbebSnyanmisaka 
614*437bfbebSnyanmisaka     /** Returned global name */
615*437bfbebSnyanmisaka     __u32 name;
616*437bfbebSnyanmisaka };
617*437bfbebSnyanmisaka 
618*437bfbebSnyanmisaka /** DRM_IOCTL_GEM_OPEN ioctl argument type */
619*437bfbebSnyanmisaka struct drm_gem_open {
620*437bfbebSnyanmisaka     /** Name of object being opened */
621*437bfbebSnyanmisaka     __u32 name;
622*437bfbebSnyanmisaka 
623*437bfbebSnyanmisaka     /** Returned handle for the object */
624*437bfbebSnyanmisaka     __u32 handle;
625*437bfbebSnyanmisaka 
626*437bfbebSnyanmisaka     /** Returned size of the object */
627*437bfbebSnyanmisaka     __u64 size;
628*437bfbebSnyanmisaka };
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka #define DRM_CAP_DUMB_BUFFER     0x1
631*437bfbebSnyanmisaka #define DRM_CAP_VBLANK_HIGH_CRTC    0x2
632*437bfbebSnyanmisaka #define DRM_CAP_DUMB_PREFERRED_DEPTH    0x3
633*437bfbebSnyanmisaka #define DRM_CAP_DUMB_PREFER_SHADOW  0x4
634*437bfbebSnyanmisaka #define DRM_CAP_PRIME           0x5
635*437bfbebSnyanmisaka #define  DRM_PRIME_CAP_IMPORT       0x1
636*437bfbebSnyanmisaka #define  DRM_PRIME_CAP_EXPORT       0x2
637*437bfbebSnyanmisaka #define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
638*437bfbebSnyanmisaka #define DRM_CAP_ASYNC_PAGE_FLIP     0x7
639*437bfbebSnyanmisaka /*
640*437bfbebSnyanmisaka  * The CURSOR_WIDTH and CURSOR_HEIGHT capabilities return a valid widthxheight
641*437bfbebSnyanmisaka  * combination for the hardware cursor. The intention is that a hardware
642*437bfbebSnyanmisaka  * agnostic userspace can query a cursor plane size to use.
643*437bfbebSnyanmisaka  *
644*437bfbebSnyanmisaka  * Note that the cross-driver contract is to merely return a valid size;
645*437bfbebSnyanmisaka  * drivers are free to attach another meaning on top, eg. i915 returns the
646*437bfbebSnyanmisaka  * maximum plane size.
647*437bfbebSnyanmisaka  */
648*437bfbebSnyanmisaka #define DRM_CAP_CURSOR_WIDTH        0x8
649*437bfbebSnyanmisaka #define DRM_CAP_CURSOR_HEIGHT       0x9
650*437bfbebSnyanmisaka #define DRM_CAP_ADDFB2_MODIFIERS    0x10
651*437bfbebSnyanmisaka #define DRM_CAP_PAGE_FLIP_TARGET    0x11
652*437bfbebSnyanmisaka #define DRM_CAP_CRTC_IN_VBLANK_EVENT    0x12
653*437bfbebSnyanmisaka #define DRM_CAP_SYNCOBJ     0x13
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka /** DRM_IOCTL_GET_CAP ioctl argument type */
656*437bfbebSnyanmisaka struct drm_get_cap {
657*437bfbebSnyanmisaka     __u64 capability;
658*437bfbebSnyanmisaka     __u64 value;
659*437bfbebSnyanmisaka };
660*437bfbebSnyanmisaka 
661*437bfbebSnyanmisaka /**
662*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_STEREO_3D
663*437bfbebSnyanmisaka  *
664*437bfbebSnyanmisaka  * if set to 1, the DRM core will expose the stereo 3D capabilities of the
665*437bfbebSnyanmisaka  * monitor by advertising the supported 3D layouts in the flags of struct
666*437bfbebSnyanmisaka  * drm_mode_modeinfo.
667*437bfbebSnyanmisaka  */
668*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_STEREO_3D    1
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka /**
671*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_UNIVERSAL_PLANES
672*437bfbebSnyanmisaka  *
673*437bfbebSnyanmisaka  * If set to 1, the DRM core will expose all planes (overlay, primary, and
674*437bfbebSnyanmisaka  * cursor) to userspace.
675*437bfbebSnyanmisaka  */
676*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_UNIVERSAL_PLANES  2
677*437bfbebSnyanmisaka 
678*437bfbebSnyanmisaka /**
679*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_ATOMIC
680*437bfbebSnyanmisaka  *
681*437bfbebSnyanmisaka  * If set to 1, the DRM core will expose atomic properties to userspace
682*437bfbebSnyanmisaka  */
683*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_ATOMIC   3
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka /**
686*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_ASPECT_RATIO
687*437bfbebSnyanmisaka  *
688*437bfbebSnyanmisaka  * If set to 1, the DRM core will provide aspect ratio information in modes.
689*437bfbebSnyanmisaka  */
690*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_ASPECT_RATIO    4
691*437bfbebSnyanmisaka 
692*437bfbebSnyanmisaka /**
693*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
694*437bfbebSnyanmisaka  *
695*437bfbebSnyanmisaka  * If set to 1, the DRM core will expose special connectors to be used for
696*437bfbebSnyanmisaka  * writing back to memory the scene setup in the commit. Depends on client
697*437bfbebSnyanmisaka  * also supporting DRM_CLIENT_CAP_ATOMIC
698*437bfbebSnyanmisaka  */
699*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
700*437bfbebSnyanmisaka 
701*437bfbebSnyanmisaka /*
702*437bfbebSnyanmisaka  * DRM_CLIENT_CAP_SHARE_PLANES
703*437bfbebSnyanmisaka  *
704*437bfbebSnyanmisaka  * If set to 1, the DRM core will expose share planes to userspace.
705*437bfbebSnyanmisaka  */
706*437bfbebSnyanmisaka #define DRM_CLIENT_CAP_SHARE_PLANES 6
707*437bfbebSnyanmisaka 
708*437bfbebSnyanmisaka /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
709*437bfbebSnyanmisaka struct drm_set_client_cap {
710*437bfbebSnyanmisaka     __u64 capability;
711*437bfbebSnyanmisaka     __u64 value;
712*437bfbebSnyanmisaka };
713*437bfbebSnyanmisaka 
714*437bfbebSnyanmisaka #define DRM_RDWR O_RDWR
715*437bfbebSnyanmisaka #define DRM_CLOEXEC O_CLOEXEC
716*437bfbebSnyanmisaka struct drm_prime_handle {
717*437bfbebSnyanmisaka     __u32 handle;
718*437bfbebSnyanmisaka 
719*437bfbebSnyanmisaka     /** Flags.. only applicable for handle->fd */
720*437bfbebSnyanmisaka     __u32 flags;
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka     /** Returned dmabuf file descriptor */
723*437bfbebSnyanmisaka     __s32 fd;
724*437bfbebSnyanmisaka };
725*437bfbebSnyanmisaka 
726*437bfbebSnyanmisaka struct drm_syncobj_create {
727*437bfbebSnyanmisaka     __u32 handle;
728*437bfbebSnyanmisaka #define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
729*437bfbebSnyanmisaka     __u32 flags;
730*437bfbebSnyanmisaka };
731*437bfbebSnyanmisaka 
732*437bfbebSnyanmisaka struct drm_syncobj_destroy {
733*437bfbebSnyanmisaka     __u32 handle;
734*437bfbebSnyanmisaka     __u32 pad;
735*437bfbebSnyanmisaka };
736*437bfbebSnyanmisaka 
737*437bfbebSnyanmisaka #define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
738*437bfbebSnyanmisaka #define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
739*437bfbebSnyanmisaka struct drm_syncobj_handle {
740*437bfbebSnyanmisaka     __u32 handle;
741*437bfbebSnyanmisaka     __u32 flags;
742*437bfbebSnyanmisaka 
743*437bfbebSnyanmisaka     __s32 fd;
744*437bfbebSnyanmisaka     __u32 pad;
745*437bfbebSnyanmisaka };
746*437bfbebSnyanmisaka 
747*437bfbebSnyanmisaka #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
748*437bfbebSnyanmisaka #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
749*437bfbebSnyanmisaka struct drm_syncobj_wait {
750*437bfbebSnyanmisaka     __u64 handles;
751*437bfbebSnyanmisaka     /* absolute timeout */
752*437bfbebSnyanmisaka     __s64 timeout_nsec;
753*437bfbebSnyanmisaka     __u32 count_handles;
754*437bfbebSnyanmisaka     __u32 flags;
755*437bfbebSnyanmisaka     __u32 first_signaled; /* only valid when not waiting all */
756*437bfbebSnyanmisaka     __u32 pad;
757*437bfbebSnyanmisaka };
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka struct drm_syncobj_array {
760*437bfbebSnyanmisaka     __u64 handles;
761*437bfbebSnyanmisaka     __u32 count_handles;
762*437bfbebSnyanmisaka     __u32 pad;
763*437bfbebSnyanmisaka };
764*437bfbebSnyanmisaka 
765*437bfbebSnyanmisaka /* Query current scanout sequence number */
766*437bfbebSnyanmisaka struct drm_crtc_get_sequence {
767*437bfbebSnyanmisaka     __u32 crtc_id;      /* requested crtc_id */
768*437bfbebSnyanmisaka     __u32 active;       /* return: crtc output is active */
769*437bfbebSnyanmisaka     __u64 sequence;     /* return: most recent vblank sequence */
770*437bfbebSnyanmisaka     __s64 sequence_ns;  /* return: most recent time of first pixel out */
771*437bfbebSnyanmisaka };
772*437bfbebSnyanmisaka 
773*437bfbebSnyanmisaka /* Queue event to be delivered at specified sequence. Time stamp marks
774*437bfbebSnyanmisaka  * when the first pixel of the refresh cycle leaves the display engine
775*437bfbebSnyanmisaka  * for the display
776*437bfbebSnyanmisaka  */
777*437bfbebSnyanmisaka #define DRM_CRTC_SEQUENCE_RELATIVE      0x00000001  /* sequence is relative to current */
778*437bfbebSnyanmisaka #define DRM_CRTC_SEQUENCE_NEXT_ON_MISS      0x00000002  /* Use next sequence if we've missed */
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka struct drm_crtc_queue_sequence {
781*437bfbebSnyanmisaka     __u32 crtc_id;
782*437bfbebSnyanmisaka     __u32 flags;
783*437bfbebSnyanmisaka     __u64 sequence;     /* on input, target sequence. on output, actual sequence */
784*437bfbebSnyanmisaka     __u64 user_data;    /* user data passed to event */
785*437bfbebSnyanmisaka };
786*437bfbebSnyanmisaka 
787*437bfbebSnyanmisaka #if defined(__cplusplus)
788*437bfbebSnyanmisaka }
789*437bfbebSnyanmisaka #endif
790*437bfbebSnyanmisaka 
791*437bfbebSnyanmisaka #include "drm_mode.h"
792*437bfbebSnyanmisaka 
793*437bfbebSnyanmisaka #if defined(__cplusplus)
794*437bfbebSnyanmisaka extern "C" {
795*437bfbebSnyanmisaka #endif
796*437bfbebSnyanmisaka 
797*437bfbebSnyanmisaka #define DRM_IOCTL_BASE          'd'
798*437bfbebSnyanmisaka #define DRM_IO(nr)          _IO(DRM_IOCTL_BASE,nr)
799*437bfbebSnyanmisaka #define DRM_IOR(nr,type)        _IOR(DRM_IOCTL_BASE,nr,type)
800*437bfbebSnyanmisaka #define DRM_IOW(nr,type)        _IOW(DRM_IOCTL_BASE,nr,type)
801*437bfbebSnyanmisaka #define DRM_IOWR(nr,type)       _IOWR(DRM_IOCTL_BASE,nr,type)
802*437bfbebSnyanmisaka 
803*437bfbebSnyanmisaka #define DRM_IOCTL_VERSION       DRM_IOWR(0x00, struct drm_version)
804*437bfbebSnyanmisaka #define DRM_IOCTL_GET_UNIQUE        DRM_IOWR(0x01, struct drm_unique)
805*437bfbebSnyanmisaka #define DRM_IOCTL_GET_MAGIC     DRM_IOR( 0x02, struct drm_auth)
806*437bfbebSnyanmisaka #define DRM_IOCTL_IRQ_BUSID     DRM_IOWR(0x03, struct drm_irq_busid)
807*437bfbebSnyanmisaka #define DRM_IOCTL_GET_MAP               DRM_IOWR(0x04, struct drm_map)
808*437bfbebSnyanmisaka #define DRM_IOCTL_GET_CLIENT            DRM_IOWR(0x05, struct drm_client)
809*437bfbebSnyanmisaka #define DRM_IOCTL_GET_STATS             DRM_IOR( 0x06, struct drm_stats)
810*437bfbebSnyanmisaka #define DRM_IOCTL_SET_VERSION       DRM_IOWR(0x07, struct drm_set_version)
811*437bfbebSnyanmisaka #define DRM_IOCTL_MODESET_CTL           DRM_IOW(0x08, struct drm_modeset_ctl)
812*437bfbebSnyanmisaka #define DRM_IOCTL_GEM_CLOSE     DRM_IOW (0x09, struct drm_gem_close)
813*437bfbebSnyanmisaka #define DRM_IOCTL_GEM_FLINK     DRM_IOWR(0x0a, struct drm_gem_flink)
814*437bfbebSnyanmisaka #define DRM_IOCTL_GEM_OPEN      DRM_IOWR(0x0b, struct drm_gem_open)
815*437bfbebSnyanmisaka #define DRM_IOCTL_GET_CAP       DRM_IOWR(0x0c, struct drm_get_cap)
816*437bfbebSnyanmisaka #define DRM_IOCTL_SET_CLIENT_CAP    DRM_IOW( 0x0d, struct drm_set_client_cap)
817*437bfbebSnyanmisaka 
818*437bfbebSnyanmisaka #define DRM_IOCTL_SET_UNIQUE        DRM_IOW( 0x10, struct drm_unique)
819*437bfbebSnyanmisaka #define DRM_IOCTL_AUTH_MAGIC        DRM_IOW( 0x11, struct drm_auth)
820*437bfbebSnyanmisaka #define DRM_IOCTL_BLOCK         DRM_IOWR(0x12, struct drm_block)
821*437bfbebSnyanmisaka #define DRM_IOCTL_UNBLOCK       DRM_IOWR(0x13, struct drm_block)
822*437bfbebSnyanmisaka #define DRM_IOCTL_CONTROL       DRM_IOW( 0x14, struct drm_control)
823*437bfbebSnyanmisaka #define DRM_IOCTL_ADD_MAP       DRM_IOWR(0x15, struct drm_map)
824*437bfbebSnyanmisaka #define DRM_IOCTL_ADD_BUFS      DRM_IOWR(0x16, struct drm_buf_desc)
825*437bfbebSnyanmisaka #define DRM_IOCTL_MARK_BUFS     DRM_IOW( 0x17, struct drm_buf_desc)
826*437bfbebSnyanmisaka #define DRM_IOCTL_INFO_BUFS     DRM_IOWR(0x18, struct drm_buf_info)
827*437bfbebSnyanmisaka #define DRM_IOCTL_MAP_BUFS      DRM_IOWR(0x19, struct drm_buf_map)
828*437bfbebSnyanmisaka #define DRM_IOCTL_FREE_BUFS     DRM_IOW( 0x1a, struct drm_buf_free)
829*437bfbebSnyanmisaka 
830*437bfbebSnyanmisaka #define DRM_IOCTL_RM_MAP        DRM_IOW( 0x1b, struct drm_map)
831*437bfbebSnyanmisaka 
832*437bfbebSnyanmisaka #define DRM_IOCTL_SET_SAREA_CTX     DRM_IOW( 0x1c, struct drm_ctx_priv_map)
833*437bfbebSnyanmisaka #define DRM_IOCTL_GET_SAREA_CTX     DRM_IOWR(0x1d, struct drm_ctx_priv_map)
834*437bfbebSnyanmisaka 
835*437bfbebSnyanmisaka #define DRM_IOCTL_SET_MASTER            DRM_IO(0x1e)
836*437bfbebSnyanmisaka #define DRM_IOCTL_DROP_MASTER           DRM_IO(0x1f)
837*437bfbebSnyanmisaka 
838*437bfbebSnyanmisaka #define DRM_IOCTL_ADD_CTX       DRM_IOWR(0x20, struct drm_ctx)
839*437bfbebSnyanmisaka #define DRM_IOCTL_RM_CTX        DRM_IOWR(0x21, struct drm_ctx)
840*437bfbebSnyanmisaka #define DRM_IOCTL_MOD_CTX       DRM_IOW( 0x22, struct drm_ctx)
841*437bfbebSnyanmisaka #define DRM_IOCTL_GET_CTX       DRM_IOWR(0x23, struct drm_ctx)
842*437bfbebSnyanmisaka #define DRM_IOCTL_SWITCH_CTX        DRM_IOW( 0x24, struct drm_ctx)
843*437bfbebSnyanmisaka #define DRM_IOCTL_NEW_CTX       DRM_IOW( 0x25, struct drm_ctx)
844*437bfbebSnyanmisaka #define DRM_IOCTL_RES_CTX       DRM_IOWR(0x26, struct drm_ctx_res)
845*437bfbebSnyanmisaka #define DRM_IOCTL_ADD_DRAW      DRM_IOWR(0x27, struct drm_draw)
846*437bfbebSnyanmisaka #define DRM_IOCTL_RM_DRAW       DRM_IOWR(0x28, struct drm_draw)
847*437bfbebSnyanmisaka #define DRM_IOCTL_DMA           DRM_IOWR(0x29, struct drm_dma)
848*437bfbebSnyanmisaka #define DRM_IOCTL_LOCK          DRM_IOW( 0x2a, struct drm_lock)
849*437bfbebSnyanmisaka #define DRM_IOCTL_UNLOCK        DRM_IOW( 0x2b, struct drm_lock)
850*437bfbebSnyanmisaka #define DRM_IOCTL_FINISH        DRM_IOW( 0x2c, struct drm_lock)
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka #define DRM_IOCTL_PRIME_HANDLE_TO_FD    DRM_IOWR(0x2d, struct drm_prime_handle)
853*437bfbebSnyanmisaka #define DRM_IOCTL_PRIME_FD_TO_HANDLE    DRM_IOWR(0x2e, struct drm_prime_handle)
854*437bfbebSnyanmisaka 
855*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_ACQUIRE       DRM_IO(  0x30)
856*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_RELEASE       DRM_IO(  0x31)
857*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_ENABLE        DRM_IOW( 0x32, struct drm_agp_mode)
858*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_INFO      DRM_IOR( 0x33, struct drm_agp_info)
859*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_ALLOC     DRM_IOWR(0x34, struct drm_agp_buffer)
860*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_FREE      DRM_IOW( 0x35, struct drm_agp_buffer)
861*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_BIND      DRM_IOW( 0x36, struct drm_agp_binding)
862*437bfbebSnyanmisaka #define DRM_IOCTL_AGP_UNBIND        DRM_IOW( 0x37, struct drm_agp_binding)
863*437bfbebSnyanmisaka 
864*437bfbebSnyanmisaka #define DRM_IOCTL_SG_ALLOC      DRM_IOWR(0x38, struct drm_scatter_gather)
865*437bfbebSnyanmisaka #define DRM_IOCTL_SG_FREE       DRM_IOW( 0x39, struct drm_scatter_gather)
866*437bfbebSnyanmisaka 
867*437bfbebSnyanmisaka #define DRM_IOCTL_WAIT_VBLANK       DRM_IOWR(0x3a, union drm_wait_vblank)
868*437bfbebSnyanmisaka 
869*437bfbebSnyanmisaka #define DRM_IOCTL_CRTC_GET_SEQUENCE DRM_IOWR(0x3b, struct drm_crtc_get_sequence)
870*437bfbebSnyanmisaka #define DRM_IOCTL_CRTC_QUEUE_SEQUENCE   DRM_IOWR(0x3c, struct drm_crtc_queue_sequence)
871*437bfbebSnyanmisaka 
872*437bfbebSnyanmisaka #define DRM_IOCTL_UPDATE_DRAW       DRM_IOW(0x3f, struct drm_update_draw)
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
875*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETCRTC      DRM_IOWR(0xA1, struct drm_mode_crtc)
876*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_SETCRTC      DRM_IOWR(0xA2, struct drm_mode_crtc)
877*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_CURSOR       DRM_IOWR(0xA3, struct drm_mode_cursor)
878*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETGAMMA     DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
879*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_SETGAMMA     DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
880*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETENCODER   DRM_IOWR(0xA6, struct drm_mode_get_encoder)
881*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
882*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_ATTACHMODE   DRM_IOWR(0xA8, struct drm_mode_mode_cmd) /* deprecated (never worked) */
883*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_DETACHMODE   DRM_IOWR(0xA9, struct drm_mode_mode_cmd) /* deprecated (never worked) */
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETPROPERTY  DRM_IOWR(0xAA, struct drm_mode_get_property)
886*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_SETPROPERTY  DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
887*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETPROPBLOB  DRM_IOWR(0xAC, struct drm_mode_get_blob)
888*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETFB        DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
889*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_ADDFB        DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
890*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_RMFB     DRM_IOWR(0xAF, unsigned int)
891*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_PAGE_FLIP    DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
892*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_DIRTYFB      DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
893*437bfbebSnyanmisaka 
894*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
895*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_MAP_DUMB    DRM_IOWR(0xB3, struct drm_mode_map_dumb)
896*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_DESTROY_DUMB    DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
897*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
898*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane)
899*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane)
900*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_ADDFB2       DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
901*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_OBJ_GETPROPERTIES    DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
902*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_OBJ_SETPROPERTY  DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
903*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_CURSOR2      DRM_IOWR(0xBB, struct drm_mode_cursor2)
904*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_ATOMIC       DRM_IOWR(0xBC, struct drm_mode_atomic)
905*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_CREATEPROPBLOB   DRM_IOWR(0xBD, struct drm_mode_create_blob)
906*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_DESTROYPROPBLOB  DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
907*437bfbebSnyanmisaka 
908*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_CREATE    DRM_IOWR(0xBF, struct drm_syncobj_create)
909*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_DESTROY   DRM_IOWR(0xC0, struct drm_syncobj_destroy)
910*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD  DRM_IOWR(0xC1, struct drm_syncobj_handle)
911*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE  DRM_IOWR(0xC2, struct drm_syncobj_handle)
912*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_WAIT      DRM_IOWR(0xC3, struct drm_syncobj_wait)
913*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_RESET     DRM_IOWR(0xC4, struct drm_syncobj_array)
914*437bfbebSnyanmisaka #define DRM_IOCTL_SYNCOBJ_SIGNAL    DRM_IOWR(0xC5, struct drm_syncobj_array)
915*437bfbebSnyanmisaka 
916*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_CREATE_LEASE DRM_IOWR(0xC6, struct drm_mode_create_lease)
917*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_LIST_LESSEES DRM_IOWR(0xC7, struct drm_mode_list_lessees)
918*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_GET_LEASE    DRM_IOWR(0xC8, struct drm_mode_get_lease)
919*437bfbebSnyanmisaka #define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
920*437bfbebSnyanmisaka 
921*437bfbebSnyanmisaka /**
922*437bfbebSnyanmisaka  * Device specific ioctls should only be in their respective headers
923*437bfbebSnyanmisaka  * The device specific ioctl range is from 0x40 to 0x9f.
924*437bfbebSnyanmisaka  * Generic IOCTLS restart at 0xA0.
925*437bfbebSnyanmisaka  *
926*437bfbebSnyanmisaka  * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
927*437bfbebSnyanmisaka  * drmCommandReadWrite().
928*437bfbebSnyanmisaka  */
929*437bfbebSnyanmisaka #define DRM_COMMAND_BASE                0x40
930*437bfbebSnyanmisaka #define DRM_COMMAND_END         0xA0
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka /**
933*437bfbebSnyanmisaka  * Header for events written back to userspace on the drm fd.  The
934*437bfbebSnyanmisaka  * type defines the type of event, the length specifies the total
935*437bfbebSnyanmisaka  * length of the event (including the header), and user_data is
936*437bfbebSnyanmisaka  * typically a 64 bit value passed with the ioctl that triggered the
937*437bfbebSnyanmisaka  * event.  A read on the drm fd will always only return complete
938*437bfbebSnyanmisaka  * events, that is, if for example the read buffer is 100 bytes, and
939*437bfbebSnyanmisaka  * there are two 64 byte events pending, only one will be returned.
940*437bfbebSnyanmisaka  *
941*437bfbebSnyanmisaka  * Event types 0 - 0x7fffffff are generic drm events, 0x80000000 and
942*437bfbebSnyanmisaka  * up are chipset specific.
943*437bfbebSnyanmisaka  */
944*437bfbebSnyanmisaka struct drm_event {
945*437bfbebSnyanmisaka     __u32 type;
946*437bfbebSnyanmisaka     __u32 length;
947*437bfbebSnyanmisaka };
948*437bfbebSnyanmisaka 
949*437bfbebSnyanmisaka #define DRM_EVENT_VBLANK 0x01
950*437bfbebSnyanmisaka #define DRM_EVENT_FLIP_COMPLETE 0x02
951*437bfbebSnyanmisaka #define DRM_EVENT_CRTC_SEQUENCE 0x03
952*437bfbebSnyanmisaka 
953*437bfbebSnyanmisaka struct drm_event_vblank {
954*437bfbebSnyanmisaka     struct drm_event base;
955*437bfbebSnyanmisaka     __u64 user_data;
956*437bfbebSnyanmisaka     __u32 tv_sec;
957*437bfbebSnyanmisaka     __u32 tv_usec;
958*437bfbebSnyanmisaka     __u32 sequence;
959*437bfbebSnyanmisaka     __u32 crtc_id; /* 0 on older kernels that do not support this */
960*437bfbebSnyanmisaka };
961*437bfbebSnyanmisaka 
962*437bfbebSnyanmisaka /* Event delivered at sequence. Time stamp marks when the first pixel
963*437bfbebSnyanmisaka  * of the refresh cycle leaves the display engine for the display
964*437bfbebSnyanmisaka  */
965*437bfbebSnyanmisaka struct drm_event_crtc_sequence {
966*437bfbebSnyanmisaka     struct drm_event    base;
967*437bfbebSnyanmisaka     __u64           user_data;
968*437bfbebSnyanmisaka     __s64           time_ns;
969*437bfbebSnyanmisaka     __u64           sequence;
970*437bfbebSnyanmisaka };
971*437bfbebSnyanmisaka 
972*437bfbebSnyanmisaka /* typedef area */
973*437bfbebSnyanmisaka #ifndef __KERNEL__
974*437bfbebSnyanmisaka typedef struct drm_clip_rect drm_clip_rect_t;
975*437bfbebSnyanmisaka typedef struct drm_drawable_info drm_drawable_info_t;
976*437bfbebSnyanmisaka typedef struct drm_tex_region drm_tex_region_t;
977*437bfbebSnyanmisaka typedef struct drm_hw_lock drm_hw_lock_t;
978*437bfbebSnyanmisaka typedef struct drm_version drm_version_t;
979*437bfbebSnyanmisaka typedef struct drm_unique drm_unique_t;
980*437bfbebSnyanmisaka typedef struct drm_list drm_list_t;
981*437bfbebSnyanmisaka typedef struct drm_block drm_block_t;
982*437bfbebSnyanmisaka typedef struct drm_control drm_control_t;
983*437bfbebSnyanmisaka typedef enum drm_map_type drm_map_type_t;
984*437bfbebSnyanmisaka typedef enum drm_map_flags drm_map_flags_t;
985*437bfbebSnyanmisaka typedef struct drm_ctx_priv_map drm_ctx_priv_map_t;
986*437bfbebSnyanmisaka typedef struct drm_map drm_map_t;
987*437bfbebSnyanmisaka typedef struct drm_client drm_client_t;
988*437bfbebSnyanmisaka typedef enum drm_stat_type drm_stat_type_t;
989*437bfbebSnyanmisaka typedef struct drm_stats drm_stats_t;
990*437bfbebSnyanmisaka typedef enum drm_lock_flags drm_lock_flags_t;
991*437bfbebSnyanmisaka typedef struct drm_lock drm_lock_t;
992*437bfbebSnyanmisaka typedef enum drm_dma_flags drm_dma_flags_t;
993*437bfbebSnyanmisaka typedef struct drm_buf_desc drm_buf_desc_t;
994*437bfbebSnyanmisaka typedef struct drm_buf_info drm_buf_info_t;
995*437bfbebSnyanmisaka typedef struct drm_buf_free drm_buf_free_t;
996*437bfbebSnyanmisaka typedef struct drm_buf_pub drm_buf_pub_t;
997*437bfbebSnyanmisaka typedef struct drm_buf_map drm_buf_map_t;
998*437bfbebSnyanmisaka typedef struct drm_dma drm_dma_t;
999*437bfbebSnyanmisaka typedef union drm_wait_vblank drm_wait_vblank_t;
1000*437bfbebSnyanmisaka typedef struct drm_agp_mode drm_agp_mode_t;
1001*437bfbebSnyanmisaka typedef enum drm_ctx_flags drm_ctx_flags_t;
1002*437bfbebSnyanmisaka typedef struct drm_ctx drm_ctx_t;
1003*437bfbebSnyanmisaka typedef struct drm_ctx_res drm_ctx_res_t;
1004*437bfbebSnyanmisaka typedef struct drm_draw drm_draw_t;
1005*437bfbebSnyanmisaka typedef struct drm_update_draw drm_update_draw_t;
1006*437bfbebSnyanmisaka typedef struct drm_auth drm_auth_t;
1007*437bfbebSnyanmisaka typedef struct drm_irq_busid drm_irq_busid_t;
1008*437bfbebSnyanmisaka typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
1009*437bfbebSnyanmisaka 
1010*437bfbebSnyanmisaka typedef struct drm_agp_buffer drm_agp_buffer_t;
1011*437bfbebSnyanmisaka typedef struct drm_agp_binding drm_agp_binding_t;
1012*437bfbebSnyanmisaka typedef struct drm_agp_info drm_agp_info_t;
1013*437bfbebSnyanmisaka typedef struct drm_scatter_gather drm_scatter_gather_t;
1014*437bfbebSnyanmisaka typedef struct drm_set_version drm_set_version_t;
1015*437bfbebSnyanmisaka #endif
1016*437bfbebSnyanmisaka 
1017*437bfbebSnyanmisaka #if defined(__cplusplus)
1018*437bfbebSnyanmisaka }
1019*437bfbebSnyanmisaka #endif
1020*437bfbebSnyanmisaka 
1021*437bfbebSnyanmisaka #endif
1022