xref: /aosp_15_r20/external/libdrm/xf86drm.h (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /**
2*7688df22SAndroid Build Coastguard Worker  * \file xf86drm.h
3*7688df22SAndroid Build Coastguard Worker  * OS-independent header for DRM user-level library interface.
4*7688df22SAndroid Build Coastguard Worker  *
5*7688df22SAndroid Build Coastguard Worker  * \author Rickard E. (Rik) Faith <[email protected]>
6*7688df22SAndroid Build Coastguard Worker  */
7*7688df22SAndroid Build Coastguard Worker 
8*7688df22SAndroid Build Coastguard Worker /*
9*7688df22SAndroid Build Coastguard Worker  * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
10*7688df22SAndroid Build Coastguard Worker  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
11*7688df22SAndroid Build Coastguard Worker  * All Rights Reserved.
12*7688df22SAndroid Build Coastguard Worker  *
13*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
14*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
15*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
16*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
18*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
19*7688df22SAndroid Build Coastguard Worker  *
20*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
21*7688df22SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
22*7688df22SAndroid Build Coastguard Worker  * Software.
23*7688df22SAndroid Build Coastguard Worker  *
24*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
27*7688df22SAndroid Build Coastguard Worker  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
28*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
29*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30*7688df22SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
31*7688df22SAndroid Build Coastguard Worker  *
32*7688df22SAndroid Build Coastguard Worker  */
33*7688df22SAndroid Build Coastguard Worker 
34*7688df22SAndroid Build Coastguard Worker #ifndef _XF86DRM_H_
35*7688df22SAndroid Build Coastguard Worker #define _XF86DRM_H_
36*7688df22SAndroid Build Coastguard Worker 
37*7688df22SAndroid Build Coastguard Worker #include <stdarg.h>
38*7688df22SAndroid Build Coastguard Worker #include <sys/types.h>
39*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
40*7688df22SAndroid Build Coastguard Worker #include <drm.h>
41*7688df22SAndroid Build Coastguard Worker 
42*7688df22SAndroid Build Coastguard Worker #if defined(__cplusplus)
43*7688df22SAndroid Build Coastguard Worker extern "C" {
44*7688df22SAndroid Build Coastguard Worker #endif
45*7688df22SAndroid Build Coastguard Worker 
46*7688df22SAndroid Build Coastguard Worker #ifndef DRM_MAX_MINOR
47*7688df22SAndroid Build Coastguard Worker #define DRM_MAX_MINOR   64 /* deprecated */
48*7688df22SAndroid Build Coastguard Worker #endif
49*7688df22SAndroid Build Coastguard Worker 
50*7688df22SAndroid Build Coastguard Worker #if defined(__linux__)
51*7688df22SAndroid Build Coastguard Worker 
52*7688df22SAndroid Build Coastguard Worker #define DRM_IOCTL_NR(n)		_IOC_NR(n)
53*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_VOID		_IOC_NONE
54*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_READ		_IOC_READ
55*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_WRITE		_IOC_WRITE
56*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_READWRITE	_IOC_READ|_IOC_WRITE
57*7688df22SAndroid Build Coastguard Worker #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
58*7688df22SAndroid Build Coastguard Worker 
59*7688df22SAndroid Build Coastguard Worker #else /* One of the *BSDs */
60*7688df22SAndroid Build Coastguard Worker 
61*7688df22SAndroid Build Coastguard Worker #include <sys/ioccom.h>
62*7688df22SAndroid Build Coastguard Worker #define DRM_IOCTL_NR(n)         ((n) & 0xff)
63*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_VOID            IOC_VOID
64*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_READ            IOC_OUT
65*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_WRITE           IOC_IN
66*7688df22SAndroid Build Coastguard Worker #define DRM_IOC_READWRITE       IOC_INOUT
67*7688df22SAndroid Build Coastguard Worker #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
68*7688df22SAndroid Build Coastguard Worker 
69*7688df22SAndroid Build Coastguard Worker #endif
70*7688df22SAndroid Build Coastguard Worker 
71*7688df22SAndroid Build Coastguard Worker 				/* Defaults, if nothing set in xf86config */
72*7688df22SAndroid Build Coastguard Worker #define DRM_DEV_UID	 0
73*7688df22SAndroid Build Coastguard Worker #define DRM_DEV_GID	 0
74*7688df22SAndroid Build Coastguard Worker /* Default /dev/dri directory permissions 0755 */
75*7688df22SAndroid Build Coastguard Worker #define DRM_DEV_DIRMODE	 	\
76*7688df22SAndroid Build Coastguard Worker 	(S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
77*7688df22SAndroid Build Coastguard Worker #define DRM_DEV_MODE	 (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
78*7688df22SAndroid Build Coastguard Worker 
79*7688df22SAndroid Build Coastguard Worker #ifdef __OpenBSD__
80*7688df22SAndroid Build Coastguard Worker #define DRM_DIR_NAME  "/dev"
81*7688df22SAndroid Build Coastguard Worker #define DRM_PRIMARY_MINOR_NAME  "drm"
82*7688df22SAndroid Build Coastguard Worker #define DRM_CONTROL_MINOR_NAME  "drmC" /* deprecated */
83*7688df22SAndroid Build Coastguard Worker #define DRM_RENDER_MINOR_NAME   "drmR"
84*7688df22SAndroid Build Coastguard Worker #else
85*7688df22SAndroid Build Coastguard Worker #define DRM_DIR_NAME  "/dev/dri"
86*7688df22SAndroid Build Coastguard Worker #define DRM_PRIMARY_MINOR_NAME  "card"
87*7688df22SAndroid Build Coastguard Worker #define DRM_CONTROL_MINOR_NAME  "controlD" /* deprecated */
88*7688df22SAndroid Build Coastguard Worker #define DRM_RENDER_MINOR_NAME   "renderD"
89*7688df22SAndroid Build Coastguard Worker #define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
90*7688df22SAndroid Build Coastguard Worker #endif
91*7688df22SAndroid Build Coastguard Worker 
92*7688df22SAndroid Build Coastguard Worker #define DRM_DEV_NAME          "%s/" DRM_PRIMARY_MINOR_NAME "%d"
93*7688df22SAndroid Build Coastguard Worker #define DRM_CONTROL_DEV_NAME  "%s/" DRM_CONTROL_MINOR_NAME "%d" /* deprecated */
94*7688df22SAndroid Build Coastguard Worker #define DRM_RENDER_DEV_NAME   "%s/" DRM_RENDER_MINOR_NAME  "%d"
95*7688df22SAndroid Build Coastguard Worker 
96*7688df22SAndroid Build Coastguard Worker #define DRM_NODE_NAME_MAX \
97*7688df22SAndroid Build Coastguard Worker     (sizeof(DRM_DIR_NAME) + 1 /* slash */ \
98*7688df22SAndroid Build Coastguard Worker      + MAX3(sizeof(DRM_PRIMARY_MINOR_NAME), \
99*7688df22SAndroid Build Coastguard Worker             sizeof(DRM_CONTROL_MINOR_NAME), \
100*7688df22SAndroid Build Coastguard Worker             sizeof(DRM_RENDER_MINOR_NAME)) \
101*7688df22SAndroid Build Coastguard Worker      + sizeof("1048575") /* highest possible node number 2^MINORBITS - 1 */ \
102*7688df22SAndroid Build Coastguard Worker      + 1) /* NULL-terminator */
103*7688df22SAndroid Build Coastguard Worker 
104*7688df22SAndroid Build Coastguard Worker #define DRM_ERR_NO_DEVICE  (-1001)
105*7688df22SAndroid Build Coastguard Worker #define DRM_ERR_NO_ACCESS  (-1002)
106*7688df22SAndroid Build Coastguard Worker #define DRM_ERR_NOT_ROOT   (-1003)
107*7688df22SAndroid Build Coastguard Worker #define DRM_ERR_INVALID    (-1004)
108*7688df22SAndroid Build Coastguard Worker #define DRM_ERR_NO_FD      (-1005)
109*7688df22SAndroid Build Coastguard Worker 
110*7688df22SAndroid Build Coastguard Worker #define DRM_AGP_NO_HANDLE 0
111*7688df22SAndroid Build Coastguard Worker 
112*7688df22SAndroid Build Coastguard Worker typedef unsigned int  drmSize,     *drmSizePtr;	    /**< For mapped regions */
113*7688df22SAndroid Build Coastguard Worker typedef void          *drmAddress, **drmAddressPtr; /**< For mapped regions */
114*7688df22SAndroid Build Coastguard Worker 
115*7688df22SAndroid Build Coastguard Worker #if (__GNUC__ >= 3)
116*7688df22SAndroid Build Coastguard Worker #define DRM_PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
117*7688df22SAndroid Build Coastguard Worker #else
118*7688df22SAndroid Build Coastguard Worker #define DRM_PRINTFLIKE(f, a)
119*7688df22SAndroid Build Coastguard Worker #endif
120*7688df22SAndroid Build Coastguard Worker 
121*7688df22SAndroid Build Coastguard Worker typedef struct _drmServerInfo {
122*7688df22SAndroid Build Coastguard Worker   int (*debug_print)(const char *format, va_list ap) DRM_PRINTFLIKE(1,0);
123*7688df22SAndroid Build Coastguard Worker   int (*load_module)(const char *name);
124*7688df22SAndroid Build Coastguard Worker   void (*get_perms)(gid_t *, mode_t *);
125*7688df22SAndroid Build Coastguard Worker } drmServerInfo, *drmServerInfoPtr;
126*7688df22SAndroid Build Coastguard Worker 
127*7688df22SAndroid Build Coastguard Worker typedef struct drmHashEntry {
128*7688df22SAndroid Build Coastguard Worker     int      fd;
129*7688df22SAndroid Build Coastguard Worker     void     (*f)(int, void *, void *);
130*7688df22SAndroid Build Coastguard Worker     void     *tagTable;
131*7688df22SAndroid Build Coastguard Worker } drmHashEntry;
132*7688df22SAndroid Build Coastguard Worker 
133*7688df22SAndroid Build Coastguard Worker extern int drmIoctl(int fd, unsigned long request, void *arg);
134*7688df22SAndroid Build Coastguard Worker extern void *drmGetHashTable(void);
135*7688df22SAndroid Build Coastguard Worker extern drmHashEntry *drmGetEntry(int fd);
136*7688df22SAndroid Build Coastguard Worker 
137*7688df22SAndroid Build Coastguard Worker /**
138*7688df22SAndroid Build Coastguard Worker  * Driver version information.
139*7688df22SAndroid Build Coastguard Worker  *
140*7688df22SAndroid Build Coastguard Worker  * \sa drmGetVersion() and drmSetVersion().
141*7688df22SAndroid Build Coastguard Worker  */
142*7688df22SAndroid Build Coastguard Worker typedef struct _drmVersion {
143*7688df22SAndroid Build Coastguard Worker     int     version_major;        /**< Major version */
144*7688df22SAndroid Build Coastguard Worker     int     version_minor;        /**< Minor version */
145*7688df22SAndroid Build Coastguard Worker     int     version_patchlevel;   /**< Patch level */
146*7688df22SAndroid Build Coastguard Worker     int     name_len; 	          /**< Length of name buffer */
147*7688df22SAndroid Build Coastguard Worker     char    *name;	          /**< Name of driver */
148*7688df22SAndroid Build Coastguard Worker     int     date_len;             /**< Length of date buffer */
149*7688df22SAndroid Build Coastguard Worker     char    *date;                /**< User-space buffer to hold date */
150*7688df22SAndroid Build Coastguard Worker     int     desc_len;	          /**< Length of desc buffer */
151*7688df22SAndroid Build Coastguard Worker     char    *desc;                /**< User-space buffer to hold desc */
152*7688df22SAndroid Build Coastguard Worker } drmVersion, *drmVersionPtr;
153*7688df22SAndroid Build Coastguard Worker 
154*7688df22SAndroid Build Coastguard Worker typedef struct _drmStats {
155*7688df22SAndroid Build Coastguard Worker     unsigned long count;	     /**< Number of data */
156*7688df22SAndroid Build Coastguard Worker     struct {
157*7688df22SAndroid Build Coastguard Worker 	unsigned long value;	     /**< Value from kernel */
158*7688df22SAndroid Build Coastguard Worker 	const char    *long_format;  /**< Suggested format for long_name */
159*7688df22SAndroid Build Coastguard Worker 	const char    *long_name;    /**< Long name for value */
160*7688df22SAndroid Build Coastguard Worker 	const char    *rate_format;  /**< Suggested format for rate_name */
161*7688df22SAndroid Build Coastguard Worker 	const char    *rate_name;    /**< Short name for value per second */
162*7688df22SAndroid Build Coastguard Worker 	int           isvalue;       /**< True if value (vs. counter) */
163*7688df22SAndroid Build Coastguard Worker 	const char    *mult_names;   /**< Multiplier names (e.g., "KGM") */
164*7688df22SAndroid Build Coastguard Worker 	int           mult;          /**< Multiplier value (e.g., 1024) */
165*7688df22SAndroid Build Coastguard Worker 	int           verbose;       /**< Suggest only in verbose output */
166*7688df22SAndroid Build Coastguard Worker     } data[15];
167*7688df22SAndroid Build Coastguard Worker } drmStatsT;
168*7688df22SAndroid Build Coastguard Worker 
169*7688df22SAndroid Build Coastguard Worker 
170*7688df22SAndroid Build Coastguard Worker 				/* All of these enums *MUST* match with the
171*7688df22SAndroid Build Coastguard Worker                                    kernel implementation -- so do *NOT*
172*7688df22SAndroid Build Coastguard Worker                                    change them!  (The drmlib implementation
173*7688df22SAndroid Build Coastguard Worker                                    will just copy the flags instead of
174*7688df22SAndroid Build Coastguard Worker                                    translating them.) */
175*7688df22SAndroid Build Coastguard Worker typedef enum {
176*7688df22SAndroid Build Coastguard Worker     DRM_FRAME_BUFFER    = 0,      /**< WC, no caching, no core dump */
177*7688df22SAndroid Build Coastguard Worker     DRM_REGISTERS       = 1,      /**< no caching, no core dump */
178*7688df22SAndroid Build Coastguard Worker     DRM_SHM             = 2,      /**< shared, cached */
179*7688df22SAndroid Build Coastguard Worker     DRM_AGP             = 3,	  /**< AGP/GART */
180*7688df22SAndroid Build Coastguard Worker     DRM_SCATTER_GATHER  = 4,	  /**< PCI scatter/gather */
181*7688df22SAndroid Build Coastguard Worker     DRM_CONSISTENT      = 5	  /**< PCI consistent */
182*7688df22SAndroid Build Coastguard Worker } drmMapType;
183*7688df22SAndroid Build Coastguard Worker 
184*7688df22SAndroid Build Coastguard Worker typedef enum {
185*7688df22SAndroid Build Coastguard Worker     DRM_RESTRICTED      = 0x0001, /**< Cannot be mapped to client-virtual */
186*7688df22SAndroid Build Coastguard Worker     DRM_READ_ONLY       = 0x0002, /**< Read-only in client-virtual */
187*7688df22SAndroid Build Coastguard Worker     DRM_LOCKED          = 0x0004, /**< Physical pages locked */
188*7688df22SAndroid Build Coastguard Worker     DRM_KERNEL          = 0x0008, /**< Kernel requires access */
189*7688df22SAndroid Build Coastguard Worker     DRM_WRITE_COMBINING = 0x0010, /**< Use write-combining, if available */
190*7688df22SAndroid Build Coastguard Worker     DRM_CONTAINS_LOCK   = 0x0020, /**< SHM page that contains lock */
191*7688df22SAndroid Build Coastguard Worker     DRM_REMOVABLE	= 0x0040  /**< Removable mapping */
192*7688df22SAndroid Build Coastguard Worker } drmMapFlags;
193*7688df22SAndroid Build Coastguard Worker 
194*7688df22SAndroid Build Coastguard Worker /**
195*7688df22SAndroid Build Coastguard Worker  * \warning These values *MUST* match drm.h
196*7688df22SAndroid Build Coastguard Worker  */
197*7688df22SAndroid Build Coastguard Worker typedef enum {
198*7688df22SAndroid Build Coastguard Worker     /** \name Flags for DMA buffer dispatch */
199*7688df22SAndroid Build Coastguard Worker     /*@{*/
200*7688df22SAndroid Build Coastguard Worker     DRM_DMA_BLOCK        = 0x01, /**<
201*7688df22SAndroid Build Coastguard Worker 				  * Block until buffer dispatched.
202*7688df22SAndroid Build Coastguard Worker 				  *
203*7688df22SAndroid Build Coastguard Worker 				  * \note the buffer may not yet have been
204*7688df22SAndroid Build Coastguard Worker 				  * processed by the hardware -- getting a
205*7688df22SAndroid Build Coastguard Worker 				  * hardware lock with the hardware quiescent
206*7688df22SAndroid Build Coastguard Worker 				  * will ensure that the buffer has been
207*7688df22SAndroid Build Coastguard Worker 				  * processed.
208*7688df22SAndroid Build Coastguard Worker 				  */
209*7688df22SAndroid Build Coastguard Worker     DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
210*7688df22SAndroid Build Coastguard Worker     DRM_DMA_PRIORITY     = 0x04, /**< High priority dispatch */
211*7688df22SAndroid Build Coastguard Worker     /*@}*/
212*7688df22SAndroid Build Coastguard Worker 
213*7688df22SAndroid Build Coastguard Worker     /** \name Flags for DMA buffer request */
214*7688df22SAndroid Build Coastguard Worker     /*@{*/
215*7688df22SAndroid Build Coastguard Worker     DRM_DMA_WAIT         = 0x10, /**< Wait for free buffers */
216*7688df22SAndroid Build Coastguard Worker     DRM_DMA_SMALLER_OK   = 0x20, /**< Smaller-than-requested buffers OK */
217*7688df22SAndroid Build Coastguard Worker     DRM_DMA_LARGER_OK    = 0x40  /**< Larger-than-requested buffers OK */
218*7688df22SAndroid Build Coastguard Worker     /*@}*/
219*7688df22SAndroid Build Coastguard Worker } drmDMAFlags;
220*7688df22SAndroid Build Coastguard Worker 
221*7688df22SAndroid Build Coastguard Worker typedef enum {
222*7688df22SAndroid Build Coastguard Worker     DRM_PAGE_ALIGN       = 0x01,
223*7688df22SAndroid Build Coastguard Worker     DRM_AGP_BUFFER       = 0x02,
224*7688df22SAndroid Build Coastguard Worker     DRM_SG_BUFFER        = 0x04,
225*7688df22SAndroid Build Coastguard Worker     DRM_FB_BUFFER        = 0x08,
226*7688df22SAndroid Build Coastguard Worker     DRM_PCI_BUFFER_RO    = 0x10
227*7688df22SAndroid Build Coastguard Worker } drmBufDescFlags;
228*7688df22SAndroid Build Coastguard Worker 
229*7688df22SAndroid Build Coastguard Worker typedef enum {
230*7688df22SAndroid Build Coastguard Worker     DRM_LOCK_READY      = 0x01, /**< Wait until hardware is ready for DMA */
231*7688df22SAndroid Build Coastguard Worker     DRM_LOCK_QUIESCENT  = 0x02, /**< Wait until hardware quiescent */
232*7688df22SAndroid Build Coastguard Worker     DRM_LOCK_FLUSH      = 0x04, /**< Flush this context's DMA queue first */
233*7688df22SAndroid Build Coastguard Worker     DRM_LOCK_FLUSH_ALL  = 0x08, /**< Flush all DMA queues first */
234*7688df22SAndroid Build Coastguard Worker 				/* These *HALT* flags aren't supported yet
235*7688df22SAndroid Build Coastguard Worker                                    -- they will be used to support the
236*7688df22SAndroid Build Coastguard Worker                                    full-screen DGA-like mode. */
237*7688df22SAndroid Build Coastguard Worker     DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
238*7688df22SAndroid Build Coastguard Worker     DRM_HALT_CUR_QUEUES = 0x20  /**< Halt all current queues */
239*7688df22SAndroid Build Coastguard Worker } drmLockFlags;
240*7688df22SAndroid Build Coastguard Worker 
241*7688df22SAndroid Build Coastguard Worker typedef enum {
242*7688df22SAndroid Build Coastguard Worker     DRM_CONTEXT_PRESERVED = 0x01, /**< This context is preserved and
243*7688df22SAndroid Build Coastguard Worker 				     never swapped. */
244*7688df22SAndroid Build Coastguard Worker     DRM_CONTEXT_2DONLY    = 0x02  /**< This context is for 2D rendering only. */
245*7688df22SAndroid Build Coastguard Worker } drm_context_tFlags, *drm_context_tFlagsPtr;
246*7688df22SAndroid Build Coastguard Worker 
247*7688df22SAndroid Build Coastguard Worker typedef struct _drmBufDesc {
248*7688df22SAndroid Build Coastguard Worker     int              count;	  /**< Number of buffers of this size */
249*7688df22SAndroid Build Coastguard Worker     int              size;	  /**< Size in bytes */
250*7688df22SAndroid Build Coastguard Worker     int              low_mark;	  /**< Low water mark */
251*7688df22SAndroid Build Coastguard Worker     int              high_mark;	  /**< High water mark */
252*7688df22SAndroid Build Coastguard Worker } drmBufDesc, *drmBufDescPtr;
253*7688df22SAndroid Build Coastguard Worker 
254*7688df22SAndroid Build Coastguard Worker typedef struct _drmBufInfo {
255*7688df22SAndroid Build Coastguard Worker     int              count;	  /**< Number of buffers described in list */
256*7688df22SAndroid Build Coastguard Worker     drmBufDescPtr    list;	  /**< List of buffer descriptions */
257*7688df22SAndroid Build Coastguard Worker } drmBufInfo, *drmBufInfoPtr;
258*7688df22SAndroid Build Coastguard Worker 
259*7688df22SAndroid Build Coastguard Worker typedef struct _drmBuf {
260*7688df22SAndroid Build Coastguard Worker     int              idx;	  /**< Index into the master buffer list */
261*7688df22SAndroid Build Coastguard Worker     int              total;	  /**< Buffer size */
262*7688df22SAndroid Build Coastguard Worker     int              used;	  /**< Amount of buffer in use (for DMA) */
263*7688df22SAndroid Build Coastguard Worker     drmAddress       address;	  /**< Address */
264*7688df22SAndroid Build Coastguard Worker } drmBuf, *drmBufPtr;
265*7688df22SAndroid Build Coastguard Worker 
266*7688df22SAndroid Build Coastguard Worker /**
267*7688df22SAndroid Build Coastguard Worker  * Buffer mapping information.
268*7688df22SAndroid Build Coastguard Worker  *
269*7688df22SAndroid Build Coastguard Worker  * Used by drmMapBufs() and drmUnmapBufs() to store information about the
270*7688df22SAndroid Build Coastguard Worker  * mapped buffers.
271*7688df22SAndroid Build Coastguard Worker  */
272*7688df22SAndroid Build Coastguard Worker typedef struct _drmBufMap {
273*7688df22SAndroid Build Coastguard Worker     int              count;	  /**< Number of buffers mapped */
274*7688df22SAndroid Build Coastguard Worker     drmBufPtr        list;	  /**< Buffers */
275*7688df22SAndroid Build Coastguard Worker } drmBufMap, *drmBufMapPtr;
276*7688df22SAndroid Build Coastguard Worker 
277*7688df22SAndroid Build Coastguard Worker typedef struct _drmLock {
278*7688df22SAndroid Build Coastguard Worker     volatile unsigned int lock;
279*7688df22SAndroid Build Coastguard Worker     char                      padding[60];
280*7688df22SAndroid Build Coastguard Worker     /* This is big enough for most current (and future?) architectures:
281*7688df22SAndroid Build Coastguard Worker        DEC Alpha:              32 bytes
282*7688df22SAndroid Build Coastguard Worker        Intel Merced:           ?
283*7688df22SAndroid Build Coastguard Worker        Intel P5/PPro/PII/PIII: 32 bytes
284*7688df22SAndroid Build Coastguard Worker        Intel StrongARM:        32 bytes
285*7688df22SAndroid Build Coastguard Worker        Intel i386/i486:        16 bytes
286*7688df22SAndroid Build Coastguard Worker        MIPS:                   32 bytes (?)
287*7688df22SAndroid Build Coastguard Worker        Motorola 68k:           16 bytes
288*7688df22SAndroid Build Coastguard Worker        Motorola PowerPC:       32 bytes
289*7688df22SAndroid Build Coastguard Worker        Sun SPARC:              32 bytes
290*7688df22SAndroid Build Coastguard Worker     */
291*7688df22SAndroid Build Coastguard Worker } drmLock, *drmLockPtr;
292*7688df22SAndroid Build Coastguard Worker 
293*7688df22SAndroid Build Coastguard Worker /**
294*7688df22SAndroid Build Coastguard Worker  * Indices here refer to the offset into
295*7688df22SAndroid Build Coastguard Worker  * list in drmBufInfo
296*7688df22SAndroid Build Coastguard Worker  */
297*7688df22SAndroid Build Coastguard Worker typedef struct _drmDMAReq {
298*7688df22SAndroid Build Coastguard Worker     drm_context_t    context;  	  /**< Context handle */
299*7688df22SAndroid Build Coastguard Worker     int           send_count;     /**< Number of buffers to send */
300*7688df22SAndroid Build Coastguard Worker     int           *send_list;     /**< List of handles to buffers */
301*7688df22SAndroid Build Coastguard Worker     int           *send_sizes;    /**< Lengths of data to send, in bytes */
302*7688df22SAndroid Build Coastguard Worker     drmDMAFlags   flags;          /**< Flags */
303*7688df22SAndroid Build Coastguard Worker     int           request_count;  /**< Number of buffers requested */
304*7688df22SAndroid Build Coastguard Worker     int           request_size;	  /**< Desired size of buffers requested */
305*7688df22SAndroid Build Coastguard Worker     int           *request_list;  /**< Buffer information */
306*7688df22SAndroid Build Coastguard Worker     int           *request_sizes; /**< Minimum acceptable sizes */
307*7688df22SAndroid Build Coastguard Worker     int           granted_count;  /**< Number of buffers granted at this size */
308*7688df22SAndroid Build Coastguard Worker } drmDMAReq, *drmDMAReqPtr;
309*7688df22SAndroid Build Coastguard Worker 
310*7688df22SAndroid Build Coastguard Worker typedef struct _drmRegion {
311*7688df22SAndroid Build Coastguard Worker     drm_handle_t     handle;
312*7688df22SAndroid Build Coastguard Worker     unsigned int  offset;
313*7688df22SAndroid Build Coastguard Worker     drmSize       size;
314*7688df22SAndroid Build Coastguard Worker     drmAddress    map;
315*7688df22SAndroid Build Coastguard Worker } drmRegion, *drmRegionPtr;
316*7688df22SAndroid Build Coastguard Worker 
317*7688df22SAndroid Build Coastguard Worker typedef struct _drmTextureRegion {
318*7688df22SAndroid Build Coastguard Worker     unsigned char next;
319*7688df22SAndroid Build Coastguard Worker     unsigned char prev;
320*7688df22SAndroid Build Coastguard Worker     unsigned char in_use;
321*7688df22SAndroid Build Coastguard Worker     unsigned char padding;	/**< Explicitly pad this out */
322*7688df22SAndroid Build Coastguard Worker     unsigned int  age;
323*7688df22SAndroid Build Coastguard Worker } drmTextureRegion, *drmTextureRegionPtr;
324*7688df22SAndroid Build Coastguard Worker 
325*7688df22SAndroid Build Coastguard Worker 
326*7688df22SAndroid Build Coastguard Worker typedef enum {
327*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_ABSOLUTE = 0x0,	/**< Wait for specific vblank sequence number */
328*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_RELATIVE = 0x1,	/**< Wait for given number of vblanks */
329*7688df22SAndroid Build Coastguard Worker     /* bits 1-6 are reserved for high crtcs */
330*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
331*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_EVENT = 0x4000000,	/**< Send event instead of blocking */
332*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_FLIP = 0x8000000,	/**< Scheduled buffer swap should flip */
333*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_NEXTONMISS = 0x10000000,	/**< If missed, wait for next vblank */
334*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_SECONDARY = 0x20000000,	/**< Secondary display controller */
335*7688df22SAndroid Build Coastguard Worker     DRM_VBLANK_SIGNAL   = 0x40000000	/* Send signal instead of blocking */
336*7688df22SAndroid Build Coastguard Worker } drmVBlankSeqType;
337*7688df22SAndroid Build Coastguard Worker #define DRM_VBLANK_HIGH_CRTC_SHIFT 1
338*7688df22SAndroid Build Coastguard Worker 
339*7688df22SAndroid Build Coastguard Worker typedef struct _drmVBlankReq {
340*7688df22SAndroid Build Coastguard Worker 	drmVBlankSeqType type;
341*7688df22SAndroid Build Coastguard Worker 	unsigned int sequence;
342*7688df22SAndroid Build Coastguard Worker 	unsigned long signal;
343*7688df22SAndroid Build Coastguard Worker } drmVBlankReq, *drmVBlankReqPtr;
344*7688df22SAndroid Build Coastguard Worker 
345*7688df22SAndroid Build Coastguard Worker typedef struct _drmVBlankReply {
346*7688df22SAndroid Build Coastguard Worker 	drmVBlankSeqType type;
347*7688df22SAndroid Build Coastguard Worker 	unsigned int sequence;
348*7688df22SAndroid Build Coastguard Worker 	long tval_sec;
349*7688df22SAndroid Build Coastguard Worker 	long tval_usec;
350*7688df22SAndroid Build Coastguard Worker } drmVBlankReply, *drmVBlankReplyPtr;
351*7688df22SAndroid Build Coastguard Worker 
352*7688df22SAndroid Build Coastguard Worker typedef union _drmVBlank {
353*7688df22SAndroid Build Coastguard Worker 	drmVBlankReq request;
354*7688df22SAndroid Build Coastguard Worker 	drmVBlankReply reply;
355*7688df22SAndroid Build Coastguard Worker } drmVBlank, *drmVBlankPtr;
356*7688df22SAndroid Build Coastguard Worker 
357*7688df22SAndroid Build Coastguard Worker typedef struct _drmSetVersion {
358*7688df22SAndroid Build Coastguard Worker 	int drm_di_major;
359*7688df22SAndroid Build Coastguard Worker 	int drm_di_minor;
360*7688df22SAndroid Build Coastguard Worker 	int drm_dd_major;
361*7688df22SAndroid Build Coastguard Worker 	int drm_dd_minor;
362*7688df22SAndroid Build Coastguard Worker } drmSetVersion, *drmSetVersionPtr;
363*7688df22SAndroid Build Coastguard Worker 
364*7688df22SAndroid Build Coastguard Worker #define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock)
365*7688df22SAndroid Build Coastguard Worker 
366*7688df22SAndroid Build Coastguard Worker #define DRM_LOCK_HELD  0x80000000U /**< Hardware lock is held */
367*7688df22SAndroid Build Coastguard Worker #define DRM_LOCK_CONT  0x40000000U /**< Hardware lock is contended */
368*7688df22SAndroid Build Coastguard Worker 
369*7688df22SAndroid Build Coastguard Worker #if defined(__GNUC__) && (__GNUC__ >= 2)
370*7688df22SAndroid Build Coastguard Worker # if defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)
371*7688df22SAndroid Build Coastguard Worker 				/* Reflect changes here to drmP.h */
372*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,__ret)                                    \
373*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
374*7688df22SAndroid Build Coastguard Worker                 int __dummy;	/* Can't mark eax as clobbered */      \
375*7688df22SAndroid Build Coastguard Worker 		__asm__ __volatile__(                                  \
376*7688df22SAndroid Build Coastguard Worker 			"lock ; cmpxchg %4,%1\n\t"                     \
377*7688df22SAndroid Build Coastguard Worker                         "setnz %0"                                     \
378*7688df22SAndroid Build Coastguard Worker 			: "=d" (__ret),                                \
379*7688df22SAndroid Build Coastguard Worker    			  "=m" (__drm_dummy_lock(lock)),               \
380*7688df22SAndroid Build Coastguard Worker                           "=a" (__dummy)                               \
381*7688df22SAndroid Build Coastguard Worker 			: "2" (old),                                   \
382*7688df22SAndroid Build Coastguard Worker 			  "r" (new));                                  \
383*7688df22SAndroid Build Coastguard Worker 	} while (0)
384*7688df22SAndroid Build Coastguard Worker 
385*7688df22SAndroid Build Coastguard Worker #elif defined(__alpha__)
386*7688df22SAndroid Build Coastguard Worker 
387*7688df22SAndroid Build Coastguard Worker #define	DRM_CAS(lock, old, new, ret)		\
388*7688df22SAndroid Build Coastguard Worker 	do {					\
389*7688df22SAndroid Build Coastguard Worker 		int tmp, old32;			\
390*7688df22SAndroid Build Coastguard Worker 		__asm__ __volatile__(		\
391*7688df22SAndroid Build Coastguard Worker 		"	addl	$31, %5, %3\n"	\
392*7688df22SAndroid Build Coastguard Worker 		"1:	ldl_l	%0, %2\n"	\
393*7688df22SAndroid Build Coastguard Worker 		"	cmpeq	%0, %3, %1\n"	\
394*7688df22SAndroid Build Coastguard Worker 		"	beq	%1, 2f\n"	\
395*7688df22SAndroid Build Coastguard Worker 		"	mov	%4, %0\n"	\
396*7688df22SAndroid Build Coastguard Worker 		"	stl_c	%0, %2\n"	\
397*7688df22SAndroid Build Coastguard Worker 		"	beq	%0, 3f\n"	\
398*7688df22SAndroid Build Coastguard Worker 		"	mb\n"			\
399*7688df22SAndroid Build Coastguard Worker 		"2:	cmpeq	%1, 0, %1\n"	\
400*7688df22SAndroid Build Coastguard Worker 		".subsection 2\n"		\
401*7688df22SAndroid Build Coastguard Worker 		"3:	br	1b\n"		\
402*7688df22SAndroid Build Coastguard Worker 		".previous"			\
403*7688df22SAndroid Build Coastguard Worker 		: "=&r"(tmp), "=&r"(ret),	\
404*7688df22SAndroid Build Coastguard Worker 		  "=m"(__drm_dummy_lock(lock)),	\
405*7688df22SAndroid Build Coastguard Worker 		  "=&r"(old32)			\
406*7688df22SAndroid Build Coastguard Worker 		: "r"(new), "r"(old)		\
407*7688df22SAndroid Build Coastguard Worker 		: "memory");			\
408*7688df22SAndroid Build Coastguard Worker 	} while (0)
409*7688df22SAndroid Build Coastguard Worker 
410*7688df22SAndroid Build Coastguard Worker #elif defined(__sparc__)
411*7688df22SAndroid Build Coastguard Worker 
412*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,__ret)				\
413*7688df22SAndroid Build Coastguard Worker do {	register unsigned int __old __asm("o0");		\
414*7688df22SAndroid Build Coastguard Worker 	register unsigned int __new __asm("o1");		\
415*7688df22SAndroid Build Coastguard Worker 	register volatile unsigned int *__lock __asm("o2");	\
416*7688df22SAndroid Build Coastguard Worker 	__old = old;						\
417*7688df22SAndroid Build Coastguard Worker 	__new = new;						\
418*7688df22SAndroid Build Coastguard Worker 	__lock = (volatile unsigned int *)lock;			\
419*7688df22SAndroid Build Coastguard Worker 	__asm__ __volatile__(					\
420*7688df22SAndroid Build Coastguard Worker 		/*"cas [%2], %3, %0"*/				\
421*7688df22SAndroid Build Coastguard Worker 		".word 0xd3e29008\n\t"				\
422*7688df22SAndroid Build Coastguard Worker 		/*"membar #StoreStore | #StoreLoad"*/		\
423*7688df22SAndroid Build Coastguard Worker 		".word 0x8143e00a"				\
424*7688df22SAndroid Build Coastguard Worker 		: "=&r" (__new)					\
425*7688df22SAndroid Build Coastguard Worker 		: "0" (__new),					\
426*7688df22SAndroid Build Coastguard Worker 		  "r" (__lock),					\
427*7688df22SAndroid Build Coastguard Worker 		  "r" (__old)					\
428*7688df22SAndroid Build Coastguard Worker 		: "memory");					\
429*7688df22SAndroid Build Coastguard Worker 	__ret = (__new != __old);				\
430*7688df22SAndroid Build Coastguard Worker } while(0)
431*7688df22SAndroid Build Coastguard Worker 
432*7688df22SAndroid Build Coastguard Worker #elif defined(__ia64__)
433*7688df22SAndroid Build Coastguard Worker 
434*7688df22SAndroid Build Coastguard Worker #ifdef __INTEL_COMPILER
435*7688df22SAndroid Build Coastguard Worker /* this currently generates bad code (missing stop bits)... */
436*7688df22SAndroid Build Coastguard Worker #include <ia64intrin.h>
437*7688df22SAndroid Build Coastguard Worker 
438*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,__ret)					      \
439*7688df22SAndroid Build Coastguard Worker 	do {								      \
440*7688df22SAndroid Build Coastguard Worker 		unsigned long __result, __old = (old) & 0xffffffff;		\
441*7688df22SAndroid Build Coastguard Worker 		__mf();							      	\
442*7688df22SAndroid Build Coastguard Worker 		__result = _InterlockedCompareExchange_acq(&__drm_dummy_lock(lock), (new), __old);\
443*7688df22SAndroid Build Coastguard Worker 		__ret = (__result) != (__old);					\
444*7688df22SAndroid Build Coastguard Worker /*		__ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \
445*7688df22SAndroid Build Coastguard Worker 						     (old), (new))	      \
446*7688df22SAndroid Build Coastguard Worker 			 != (old));					      */\
447*7688df22SAndroid Build Coastguard Worker 	} while (0)
448*7688df22SAndroid Build Coastguard Worker 
449*7688df22SAndroid Build Coastguard Worker #else
450*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,__ret)					  \
451*7688df22SAndroid Build Coastguard Worker 	do {								  \
452*7688df22SAndroid Build Coastguard Worker 		unsigned int __result, __old = (old);			  \
453*7688df22SAndroid Build Coastguard Worker 		__asm__ __volatile__(					  \
454*7688df22SAndroid Build Coastguard Worker 			"mf\n"						  \
455*7688df22SAndroid Build Coastguard Worker 			"mov ar.ccv=%2\n"				  \
456*7688df22SAndroid Build Coastguard Worker 			";;\n"						  \
457*7688df22SAndroid Build Coastguard Worker 			"cmpxchg4.acq %0=%1,%3,ar.ccv"			  \
458*7688df22SAndroid Build Coastguard Worker 			: "=r" (__result), "=m" (__drm_dummy_lock(lock))  \
459*7688df22SAndroid Build Coastguard Worker 			: "r" ((unsigned long)__old), "r" (new)			  \
460*7688df22SAndroid Build Coastguard Worker 			: "memory");					  \
461*7688df22SAndroid Build Coastguard Worker 		__ret = (__result) != (__old);				  \
462*7688df22SAndroid Build Coastguard Worker 	} while (0)
463*7688df22SAndroid Build Coastguard Worker 
464*7688df22SAndroid Build Coastguard Worker #endif
465*7688df22SAndroid Build Coastguard Worker 
466*7688df22SAndroid Build Coastguard Worker #elif defined(__powerpc__)
467*7688df22SAndroid Build Coastguard Worker 
468*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,__ret)			\
469*7688df22SAndroid Build Coastguard Worker 	do {						\
470*7688df22SAndroid Build Coastguard Worker 		__asm__ __volatile__(			\
471*7688df22SAndroid Build Coastguard Worker 			"sync;"				\
472*7688df22SAndroid Build Coastguard Worker 			"0:    lwarx %0,0,%1;"		\
473*7688df22SAndroid Build Coastguard Worker 			"      xor. %0,%3,%0;"		\
474*7688df22SAndroid Build Coastguard Worker 			"      bne 1f;"			\
475*7688df22SAndroid Build Coastguard Worker 			"      stwcx. %2,0,%1;"		\
476*7688df22SAndroid Build Coastguard Worker 			"      bne- 0b;"		\
477*7688df22SAndroid Build Coastguard Worker 			"1:    "			\
478*7688df22SAndroid Build Coastguard Worker 			"sync;"				\
479*7688df22SAndroid Build Coastguard Worker 		: "=&r"(__ret)				\
480*7688df22SAndroid Build Coastguard Worker 		: "r"(lock), "r"(new), "r"(old)		\
481*7688df22SAndroid Build Coastguard Worker 		: "cr0", "memory");			\
482*7688df22SAndroid Build Coastguard Worker 	} while (0)
483*7688df22SAndroid Build Coastguard Worker 
484*7688df22SAndroid Build Coastguard Worker # elif defined (__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
485*7688df22SAndroid Build Coastguard Worker 	|| defined (__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \
486*7688df22SAndroid Build Coastguard Worker 	|| defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) \
487*7688df22SAndroid Build Coastguard Worker 	|| defined (__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
488*7688df22SAndroid Build Coastguard Worker 	|| defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
489*7688df22SAndroid Build Coastguard Worker 	|| defined(__ARM_ARCH_7EM__)
490*7688df22SAndroid Build Coastguard Worker        /* excluding ARMv4/ARMv5 and lower (lacking ldrex/strex support) */
491*7688df22SAndroid Build Coastguard Worker        #undef DRM_DEV_MODE
492*7688df22SAndroid Build Coastguard Worker        #define DRM_DEV_MODE     (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
493*7688df22SAndroid Build Coastguard Worker 
494*7688df22SAndroid Build Coastguard Worker        #define DRM_CAS(lock,old,new,__ret)             \
495*7688df22SAndroid Build Coastguard Worker        do {                                            \
496*7688df22SAndroid Build Coastguard Worker                __asm__ __volatile__ (                  \
497*7688df22SAndroid Build Coastguard Worker                        "1: ldrex %0, [%1]\n"           \
498*7688df22SAndroid Build Coastguard Worker                        "   teq %0, %2\n"               \
499*7688df22SAndroid Build Coastguard Worker                        "   ite eq\n"                   \
500*7688df22SAndroid Build Coastguard Worker                        "   strexeq %0, %3, [%1]\n"     \
501*7688df22SAndroid Build Coastguard Worker                        "   movne   %0, #1\n"           \
502*7688df22SAndroid Build Coastguard Worker                : "=&r" (__ret)                         \
503*7688df22SAndroid Build Coastguard Worker                : "r" (lock), "r" (old), "r" (new)      \
504*7688df22SAndroid Build Coastguard Worker                : "cc","memory");                       \
505*7688df22SAndroid Build Coastguard Worker        } while (0)
506*7688df22SAndroid Build Coastguard Worker 
507*7688df22SAndroid Build Coastguard Worker #endif /* architecture */
508*7688df22SAndroid Build Coastguard Worker #endif /* __GNUC__ >= 2 */
509*7688df22SAndroid Build Coastguard Worker 
510*7688df22SAndroid Build Coastguard Worker #ifndef DRM_CAS
511*7688df22SAndroid Build Coastguard Worker #define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */
512*7688df22SAndroid Build Coastguard Worker #endif
513*7688df22SAndroid Build Coastguard Worker 
514*7688df22SAndroid Build Coastguard Worker #if defined(__alpha__)
515*7688df22SAndroid Build Coastguard Worker #define DRM_CAS_RESULT(_result)		long _result
516*7688df22SAndroid Build Coastguard Worker #elif defined(__powerpc__)
517*7688df22SAndroid Build Coastguard Worker #define DRM_CAS_RESULT(_result)		int _result
518*7688df22SAndroid Build Coastguard Worker #else
519*7688df22SAndroid Build Coastguard Worker #define DRM_CAS_RESULT(_result)		char _result
520*7688df22SAndroid Build Coastguard Worker #endif
521*7688df22SAndroid Build Coastguard Worker 
522*7688df22SAndroid Build Coastguard Worker #define DRM_LIGHT_LOCK(fd,lock,context)                                \
523*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
524*7688df22SAndroid Build Coastguard Worker                 DRM_CAS_RESULT(__ret);                                 \
525*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
526*7688df22SAndroid Build Coastguard Worker                 if (__ret) drmGetLock(fd,context,0);                   \
527*7688df22SAndroid Build Coastguard Worker         } while(0)
528*7688df22SAndroid Build Coastguard Worker 
529*7688df22SAndroid Build Coastguard Worker 				/* This one counts fast locks -- for
530*7688df22SAndroid Build Coastguard Worker                                    benchmarking only. */
531*7688df22SAndroid Build Coastguard Worker #define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count)                    \
532*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
533*7688df22SAndroid Build Coastguard Worker                 DRM_CAS_RESULT(__ret);                                 \
534*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
535*7688df22SAndroid Build Coastguard Worker                 if (__ret) drmGetLock(fd,context,0);                   \
536*7688df22SAndroid Build Coastguard Worker                 else       ++count;                                    \
537*7688df22SAndroid Build Coastguard Worker         } while(0)
538*7688df22SAndroid Build Coastguard Worker 
539*7688df22SAndroid Build Coastguard Worker #define DRM_LOCK(fd,lock,context,flags)                                \
540*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
541*7688df22SAndroid Build Coastguard Worker 		if (flags) drmGetLock(fd,context,flags);               \
542*7688df22SAndroid Build Coastguard Worker 		else       DRM_LIGHT_LOCK(fd,lock,context);            \
543*7688df22SAndroid Build Coastguard Worker 	} while(0)
544*7688df22SAndroid Build Coastguard Worker 
545*7688df22SAndroid Build Coastguard Worker #define DRM_UNLOCK(fd,lock,context)                                    \
546*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
547*7688df22SAndroid Build Coastguard Worker                 DRM_CAS_RESULT(__ret);                                 \
548*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret);     \
549*7688df22SAndroid Build Coastguard Worker                 if (__ret) drmUnlock(fd,context);                      \
550*7688df22SAndroid Build Coastguard Worker         } while(0)
551*7688df22SAndroid Build Coastguard Worker 
552*7688df22SAndroid Build Coastguard Worker 				/* Simple spin locks */
553*7688df22SAndroid Build Coastguard Worker #define DRM_SPINLOCK(spin,val)                                         \
554*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
555*7688df22SAndroid Build Coastguard Worker             DRM_CAS_RESULT(__ret);                                     \
556*7688df22SAndroid Build Coastguard Worker 	    do {                                                       \
557*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(spin,0,val,__ret);                             \
558*7688df22SAndroid Build Coastguard Worker 		if (__ret) while ((spin)->lock);                       \
559*7688df22SAndroid Build Coastguard Worker 	    } while (__ret);                                           \
560*7688df22SAndroid Build Coastguard Worker 	} while(0)
561*7688df22SAndroid Build Coastguard Worker 
562*7688df22SAndroid Build Coastguard Worker #define DRM_SPINLOCK_TAKE(spin,val)                                    \
563*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
564*7688df22SAndroid Build Coastguard Worker             DRM_CAS_RESULT(__ret);                                     \
565*7688df22SAndroid Build Coastguard Worker             int  cur;                                                  \
566*7688df22SAndroid Build Coastguard Worker 	    do {                                                       \
567*7688df22SAndroid Build Coastguard Worker                 cur = (*spin).lock;                                    \
568*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(spin,cur,val,__ret);                           \
569*7688df22SAndroid Build Coastguard Worker 	    } while (__ret);                                           \
570*7688df22SAndroid Build Coastguard Worker 	} while(0)
571*7688df22SAndroid Build Coastguard Worker 
572*7688df22SAndroid Build Coastguard Worker #define DRM_SPINLOCK_COUNT(spin,val,count,__ret)                       \
573*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
574*7688df22SAndroid Build Coastguard Worker             int  __i;                                                  \
575*7688df22SAndroid Build Coastguard Worker             __ret = 1;                                                 \
576*7688df22SAndroid Build Coastguard Worker             for (__i = 0; __ret && __i < count; __i++) {               \
577*7688df22SAndroid Build Coastguard Worker 		DRM_CAS(spin,0,val,__ret);                             \
578*7688df22SAndroid Build Coastguard Worker 		if (__ret) for (;__i < count && (spin)->lock; __i++);  \
579*7688df22SAndroid Build Coastguard Worker 	    }                                                          \
580*7688df22SAndroid Build Coastguard Worker 	} while(0)
581*7688df22SAndroid Build Coastguard Worker 
582*7688df22SAndroid Build Coastguard Worker #define DRM_SPINUNLOCK(spin,val)                                       \
583*7688df22SAndroid Build Coastguard Worker 	do {                                                           \
584*7688df22SAndroid Build Coastguard Worker             DRM_CAS_RESULT(__ret);                                     \
585*7688df22SAndroid Build Coastguard Worker             if ((*spin).lock == val) { /* else server stole lock */    \
586*7688df22SAndroid Build Coastguard Worker 	        do {                                                   \
587*7688df22SAndroid Build Coastguard Worker 		    DRM_CAS(spin,val,0,__ret);                         \
588*7688df22SAndroid Build Coastguard Worker 	        } while (__ret);                                       \
589*7688df22SAndroid Build Coastguard Worker             }                                                          \
590*7688df22SAndroid Build Coastguard Worker 	} while(0)
591*7688df22SAndroid Build Coastguard Worker 
592*7688df22SAndroid Build Coastguard Worker 
593*7688df22SAndroid Build Coastguard Worker 
594*7688df22SAndroid Build Coastguard Worker /* General user-level programmer's API: unprivileged */
595*7688df22SAndroid Build Coastguard Worker extern int           drmAvailable(void);
596*7688df22SAndroid Build Coastguard Worker extern int           drmOpen(const char *name, const char *busid);
597*7688df22SAndroid Build Coastguard Worker 
598*7688df22SAndroid Build Coastguard Worker #define DRM_NODE_PRIMARY 0
599*7688df22SAndroid Build Coastguard Worker #define DRM_NODE_CONTROL 1 /* deprecated: never returned */
600*7688df22SAndroid Build Coastguard Worker #define DRM_NODE_RENDER  2
601*7688df22SAndroid Build Coastguard Worker #define DRM_NODE_MAX     3
602*7688df22SAndroid Build Coastguard Worker 
603*7688df22SAndroid Build Coastguard Worker extern int           drmOpenWithType(const char *name, const char *busid,
604*7688df22SAndroid Build Coastguard Worker                                      int type);
605*7688df22SAndroid Build Coastguard Worker 
606*7688df22SAndroid Build Coastguard Worker extern int           drmOpenControl(int minor); /* deprecated: always fails */
607*7688df22SAndroid Build Coastguard Worker extern int           drmOpenRender(int minor);
608*7688df22SAndroid Build Coastguard Worker extern int           drmClose(int fd);
609*7688df22SAndroid Build Coastguard Worker extern drmVersionPtr drmGetVersion(int fd);
610*7688df22SAndroid Build Coastguard Worker extern drmVersionPtr drmGetLibVersion(int fd);
611*7688df22SAndroid Build Coastguard Worker extern int           drmGetCap(int fd, uint64_t capability, uint64_t *value);
612*7688df22SAndroid Build Coastguard Worker extern void          drmFreeVersion(drmVersionPtr);
613*7688df22SAndroid Build Coastguard Worker extern int           drmGetMagic(int fd, drm_magic_t * magic);
614*7688df22SAndroid Build Coastguard Worker extern char          *drmGetBusid(int fd);
615*7688df22SAndroid Build Coastguard Worker extern int           drmGetInterruptFromBusID(int fd, int busnum, int devnum,
616*7688df22SAndroid Build Coastguard Worker 					      int funcnum);
617*7688df22SAndroid Build Coastguard Worker extern int           drmGetMap(int fd, int idx, drm_handle_t *offset,
618*7688df22SAndroid Build Coastguard Worker 			       drmSize *size, drmMapType *type,
619*7688df22SAndroid Build Coastguard Worker 			       drmMapFlags *flags, drm_handle_t *handle,
620*7688df22SAndroid Build Coastguard Worker 			       int *mtrr);
621*7688df22SAndroid Build Coastguard Worker extern int           drmGetClient(int fd, int idx, int *auth, int *pid,
622*7688df22SAndroid Build Coastguard Worker 				  int *uid, unsigned long *magic,
623*7688df22SAndroid Build Coastguard Worker 				  unsigned long *iocs);
624*7688df22SAndroid Build Coastguard Worker extern int           drmGetStats(int fd, drmStatsT *stats);
625*7688df22SAndroid Build Coastguard Worker extern int           drmSetInterfaceVersion(int fd, drmSetVersion *version);
626*7688df22SAndroid Build Coastguard Worker extern int           drmCommandNone(int fd, unsigned long drmCommandIndex);
627*7688df22SAndroid Build Coastguard Worker extern int           drmCommandRead(int fd, unsigned long drmCommandIndex,
628*7688df22SAndroid Build Coastguard Worker                                     void *data, unsigned long size);
629*7688df22SAndroid Build Coastguard Worker extern int           drmCommandWrite(int fd, unsigned long drmCommandIndex,
630*7688df22SAndroid Build Coastguard Worker                                      void *data, unsigned long size);
631*7688df22SAndroid Build Coastguard Worker extern int           drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
632*7688df22SAndroid Build Coastguard Worker                                          void *data, unsigned long size);
633*7688df22SAndroid Build Coastguard Worker 
634*7688df22SAndroid Build Coastguard Worker /* General user-level programmer's API: X server (root) only  */
635*7688df22SAndroid Build Coastguard Worker extern void          drmFreeBusid(const char *busid);
636*7688df22SAndroid Build Coastguard Worker extern int           drmSetBusid(int fd, const char *busid);
637*7688df22SAndroid Build Coastguard Worker extern int           drmAuthMagic(int fd, drm_magic_t magic);
638*7688df22SAndroid Build Coastguard Worker extern int           drmAddMap(int fd,
639*7688df22SAndroid Build Coastguard Worker 			       drm_handle_t offset,
640*7688df22SAndroid Build Coastguard Worker 			       drmSize size,
641*7688df22SAndroid Build Coastguard Worker 			       drmMapType type,
642*7688df22SAndroid Build Coastguard Worker 			       drmMapFlags flags,
643*7688df22SAndroid Build Coastguard Worker 			       drm_handle_t * handle);
644*7688df22SAndroid Build Coastguard Worker extern int	     drmRmMap(int fd, drm_handle_t handle);
645*7688df22SAndroid Build Coastguard Worker extern int	     drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
646*7688df22SAndroid Build Coastguard Worker 						 drm_handle_t handle);
647*7688df22SAndroid Build Coastguard Worker 
648*7688df22SAndroid Build Coastguard Worker extern int           drmAddBufs(int fd, int count, int size,
649*7688df22SAndroid Build Coastguard Worker 				drmBufDescFlags flags,
650*7688df22SAndroid Build Coastguard Worker 				int agp_offset);
651*7688df22SAndroid Build Coastguard Worker extern int           drmMarkBufs(int fd, double low, double high);
652*7688df22SAndroid Build Coastguard Worker extern int           drmCreateContext(int fd, drm_context_t * handle);
653*7688df22SAndroid Build Coastguard Worker extern int           drmSetContextFlags(int fd, drm_context_t context,
654*7688df22SAndroid Build Coastguard Worker 					drm_context_tFlags flags);
655*7688df22SAndroid Build Coastguard Worker extern int           drmGetContextFlags(int fd, drm_context_t context,
656*7688df22SAndroid Build Coastguard Worker 					drm_context_tFlagsPtr flags);
657*7688df22SAndroid Build Coastguard Worker extern int           drmAddContextTag(int fd, drm_context_t context, void *tag);
658*7688df22SAndroid Build Coastguard Worker extern int           drmDelContextTag(int fd, drm_context_t context);
659*7688df22SAndroid Build Coastguard Worker extern void          *drmGetContextTag(int fd, drm_context_t context);
660*7688df22SAndroid Build Coastguard Worker extern drm_context_t * drmGetReservedContextList(int fd, int *count);
661*7688df22SAndroid Build Coastguard Worker extern void          drmFreeReservedContextList(drm_context_t *);
662*7688df22SAndroid Build Coastguard Worker extern int           drmSwitchToContext(int fd, drm_context_t context);
663*7688df22SAndroid Build Coastguard Worker extern int           drmDestroyContext(int fd, drm_context_t handle);
664*7688df22SAndroid Build Coastguard Worker extern int           drmCreateDrawable(int fd, drm_drawable_t * handle);
665*7688df22SAndroid Build Coastguard Worker extern int           drmDestroyDrawable(int fd, drm_drawable_t handle);
666*7688df22SAndroid Build Coastguard Worker extern int           drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
667*7688df22SAndroid Build Coastguard Worker 					   drm_drawable_info_type_t type,
668*7688df22SAndroid Build Coastguard Worker 					   unsigned int num, void *data);
669*7688df22SAndroid Build Coastguard Worker extern int           drmCtlInstHandler(int fd, int irq);
670*7688df22SAndroid Build Coastguard Worker extern int           drmCtlUninstHandler(int fd);
671*7688df22SAndroid Build Coastguard Worker extern int           drmSetClientCap(int fd, uint64_t capability,
672*7688df22SAndroid Build Coastguard Worker 				     uint64_t value);
673*7688df22SAndroid Build Coastguard Worker 
674*7688df22SAndroid Build Coastguard Worker extern int           drmCrtcGetSequence(int fd, uint32_t crtcId,
675*7688df22SAndroid Build Coastguard Worker 					uint64_t *sequence, uint64_t *ns);
676*7688df22SAndroid Build Coastguard Worker extern int           drmCrtcQueueSequence(int fd, uint32_t crtcId,
677*7688df22SAndroid Build Coastguard Worker 					  uint32_t flags, uint64_t sequence,
678*7688df22SAndroid Build Coastguard Worker 					  uint64_t *sequence_queued,
679*7688df22SAndroid Build Coastguard Worker 					  uint64_t user_data);
680*7688df22SAndroid Build Coastguard Worker /* General user-level programmer's API: authenticated client and/or X */
681*7688df22SAndroid Build Coastguard Worker extern int           drmMap(int fd,
682*7688df22SAndroid Build Coastguard Worker 			    drm_handle_t handle,
683*7688df22SAndroid Build Coastguard Worker 			    drmSize size,
684*7688df22SAndroid Build Coastguard Worker 			    drmAddressPtr address);
685*7688df22SAndroid Build Coastguard Worker extern int           drmUnmap(drmAddress address, drmSize size);
686*7688df22SAndroid Build Coastguard Worker extern drmBufInfoPtr drmGetBufInfo(int fd);
687*7688df22SAndroid Build Coastguard Worker extern drmBufMapPtr  drmMapBufs(int fd);
688*7688df22SAndroid Build Coastguard Worker extern int           drmUnmapBufs(drmBufMapPtr bufs);
689*7688df22SAndroid Build Coastguard Worker extern int           drmDMA(int fd, drmDMAReqPtr request);
690*7688df22SAndroid Build Coastguard Worker extern int           drmFreeBufs(int fd, int count, int *list);
691*7688df22SAndroid Build Coastguard Worker extern int           drmGetLock(int fd,
692*7688df22SAndroid Build Coastguard Worker 			        drm_context_t context,
693*7688df22SAndroid Build Coastguard Worker 			        drmLockFlags flags);
694*7688df22SAndroid Build Coastguard Worker extern int           drmUnlock(int fd, drm_context_t context);
695*7688df22SAndroid Build Coastguard Worker extern int           drmFinish(int fd, int context, drmLockFlags flags);
696*7688df22SAndroid Build Coastguard Worker extern int	     drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
697*7688df22SAndroid Build Coastguard Worker 						 drm_handle_t * handle);
698*7688df22SAndroid Build Coastguard Worker 
699*7688df22SAndroid Build Coastguard Worker /* AGP/GART support: X server (root) only */
700*7688df22SAndroid Build Coastguard Worker extern int           drmAgpAcquire(int fd);
701*7688df22SAndroid Build Coastguard Worker extern int           drmAgpRelease(int fd);
702*7688df22SAndroid Build Coastguard Worker extern int           drmAgpEnable(int fd, unsigned long mode);
703*7688df22SAndroid Build Coastguard Worker extern int           drmAgpAlloc(int fd, unsigned long size,
704*7688df22SAndroid Build Coastguard Worker 				 unsigned long type, unsigned long *address,
705*7688df22SAndroid Build Coastguard Worker 				 drm_handle_t *handle);
706*7688df22SAndroid Build Coastguard Worker extern int           drmAgpFree(int fd, drm_handle_t handle);
707*7688df22SAndroid Build Coastguard Worker extern int 	     drmAgpBind(int fd, drm_handle_t handle,
708*7688df22SAndroid Build Coastguard Worker 				unsigned long offset);
709*7688df22SAndroid Build Coastguard Worker extern int           drmAgpUnbind(int fd, drm_handle_t handle);
710*7688df22SAndroid Build Coastguard Worker 
711*7688df22SAndroid Build Coastguard Worker /* AGP/GART info: authenticated client and/or X */
712*7688df22SAndroid Build Coastguard Worker extern int           drmAgpVersionMajor(int fd);
713*7688df22SAndroid Build Coastguard Worker extern int           drmAgpVersionMinor(int fd);
714*7688df22SAndroid Build Coastguard Worker extern unsigned long drmAgpGetMode(int fd);
715*7688df22SAndroid Build Coastguard Worker extern unsigned long drmAgpBase(int fd); /* Physical location */
716*7688df22SAndroid Build Coastguard Worker extern unsigned long drmAgpSize(int fd); /* Bytes */
717*7688df22SAndroid Build Coastguard Worker extern unsigned long drmAgpMemoryUsed(int fd);
718*7688df22SAndroid Build Coastguard Worker extern unsigned long drmAgpMemoryAvail(int fd);
719*7688df22SAndroid Build Coastguard Worker extern unsigned int  drmAgpVendorId(int fd);
720*7688df22SAndroid Build Coastguard Worker extern unsigned int  drmAgpDeviceId(int fd);
721*7688df22SAndroid Build Coastguard Worker 
722*7688df22SAndroid Build Coastguard Worker /* PCI scatter/gather support: X server (root) only */
723*7688df22SAndroid Build Coastguard Worker extern int           drmScatterGatherAlloc(int fd, unsigned long size,
724*7688df22SAndroid Build Coastguard Worker 					   drm_handle_t *handle);
725*7688df22SAndroid Build Coastguard Worker extern int           drmScatterGatherFree(int fd, drm_handle_t handle);
726*7688df22SAndroid Build Coastguard Worker 
727*7688df22SAndroid Build Coastguard Worker extern int           drmWaitVBlank(int fd, drmVBlankPtr vbl);
728*7688df22SAndroid Build Coastguard Worker 
729*7688df22SAndroid Build Coastguard Worker /* Support routines */
730*7688df22SAndroid Build Coastguard Worker extern void          drmSetServerInfo(drmServerInfoPtr info);
731*7688df22SAndroid Build Coastguard Worker extern int           drmError(int err, const char *label);
732*7688df22SAndroid Build Coastguard Worker extern void          *drmMalloc(int size);
733*7688df22SAndroid Build Coastguard Worker extern void          drmFree(void *pt);
734*7688df22SAndroid Build Coastguard Worker 
735*7688df22SAndroid Build Coastguard Worker /* Hash table routines */
736*7688df22SAndroid Build Coastguard Worker extern void *drmHashCreate(void);
737*7688df22SAndroid Build Coastguard Worker extern int  drmHashDestroy(void *t);
738*7688df22SAndroid Build Coastguard Worker extern int  drmHashLookup(void *t, unsigned long key, void **value);
739*7688df22SAndroid Build Coastguard Worker extern int  drmHashInsert(void *t, unsigned long key, void *value);
740*7688df22SAndroid Build Coastguard Worker extern int  drmHashDelete(void *t, unsigned long key);
741*7688df22SAndroid Build Coastguard Worker extern int  drmHashFirst(void *t, unsigned long *key, void **value);
742*7688df22SAndroid Build Coastguard Worker extern int  drmHashNext(void *t, unsigned long *key, void **value);
743*7688df22SAndroid Build Coastguard Worker 
744*7688df22SAndroid Build Coastguard Worker /* PRNG routines */
745*7688df22SAndroid Build Coastguard Worker extern void          *drmRandomCreate(unsigned long seed);
746*7688df22SAndroid Build Coastguard Worker extern int           drmRandomDestroy(void *state);
747*7688df22SAndroid Build Coastguard Worker extern unsigned long drmRandom(void *state);
748*7688df22SAndroid Build Coastguard Worker extern double        drmRandomDouble(void *state);
749*7688df22SAndroid Build Coastguard Worker 
750*7688df22SAndroid Build Coastguard Worker /* Skip list routines */
751*7688df22SAndroid Build Coastguard Worker 
752*7688df22SAndroid Build Coastguard Worker extern void *drmSLCreate(void);
753*7688df22SAndroid Build Coastguard Worker extern int  drmSLDestroy(void *l);
754*7688df22SAndroid Build Coastguard Worker extern int  drmSLLookup(void *l, unsigned long key, void **value);
755*7688df22SAndroid Build Coastguard Worker extern int  drmSLInsert(void *l, unsigned long key, void *value);
756*7688df22SAndroid Build Coastguard Worker extern int  drmSLDelete(void *l, unsigned long key);
757*7688df22SAndroid Build Coastguard Worker extern int  drmSLNext(void *l, unsigned long *key, void **value);
758*7688df22SAndroid Build Coastguard Worker extern int  drmSLFirst(void *l, unsigned long *key, void **value);
759*7688df22SAndroid Build Coastguard Worker extern void drmSLDump(void *l);
760*7688df22SAndroid Build Coastguard Worker extern int  drmSLLookupNeighbors(void *l, unsigned long key,
761*7688df22SAndroid Build Coastguard Worker 				 unsigned long *prev_key, void **prev_value,
762*7688df22SAndroid Build Coastguard Worker 				 unsigned long *next_key, void **next_value);
763*7688df22SAndroid Build Coastguard Worker 
764*7688df22SAndroid Build Coastguard Worker extern int drmOpenOnce(void *unused, const char *BusID, int *newlyopened);
765*7688df22SAndroid Build Coastguard Worker extern int drmOpenOnceWithType(const char *BusID, int *newlyopened, int type);
766*7688df22SAndroid Build Coastguard Worker extern void drmCloseOnce(int fd);
767*7688df22SAndroid Build Coastguard Worker extern void drmMsg(const char *format, ...) DRM_PRINTFLIKE(1, 2);
768*7688df22SAndroid Build Coastguard Worker 
769*7688df22SAndroid Build Coastguard Worker extern int drmSetMaster(int fd);
770*7688df22SAndroid Build Coastguard Worker extern int drmDropMaster(int fd);
771*7688df22SAndroid Build Coastguard Worker extern int drmIsMaster(int fd);
772*7688df22SAndroid Build Coastguard Worker 
773*7688df22SAndroid Build Coastguard Worker #define DRM_EVENT_CONTEXT_VERSION 4
774*7688df22SAndroid Build Coastguard Worker 
775*7688df22SAndroid Build Coastguard Worker typedef struct _drmEventContext {
776*7688df22SAndroid Build Coastguard Worker 
777*7688df22SAndroid Build Coastguard Worker 	/* This struct is versioned so we can add more pointers if we
778*7688df22SAndroid Build Coastguard Worker 	 * add more events. */
779*7688df22SAndroid Build Coastguard Worker 	int version;
780*7688df22SAndroid Build Coastguard Worker 
781*7688df22SAndroid Build Coastguard Worker 	void (*vblank_handler)(int fd,
782*7688df22SAndroid Build Coastguard Worker 			       unsigned int sequence,
783*7688df22SAndroid Build Coastguard Worker 			       unsigned int tv_sec,
784*7688df22SAndroid Build Coastguard Worker 			       unsigned int tv_usec,
785*7688df22SAndroid Build Coastguard Worker 			       void *user_data);
786*7688df22SAndroid Build Coastguard Worker 
787*7688df22SAndroid Build Coastguard Worker 	void (*page_flip_handler)(int fd,
788*7688df22SAndroid Build Coastguard Worker 				  unsigned int sequence,
789*7688df22SAndroid Build Coastguard Worker 				  unsigned int tv_sec,
790*7688df22SAndroid Build Coastguard Worker 				  unsigned int tv_usec,
791*7688df22SAndroid Build Coastguard Worker 				  void *user_data);
792*7688df22SAndroid Build Coastguard Worker 
793*7688df22SAndroid Build Coastguard Worker 	void (*page_flip_handler2)(int fd,
794*7688df22SAndroid Build Coastguard Worker 				   unsigned int sequence,
795*7688df22SAndroid Build Coastguard Worker 				   unsigned int tv_sec,
796*7688df22SAndroid Build Coastguard Worker 				   unsigned int tv_usec,
797*7688df22SAndroid Build Coastguard Worker 				   unsigned int crtc_id,
798*7688df22SAndroid Build Coastguard Worker 				   void *user_data);
799*7688df22SAndroid Build Coastguard Worker 
800*7688df22SAndroid Build Coastguard Worker 	void (*sequence_handler)(int fd,
801*7688df22SAndroid Build Coastguard Worker 				 uint64_t sequence,
802*7688df22SAndroid Build Coastguard Worker 				 uint64_t ns,
803*7688df22SAndroid Build Coastguard Worker 				 uint64_t user_data);
804*7688df22SAndroid Build Coastguard Worker } drmEventContext, *drmEventContextPtr;
805*7688df22SAndroid Build Coastguard Worker 
806*7688df22SAndroid Build Coastguard Worker extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
807*7688df22SAndroid Build Coastguard Worker 
808*7688df22SAndroid Build Coastguard Worker extern char *drmGetDeviceNameFromFd(int fd);
809*7688df22SAndroid Build Coastguard Worker 
810*7688df22SAndroid Build Coastguard Worker /* Improved version of drmGetDeviceNameFromFd which attributes for any type of
811*7688df22SAndroid Build Coastguard Worker  * device/node - card or renderD.
812*7688df22SAndroid Build Coastguard Worker  */
813*7688df22SAndroid Build Coastguard Worker extern char *drmGetDeviceNameFromFd2(int fd);
814*7688df22SAndroid Build Coastguard Worker extern int drmGetNodeTypeFromFd(int fd);
815*7688df22SAndroid Build Coastguard Worker 
816*7688df22SAndroid Build Coastguard Worker /* Convert between GEM handles and DMA-BUF file descriptors.
817*7688df22SAndroid Build Coastguard Worker  *
818*7688df22SAndroid Build Coastguard Worker  * Warning: since GEM handles are not reference-counted and are unique per
819*7688df22SAndroid Build Coastguard Worker  * DRM file description, the caller is expected to perform its own reference
820*7688df22SAndroid Build Coastguard Worker  * counting. drmPrimeFDToHandle is guaranteed to return the same handle for
821*7688df22SAndroid Build Coastguard Worker  * different FDs if they reference the same underlying buffer object. This
822*7688df22SAndroid Build Coastguard Worker  * could even be a buffer object originally created on the same DRM FD.
823*7688df22SAndroid Build Coastguard Worker  *
824*7688df22SAndroid Build Coastguard Worker  * When sharing a DRM FD with an API such as EGL or GBM, the caller must not
825*7688df22SAndroid Build Coastguard Worker  * use drmPrimeHandleToFD nor drmPrimeFDToHandle. A single user-space
826*7688df22SAndroid Build Coastguard Worker  * reference-counting implementation is necessary to avoid double-closing GEM
827*7688df22SAndroid Build Coastguard Worker  * handles.
828*7688df22SAndroid Build Coastguard Worker  *
829*7688df22SAndroid Build Coastguard Worker  * Two processes can't share the same DRM FD and both use it to create or
830*7688df22SAndroid Build Coastguard Worker  * import GEM handles, even when using a single user-space reference-counting
831*7688df22SAndroid Build Coastguard Worker  * implementation like GBM, because GBM doesn't share its state between
832*7688df22SAndroid Build Coastguard Worker  * processes.
833*7688df22SAndroid Build Coastguard Worker  */
834*7688df22SAndroid Build Coastguard Worker extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
835*7688df22SAndroid Build Coastguard Worker extern int drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle);
836*7688df22SAndroid Build Coastguard Worker 
837*7688df22SAndroid Build Coastguard Worker extern int drmCloseBufferHandle(int fd, uint32_t handle);
838*7688df22SAndroid Build Coastguard Worker 
839*7688df22SAndroid Build Coastguard Worker extern char *drmGetPrimaryDeviceNameFromFd(int fd);
840*7688df22SAndroid Build Coastguard Worker extern char *drmGetRenderDeviceNameFromFd(int fd);
841*7688df22SAndroid Build Coastguard Worker 
842*7688df22SAndroid Build Coastguard Worker #define DRM_BUS_PCI       0
843*7688df22SAndroid Build Coastguard Worker #define DRM_BUS_USB       1
844*7688df22SAndroid Build Coastguard Worker #define DRM_BUS_PLATFORM  2
845*7688df22SAndroid Build Coastguard Worker #define DRM_BUS_HOST1X    3
846*7688df22SAndroid Build Coastguard Worker 
847*7688df22SAndroid Build Coastguard Worker typedef struct _drmPciBusInfo {
848*7688df22SAndroid Build Coastguard Worker     uint16_t domain;
849*7688df22SAndroid Build Coastguard Worker     uint8_t bus;
850*7688df22SAndroid Build Coastguard Worker     uint8_t dev;
851*7688df22SAndroid Build Coastguard Worker     uint8_t func;
852*7688df22SAndroid Build Coastguard Worker } drmPciBusInfo, *drmPciBusInfoPtr;
853*7688df22SAndroid Build Coastguard Worker 
854*7688df22SAndroid Build Coastguard Worker typedef struct _drmPciDeviceInfo {
855*7688df22SAndroid Build Coastguard Worker     uint16_t vendor_id;
856*7688df22SAndroid Build Coastguard Worker     uint16_t device_id;
857*7688df22SAndroid Build Coastguard Worker     uint16_t subvendor_id;
858*7688df22SAndroid Build Coastguard Worker     uint16_t subdevice_id;
859*7688df22SAndroid Build Coastguard Worker     uint8_t revision_id;
860*7688df22SAndroid Build Coastguard Worker } drmPciDeviceInfo, *drmPciDeviceInfoPtr;
861*7688df22SAndroid Build Coastguard Worker 
862*7688df22SAndroid Build Coastguard Worker typedef struct _drmUsbBusInfo {
863*7688df22SAndroid Build Coastguard Worker     uint8_t bus;
864*7688df22SAndroid Build Coastguard Worker     uint8_t dev;
865*7688df22SAndroid Build Coastguard Worker } drmUsbBusInfo, *drmUsbBusInfoPtr;
866*7688df22SAndroid Build Coastguard Worker 
867*7688df22SAndroid Build Coastguard Worker typedef struct _drmUsbDeviceInfo {
868*7688df22SAndroid Build Coastguard Worker     uint16_t vendor;
869*7688df22SAndroid Build Coastguard Worker     uint16_t product;
870*7688df22SAndroid Build Coastguard Worker } drmUsbDeviceInfo, *drmUsbDeviceInfoPtr;
871*7688df22SAndroid Build Coastguard Worker 
872*7688df22SAndroid Build Coastguard Worker #define DRM_PLATFORM_DEVICE_NAME_LEN 512
873*7688df22SAndroid Build Coastguard Worker 
874*7688df22SAndroid Build Coastguard Worker typedef struct _drmPlatformBusInfo {
875*7688df22SAndroid Build Coastguard Worker     char fullname[DRM_PLATFORM_DEVICE_NAME_LEN];
876*7688df22SAndroid Build Coastguard Worker } drmPlatformBusInfo, *drmPlatformBusInfoPtr;
877*7688df22SAndroid Build Coastguard Worker 
878*7688df22SAndroid Build Coastguard Worker typedef struct _drmPlatformDeviceInfo {
879*7688df22SAndroid Build Coastguard Worker     char **compatible; /* NULL terminated list of compatible strings */
880*7688df22SAndroid Build Coastguard Worker } drmPlatformDeviceInfo, *drmPlatformDeviceInfoPtr;
881*7688df22SAndroid Build Coastguard Worker 
882*7688df22SAndroid Build Coastguard Worker #define DRM_HOST1X_DEVICE_NAME_LEN 512
883*7688df22SAndroid Build Coastguard Worker 
884*7688df22SAndroid Build Coastguard Worker typedef struct _drmHost1xBusInfo {
885*7688df22SAndroid Build Coastguard Worker     char fullname[DRM_HOST1X_DEVICE_NAME_LEN];
886*7688df22SAndroid Build Coastguard Worker } drmHost1xBusInfo, *drmHost1xBusInfoPtr;
887*7688df22SAndroid Build Coastguard Worker 
888*7688df22SAndroid Build Coastguard Worker typedef struct _drmHost1xDeviceInfo {
889*7688df22SAndroid Build Coastguard Worker     char **compatible; /* NULL terminated list of compatible strings */
890*7688df22SAndroid Build Coastguard Worker } drmHost1xDeviceInfo, *drmHost1xDeviceInfoPtr;
891*7688df22SAndroid Build Coastguard Worker 
892*7688df22SAndroid Build Coastguard Worker typedef struct _drmDevice {
893*7688df22SAndroid Build Coastguard Worker     char **nodes; /* DRM_NODE_MAX sized array */
894*7688df22SAndroid Build Coastguard Worker     int available_nodes; /* DRM_NODE_* bitmask */
895*7688df22SAndroid Build Coastguard Worker     int bustype;
896*7688df22SAndroid Build Coastguard Worker     union {
897*7688df22SAndroid Build Coastguard Worker         drmPciBusInfoPtr pci;
898*7688df22SAndroid Build Coastguard Worker         drmUsbBusInfoPtr usb;
899*7688df22SAndroid Build Coastguard Worker         drmPlatformBusInfoPtr platform;
900*7688df22SAndroid Build Coastguard Worker         drmHost1xBusInfoPtr host1x;
901*7688df22SAndroid Build Coastguard Worker     } businfo;
902*7688df22SAndroid Build Coastguard Worker     union {
903*7688df22SAndroid Build Coastguard Worker         drmPciDeviceInfoPtr pci;
904*7688df22SAndroid Build Coastguard Worker         drmUsbDeviceInfoPtr usb;
905*7688df22SAndroid Build Coastguard Worker         drmPlatformDeviceInfoPtr platform;
906*7688df22SAndroid Build Coastguard Worker         drmHost1xDeviceInfoPtr host1x;
907*7688df22SAndroid Build Coastguard Worker     } deviceinfo;
908*7688df22SAndroid Build Coastguard Worker } drmDevice, *drmDevicePtr;
909*7688df22SAndroid Build Coastguard Worker 
910*7688df22SAndroid Build Coastguard Worker extern int drmGetDevice(int fd, drmDevicePtr *device);
911*7688df22SAndroid Build Coastguard Worker extern void drmFreeDevice(drmDevicePtr *device);
912*7688df22SAndroid Build Coastguard Worker 
913*7688df22SAndroid Build Coastguard Worker extern int drmGetDevices(drmDevicePtr devices[], int max_devices);
914*7688df22SAndroid Build Coastguard Worker extern void drmFreeDevices(drmDevicePtr devices[], int count);
915*7688df22SAndroid Build Coastguard Worker 
916*7688df22SAndroid Build Coastguard Worker #define DRM_DEVICE_GET_PCI_REVISION (1 << 0)
917*7688df22SAndroid Build Coastguard Worker extern int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device);
918*7688df22SAndroid Build Coastguard Worker extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices);
919*7688df22SAndroid Build Coastguard Worker 
920*7688df22SAndroid Build Coastguard Worker extern int drmGetDeviceFromDevId(dev_t dev_id, uint32_t flags, drmDevicePtr *device);
921*7688df22SAndroid Build Coastguard Worker 
922*7688df22SAndroid Build Coastguard Worker /**
923*7688df22SAndroid Build Coastguard Worker  * Get the node type (DRM_NODE_PRIMARY or DRM_NODE_RENDER) from a device ID.
924*7688df22SAndroid Build Coastguard Worker  *
925*7688df22SAndroid Build Coastguard Worker  * Returns negative errno on error.
926*7688df22SAndroid Build Coastguard Worker  */
927*7688df22SAndroid Build Coastguard Worker extern int drmGetNodeTypeFromDevId(dev_t devid);
928*7688df22SAndroid Build Coastguard Worker 
929*7688df22SAndroid Build Coastguard Worker /**
930*7688df22SAndroid Build Coastguard Worker  * Check if two drmDevice pointers represent the same DRM device.
931*7688df22SAndroid Build Coastguard Worker  *
932*7688df22SAndroid Build Coastguard Worker  * Returns 1 if the devices are equal, 0 otherwise.
933*7688df22SAndroid Build Coastguard Worker  */
934*7688df22SAndroid Build Coastguard Worker extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
935*7688df22SAndroid Build Coastguard Worker 
936*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
937*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjDestroy(int fd, uint32_t handle);
938*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
939*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
940*7688df22SAndroid Build Coastguard Worker 
941*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);
942*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);
943*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles,
944*7688df22SAndroid Build Coastguard Worker 			  int64_t timeout_nsec, unsigned flags,
945*7688df22SAndroid Build Coastguard Worker 			  uint32_t *first_signaled);
946*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjReset(int fd, const uint32_t *handles, uint32_t handle_count);
947*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjSignal(int fd, const uint32_t *handles, uint32_t handle_count);
948*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjTimelineSignal(int fd, const uint32_t *handles,
949*7688df22SAndroid Build Coastguard Worker 				    uint64_t *points, uint32_t handle_count);
950*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjTimelineWait(int fd, uint32_t *handles, uint64_t *points,
951*7688df22SAndroid Build Coastguard Worker 				  unsigned num_handles,
952*7688df22SAndroid Build Coastguard Worker 				  int64_t timeout_nsec, unsigned flags,
953*7688df22SAndroid Build Coastguard Worker 				  uint32_t *first_signaled);
954*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points,
955*7688df22SAndroid Build Coastguard Worker 			   uint32_t handle_count);
956*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjQuery2(int fd, uint32_t *handles, uint64_t *points,
957*7688df22SAndroid Build Coastguard Worker 			    uint32_t handle_count, uint32_t flags);
958*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjTransfer(int fd,
959*7688df22SAndroid Build Coastguard Worker 			      uint32_t dst_handle, uint64_t dst_point,
960*7688df22SAndroid Build Coastguard Worker 			      uint32_t src_handle, uint64_t src_point,
961*7688df22SAndroid Build Coastguard Worker 			      uint32_t flags);
962*7688df22SAndroid Build Coastguard Worker extern int drmSyncobjEventfd(int fd, uint32_t handle, uint64_t point, int ev_fd,
963*7688df22SAndroid Build Coastguard Worker                              uint32_t flags);
964*7688df22SAndroid Build Coastguard Worker 
965*7688df22SAndroid Build Coastguard Worker extern char *
966*7688df22SAndroid Build Coastguard Worker drmGetFormatModifierVendor(uint64_t modifier);
967*7688df22SAndroid Build Coastguard Worker 
968*7688df22SAndroid Build Coastguard Worker extern char *
969*7688df22SAndroid Build Coastguard Worker drmGetFormatModifierName(uint64_t modifier);
970*7688df22SAndroid Build Coastguard Worker 
971*7688df22SAndroid Build Coastguard Worker extern char *
972*7688df22SAndroid Build Coastguard Worker drmGetFormatName(uint32_t format);
973*7688df22SAndroid Build Coastguard Worker 
974*7688df22SAndroid Build Coastguard Worker #ifndef fourcc_mod_get_vendor
975*7688df22SAndroid Build Coastguard Worker #define fourcc_mod_get_vendor(modifier) \
976*7688df22SAndroid Build Coastguard Worker        (((modifier) >> 56) & 0xff)
977*7688df22SAndroid Build Coastguard Worker #endif
978*7688df22SAndroid Build Coastguard Worker 
979*7688df22SAndroid Build Coastguard Worker #if defined(__cplusplus)
980*7688df22SAndroid Build Coastguard Worker }
981*7688df22SAndroid Build Coastguard Worker #endif
982*7688df22SAndroid Build Coastguard Worker 
983*7688df22SAndroid Build Coastguard Worker #endif
984