3 * OS-independent header for DRM user-level library interface.
\r
5 * \author Rickard E. (Rik) Faith <faith@valinux.com>
\r
9 * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
\r
10 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
\r
11 * All Rights Reserved.
\r
13 * Permission is hereby granted, free of charge, to any person obtaining a
\r
14 * copy of this software and associated documentation files (the "Software"),
\r
15 * to deal in the Software without restriction, including without limitation
\r
16 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
\r
17 * and/or sell copies of the Software, and to permit persons to whom the
\r
18 * Software is furnished to do so, subject to the following conditions:
\r
20 * The above copyright notice and this permission notice (including the next
\r
21 * paragraph) shall be included in all copies or substantial portions of the
\r
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
\r
27 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
\r
28 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
\r
29 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
\r
30 * DEALINGS IN THE SOFTWARE.
\r
38 #include <sys/types.h>
\r
41 #if defined(__cplusplus)
\r
45 #ifndef DRM_MAX_MINOR
\r
46 #define DRM_MAX_MINOR 16
\r
49 #if defined(__linux__)
\r
51 #define DRM_IOCTL_NR(n) _IOC_NR(n)
\r
52 #define DRM_IOC_VOID _IOC_NONE
\r
53 #define DRM_IOC_READ _IOC_READ
\r
54 #define DRM_IOC_WRITE _IOC_WRITE
\r
55 #define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
\r
56 #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
\r
58 #else /* One of the *BSDs */
\r
60 #define DRM_IOCTL_NR(n) ((n) & 0xff)
\r
61 #define DRM_IOC_VOID IOC_VOID
\r
62 #define DRM_IOC_READ IOC_OUT
\r
63 #define DRM_IOC_WRITE IOC_IN
\r
64 #define DRM_IOC_READWRITE IOC_INOUT
\r
65 #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
\r
69 /* Defaults, if nothing set in xf86config */
\r
70 #define DRM_DEV_UID 0
\r
71 #define DRM_DEV_GID 0
\r
72 /* Default /dev/dri directory permissions 0755 */
\r
73 #define DRM_DEV_DIRMODE \
\r
74 (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
\r
75 #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
\r
78 #define DRM_DIR_NAME "/dev"
\r
79 #define DRM_DEV_NAME "%s/drm%d"
\r
80 #define DRM_CONTROL_DEV_NAME "%s/drmC%d"
\r
81 #define DRM_RENDER_DEV_NAME "%s/drmR%d"
\r
83 #define DRM_DIR_NAME "/dev/dri"
\r
84 #define DRM_DEV_NAME "%s/card%d"
\r
85 #define DRM_CONTROL_DEV_NAME "%s/controlD%d"
\r
86 #define DRM_RENDER_DEV_NAME "%s/renderD%d"
\r
87 #define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
\r
90 #define DRM_ERR_NO_DEVICE (-1001)
\r
91 #define DRM_ERR_NO_ACCESS (-1002)
\r
92 #define DRM_ERR_NOT_ROOT (-1003)
\r
93 #define DRM_ERR_INVALID (-1004)
\r
94 #define DRM_ERR_NO_FD (-1005)
\r
96 #define DRM_AGP_NO_HANDLE 0
\r
98 typedef unsigned int drmSize, *drmSizePtr; /**< For mapped regions */
\r
99 typedef void *drmAddress, **drmAddressPtr; /**< For mapped regions */
\r
101 #if (__GNUC__ >= 3)
\r
102 #define DRM_PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
\r
104 #define DRM_PRINTFLIKE(f, a)
\r
107 typedef struct _drmServerInfo {
\r
108 int( *debug_print )( const char *format, va_list ap ) DRM_PRINTFLIKE( 1, 0 );
\r
109 int( *load_module )( const char *name );
\r
110 } drmServerInfo, *drmServerInfoPtr;
\r
112 typedef struct drmHashEntry {
\r
114 void( *f )( int, void *, void * );
\r
118 extern int drmIoctl( int fd, unsigned long request, void *arg );
\r
119 extern void *drmGetHashTable( void );
\r
120 extern drmHashEntry *drmGetEntry( int fd );
\r
123 * Driver version information.
\r
125 * \sa drmGetVersion() and drmSetVersion().
\r
127 typedef struct _drmVersion {
\r
128 int version_major; /**< Major version */
\r
129 int version_minor; /**< Minor version */
\r
130 int version_patchlevel; /**< Patch level */
\r
131 int name_len; /**< Length of name buffer */
\r
132 char *name; /**< Name of driver */
\r
133 int date_len; /**< Length of date buffer */
\r
134 char *date; /**< User-space buffer to hold date */
\r
135 int desc_len; /**< Length of desc buffer */
\r
136 char *desc; /**< User-space buffer to hold desc */
\r
137 } drmVersion, *drmVersionPtr;
\r
139 typedef struct _drmStats {
\r
140 unsigned long count; /**< Number of data */
\r
142 unsigned long value; /**< Value from kernel */
\r
143 const char *long_format; /**< Suggested format for long_name */
\r
144 const char *long_name; /**< Long name for value */
\r
145 const char *rate_format; /**< Suggested format for rate_name */
\r
146 const char *rate_name; /**< Short name for value per second */
\r
147 int isvalue; /**< True if value (vs. counter) */
\r
148 const char *mult_names; /**< Multiplier names (e.g., "KGM") */
\r
149 int mult; /**< Multiplier value (e.g., 1024) */
\r
150 int verbose; /**< Suggest only in verbose output */
\r
155 /* All of these enums *MUST* match with the
\r
156 kernel implementation -- so do *NOT*
\r
157 change them! (The drmlib implementation
\r
158 will just copy the flags instead of
\r
159 translating them.) */
\r
161 DRM_FRAME_BUFFER = 0, /**< WC, no caching, no core dump */
\r
162 DRM_REGISTERS = 1, /**< no caching, no core dump */
\r
163 DRM_SHM = 2, /**< shared, cached */
\r
164 DRM_AGP = 3, /**< AGP/GART */
\r
165 DRM_SCATTER_GATHER = 4, /**< PCI scatter/gather */
\r
166 DRM_CONSISTENT = 5 /**< PCI consistent */
\r
170 DRM_RESTRICTED = 0x0001, /**< Cannot be mapped to client-virtual */
\r
171 DRM_READ_ONLY = 0x0002, /**< Read-only in client-virtual */
\r
172 DRM_LOCKED = 0x0004, /**< Physical pages locked */
\r
173 DRM_KERNEL = 0x0008, /**< Kernel requires access */
\r
174 DRM_WRITE_COMBINING = 0x0010, /**< Use write-combining, if available */
\r
175 DRM_CONTAINS_LOCK = 0x0020, /**< SHM page that contains lock */
\r
176 DRM_REMOVABLE = 0x0040 /**< Removable mapping */
\r
180 * \warning These values *MUST* match drm.h
\r
183 /** \name Flags for DMA buffer dispatch */
\r
185 DRM_DMA_BLOCK = 0x01, /**<
\r
186 * Block until buffer dispatched.
\r
188 * \note the buffer may not yet have been
\r
189 * processed by the hardware -- getting a
\r
190 * hardware lock with the hardware quiescent
\r
191 * will ensure that the buffer has been
\r
194 DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
\r
195 DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
\r
198 /** \name Flags for DMA buffer request */
\r
200 DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
\r
201 DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
\r
202 DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
\r
207 DRM_PAGE_ALIGN = 0x01,
\r
208 DRM_AGP_BUFFER = 0x02,
\r
209 DRM_SG_BUFFER = 0x04,
\r
210 DRM_FB_BUFFER = 0x08,
\r
211 DRM_PCI_BUFFER_RO = 0x10
\r
215 DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
\r
216 DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
\r
217 DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
\r
218 DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
\r
219 /* These *HALT* flags aren't supported yet
\r
220 -- they will be used to support the
\r
221 full-screen DGA-like mode. */
\r
222 DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
\r
223 DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
\r
227 DRM_CONTEXT_PRESERVED = 0x01, /**< This context is preserved and
\r
229 DRM_CONTEXT_2DONLY = 0x02 /**< This context is for 2D rendering only. */
\r
230 } drm_context_tFlags, *drm_context_tFlagsPtr;
\r
232 typedef struct _drmBufDesc {
\r
233 int count; /**< Number of buffers of this size */
\r
234 int size; /**< Size in bytes */
\r
235 int low_mark; /**< Low water mark */
\r
236 int high_mark; /**< High water mark */
\r
237 } drmBufDesc, *drmBufDescPtr;
\r
239 typedef struct _drmBufInfo {
\r
240 int count; /**< Number of buffers described in list */
\r
241 drmBufDescPtr list; /**< List of buffer descriptions */
\r
242 } drmBufInfo, *drmBufInfoPtr;
\r
244 typedef struct _drmBuf {
\r
245 int idx; /**< Index into the master buffer list */
\r
246 int total; /**< Buffer size */
\r
247 int used; /**< Amount of buffer in use (for DMA) */
\r
248 drmAddress address; /**< Address */
\r
249 } drmBuf, *drmBufPtr;
\r
252 * Buffer mapping information.
\r
254 * Used by drmMapBufs() and drmUnmapBufs() to store information about the
\r
257 typedef struct _drmBufMap {
\r
258 int count; /**< Number of buffers mapped */
\r
259 drmBufPtr list; /**< Buffers */
\r
260 } drmBufMap, *drmBufMapPtr;
\r
262 typedef struct _drmLock {
\r
263 volatile unsigned int lock;
\r
265 /* This is big enough for most current (and future?) architectures:
\r
266 DEC Alpha: 32 bytes
\r
268 Intel P5/PPro/PII/PIII: 32 bytes
\r
269 Intel StrongARM: 32 bytes
\r
270 Intel i386/i486: 16 bytes
\r
272 Motorola 68k: 16 bytes
\r
273 Motorola PowerPC: 32 bytes
\r
274 Sun SPARC: 32 bytes
\r
276 } drmLock, *drmLockPtr;
\r
279 * Indices here refer to the offset into
\r
280 * list in drmBufInfo
\r
282 typedef struct _drmDMAReq {
\r
283 int send_count; /**< Number of buffers to send */
\r
284 int *send_list; /**< List of handles to buffers */
\r
285 int *send_sizes; /**< Lengths of data to send, in bytes */
\r
286 drmDMAFlags flags; /**< Flags */
\r
287 int request_count; /**< Number of buffers requested */
\r
288 int request_size; /**< Desired size of buffers requested */
\r
289 int *request_list; /**< Buffer information */
\r
290 int *request_sizes; /**< Minimum acceptable sizes */
\r
291 int granted_count; /**< Number of buffers granted at this size */
\r
292 } drmDMAReq, *drmDMAReqPtr;
\r
294 typedef struct _drmRegion {
\r
295 unsigned int offset;
\r
298 } drmRegion, *drmRegionPtr;
\r
300 typedef struct _drmTextureRegion {
\r
301 unsigned char next;
\r
302 unsigned char prev;
\r
303 unsigned char in_use;
\r
304 unsigned char padding; /**< Explicitly pad this out */
\r
306 } drmTextureRegion, *drmTextureRegionPtr;
\r
310 DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
\r
311 DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
\r
312 /* bits 1-6 are reserved for high crtcs */
\r
313 DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
\r
314 DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */
\r
315 DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
\r
316 DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
\r
317 DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
\r
318 DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */
\r
319 } drmVBlankSeqType;
\r
320 #define DRM_VBLANK_HIGH_CRTC_SHIFT 1
\r
322 typedef struct _drmVBlankReq {
\r
323 drmVBlankSeqType type;
\r
324 unsigned int sequence;
\r
325 unsigned long signal;
\r
326 } drmVBlankReq, *drmVBlankReqPtr;
\r
328 typedef struct _drmVBlankReply {
\r
329 drmVBlankSeqType type;
\r
330 unsigned int sequence;
\r
333 } drmVBlankReply, *drmVBlankReplyPtr;
\r
335 typedef union _drmVBlank {
\r
336 drmVBlankReq request;
\r
337 drmVBlankReply reply;
\r
338 } drmVBlank, *drmVBlankPtr;
\r
340 typedef struct _drmSetVersion {
\r
345 } drmSetVersion, *drmSetVersionPtr;
\r
347 #define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock)
\r
349 #define DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */
\r
350 #define DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */
\r
352 #if defined(__GNUC__) && (__GNUC__ >= 2)
\r
353 # if defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)
\r
354 /* Reflect changes here to drmP.h */
\r
355 #define DRM_CAS(lock,old,new,__ret) \
\r
357 int __dummy; /* Can't mark eax as clobbered */ \
\r
358 __asm__ __volatile__( \
\r
359 "lock ; cmpxchg %4,%1\n\t" \
\r
362 "=m" (__drm_dummy_lock(lock)), \
\r
368 #elif defined(__alpha__)
\r
370 #define DRM_CAS(lock, old, new, ret) \
\r
373 __asm__ __volatile__( \
\r
374 " addl $31, %5, %3\n" \
\r
375 "1: ldl_l %0, %2\n" \
\r
376 " cmpeq %0, %3, %1\n" \
\r
379 " stl_c %0, %2\n" \
\r
382 "2: cmpeq %1, 0, %1\n" \
\r
383 ".subsection 2\n" \
\r
386 : "=&r"(tmp), "=&r"(ret), \
\r
387 "=m"(__drm_dummy_lock(lock)), \
\r
389 : "r"(new), "r"(old) \
\r
393 #elif defined(__sparc__)
\r
395 #define DRM_CAS(lock,old,new,__ret) \
\r
396 do { register unsigned int __old __asm("o0"); \
\r
397 register unsigned int __new __asm("o1"); \
\r
398 register volatile unsigned int *__lock __asm("o2"); \
\r
401 __lock = (volatile unsigned int *)lock; \
\r
402 __asm__ __volatile__( \
\r
403 /*"cas [%2], %3, %0"*/ \
\r
404 ".word 0xd3e29008\n\t" \
\r
405 /*"membar #StoreStore | #StoreLoad"*/ \
\r
406 ".word 0x8143e00a" \
\r
412 __ret = (__new != __old); \
\r
415 #elif defined(__ia64__)
\r
417 #ifdef __INTEL_COMPILER
\r
418 /* this currently generates bad code (missing stop bits)... */
\r
419 #include <ia64intrin.h>
\r
421 #define DRM_CAS(lock,old,new,__ret) \
\r
423 unsigned long __result, __old = (old) & 0xffffffff; \
\r
425 __result = _InterlockedCompareExchange_acq(&__drm_dummy_lock(lock), (new), __old);\
\r
426 __ret = (__result) != (__old); \
\r
427 /* __ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \
\r
433 #define DRM_CAS(lock,old,new,__ret) \
\r
435 unsigned int __result, __old = (old); \
\r
436 __asm__ __volatile__( \
\r
438 "mov ar.ccv=%2\n" \
\r
440 "cmpxchg4.acq %0=%1,%3,ar.ccv" \
\r
441 : "=r" (__result), "=m" (__drm_dummy_lock(lock)) \
\r
442 : "r" ((unsigned long)__old), "r" (new) \
\r
444 __ret = (__result) != (__old); \
\r
449 #elif defined(__powerpc__)
\r
451 #define DRM_CAS(lock,old,new,__ret) \
\r
453 __asm__ __volatile__( \
\r
455 "0: lwarx %0,0,%1;" \
\r
456 " xor. %0,%3,%0;" \
\r
458 " stwcx. %2,0,%1;" \
\r
463 : "r"(lock), "r"(new), "r"(old) \
\r
464 : "cr0", "memory"); \
\r
467 #endif /* architecture */
\r
468 #endif /* __GNUC__ >= 2 */
\r
471 #define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */
\r
474 #if defined(__alpha__)
\r
475 #define DRM_CAS_RESULT(_result) long _result
\r
476 #elif defined(__powerpc__)
\r
477 #define DRM_CAS_RESULT(_result) int _result
\r
479 #define DRM_CAS_RESULT(_result) char _result
\r
482 #define DRM_LIGHT_LOCK(fd,lock,context) \
\r
484 DRM_CAS_RESULT(__ret); \
\r
485 DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
\r
486 if (__ret) drmGetLock(fd,context,0); \
\r
489 /* This one counts fast locks -- for
\r
490 benchmarking only. */
\r
491 #define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count) \
\r
493 DRM_CAS_RESULT(__ret); \
\r
494 DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
\r
495 if (__ret) drmGetLock(fd,context,0); \
\r
499 #define DRM_LOCK(fd,lock,context,flags) \
\r
501 if (flags) drmGetLock(fd,context,flags); \
\r
502 else DRM_LIGHT_LOCK(fd,lock,context); \
\r
505 #define DRM_UNLOCK(fd,lock,context) \
\r
507 DRM_CAS_RESULT(__ret); \
\r
508 DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret); \
\r
509 if (__ret) drmUnlock(fd,context); \
\r
512 /* Simple spin locks */
\r
513 #define DRM_SPINLOCK(spin,val) \
\r
515 DRM_CAS_RESULT(__ret); \
\r
517 DRM_CAS(spin,0,val,__ret); \
\r
518 if (__ret) while ((spin)->lock); \
\r
522 #define DRM_SPINLOCK_TAKE(spin,val) \
\r
524 DRM_CAS_RESULT(__ret); \
\r
527 cur = (*spin).lock; \
\r
528 DRM_CAS(spin,cur,val,__ret); \
\r
532 #define DRM_SPINLOCK_COUNT(spin,val,count,__ret) \
\r
536 for (__i = 0; __ret && __i < count; __i++) { \
\r
537 DRM_CAS(spin,0,val,__ret); \
\r
538 if (__ret) for (;__i < count && (spin)->lock; __i++); \
\r
542 #define DRM_SPINUNLOCK(spin,val) \
\r
544 DRM_CAS_RESULT(__ret); \
\r
545 if ((*spin).lock == val) { /* else server stole lock */ \
\r
547 DRM_CAS(spin,val,0,__ret); \
\r
554 /* General user-level programmer's API: unprivileged */
\r
555 extern int drmAvailable( void );
\r
556 extern int drmOpen( const char *name, const char *busid );
\r
558 #define DRM_NODE_PRIMARY 0
\r
559 #define DRM_NODE_CONTROL 1
\r
560 #define DRM_NODE_RENDER 2
\r
561 #define DRM_NODE_MAX 3
\r
563 extern int drmOpenWithType( const char *name, const char *busid,
\r
566 extern int drmOpenControl( int minor );
\r
567 extern int drmOpenRender( int minor );
\r
568 extern int drmClose( int fd );
\r
569 extern drmVersionPtr drmGetVersion( int fd );
\r
570 extern drmVersionPtr drmGetLibVersion( int fd );
\r
571 extern int drmGetCap( int fd, uint64_t capability, uint64_t *value );
\r
572 extern void drmFreeVersion( drmVersionPtr );
\r
573 extern char *drmGetBusid( int fd );
\r
574 extern int drmGetInterruptFromBusID( int fd, int busnum, int devnum,
\r
576 extern int drmGetClient( int fd, int idx, int *auth, int *pid,
\r
577 int *uid, unsigned long *magic,
\r
578 unsigned long *iocs );
\r
579 extern int drmGetStats( int fd, drmStatsT *stats );
\r
580 extern int drmSetInterfaceVersion( int fd, drmSetVersion *version );
\r
581 extern int drmCommandNone( int fd, unsigned long drmCommandIndex );
\r
582 extern int drmCommandRead( int fd, unsigned long drmCommandIndex,
\r
583 void *data, unsigned long size );
\r
584 extern int drmCommandWrite( int fd, unsigned long drmCommandIndex,
\r
585 void *data, unsigned long size );
\r
586 extern int drmCommandWriteRead( int fd, unsigned long drmCommandIndex,
\r
587 void *data, unsigned long size );
\r
589 /* General user-level programmer's API: X server (root) only */
\r
590 extern void drmFreeBusid( const char *busid );
\r
591 extern int drmSetBusid( int fd, const char *busid );
\r
593 extern int drmAddBufs( int fd, int count, int size,
\r
594 drmBufDescFlags flags,
\r
596 extern int drmMarkBufs( int fd, double low, double high );
\r
597 extern int drmCtlInstHandler( int fd, int irq );
\r
598 extern int drmCtlUninstHandler( int fd );
\r
599 extern int drmSetClientCap( int fd, uint64_t capability,
\r
602 /* General user-level programmer's API: authenticated client and/or X */
\r
603 extern int drmUnmap( drmAddress address, drmSize size );
\r
604 extern drmBufInfoPtr drmGetBufInfo( int fd );
\r
605 extern drmBufMapPtr drmMapBufs( int fd );
\r
606 extern int drmUnmapBufs( drmBufMapPtr bufs );
\r
607 extern int drmDMA( int fd, drmDMAReqPtr request );
\r
608 extern int drmFreeBufs( int fd, int count, int *list );
\r
610 /* AGP/GART support: X server (root) only */
\r
611 extern int drmAgpAcquire( int fd );
\r
612 extern int drmAgpRelease( int fd );
\r
613 extern int drmAgpEnable( int fd, unsigned long mode );
\r
615 /* AGP/GART info: authenticated client and/or X */
\r
616 extern int drmAgpVersionMajor( int fd );
\r
617 extern int drmAgpVersionMinor( int fd );
\r
618 extern unsigned long drmAgpGetMode( int fd );
\r
619 extern unsigned long drmAgpBase( int fd ); /* Physical location */
\r
620 extern unsigned long drmAgpSize( int fd ); /* Bytes */
\r
621 extern unsigned long drmAgpMemoryUsed( int fd );
\r
622 extern unsigned long drmAgpMemoryAvail( int fd );
\r
623 extern unsigned int drmAgpVendorId( int fd );
\r
624 extern unsigned int drmAgpDeviceId( int fd );
\r
626 /* PCI scatter/gather support: X server (root) only */
\r
627 extern int drmWaitVBlank( int fd, drmVBlankPtr vbl );
\r
629 /* Support routines */
\r
630 extern void drmSetServerInfo( drmServerInfoPtr info );
\r
631 extern int drmError( int err, const char *label );
\r
632 extern void *drmMalloc( int size );
\r
633 extern void drmFree( void *pt );
\r
635 /* Hash table routines */
\r
636 extern void *drmHashCreate( void );
\r
637 extern int drmHashDestroy( void *t );
\r
638 extern int drmHashLookup( void *t, unsigned long key, void **value );
\r
639 extern int drmHashInsert( void *t, unsigned long key, void *value );
\r
640 extern int drmHashDelete( void *t, unsigned long key );
\r
641 extern int drmHashFirst( void *t, unsigned long *key, void **value );
\r
642 extern int drmHashNext( void *t, unsigned long *key, void **value );
\r
644 /* PRNG routines */
\r
645 extern void *drmRandomCreate( unsigned long seed );
\r
646 extern int drmRandomDestroy( void *state );
\r
647 extern unsigned long drmRandom( void *state );
\r
648 extern double drmRandomDouble( void *state );
\r
650 /* Skip list routines */
\r
652 extern void *drmSLCreate( void );
\r
653 extern int drmSLDestroy( void *l );
\r
654 extern int drmSLLookup( void *l, unsigned long key, void **value );
\r
655 extern int drmSLInsert( void *l, unsigned long key, void *value );
\r
656 extern int drmSLDelete( void *l, unsigned long key );
\r
657 extern int drmSLNext( void *l, unsigned long *key, void **value );
\r
658 extern int drmSLFirst( void *l, unsigned long *key, void **value );
\r
659 extern void drmSLDump( void *l );
\r
660 extern int drmSLLookupNeighbors( void *l, unsigned long key,
\r
661 unsigned long *prev_key, void **prev_value,
\r
662 unsigned long *next_key, void **next_value );
\r
664 extern int drmOpenOnce( void *unused, const char *BusID, int *newlyopened );
\r
665 extern int drmOpenOnceWithType( const char *BusID, int *newlyopened, int type );
\r
666 extern void drmCloseOnce( int fd );
\r
667 extern void drmMsg( const char *format, ... ) DRM_PRINTFLIKE( 1, 2 );
\r
669 extern int drmSetMaster( int fd );
\r
670 extern int drmDropMaster( int fd );
\r
672 #define DRM_EVENT_CONTEXT_VERSION 2
\r
674 typedef struct _drmEventContext {
\r
676 /* This struct is versioned so we can add more pointers if we
\r
677 * add more events. */
\r
680 void( *vblank_handler )( int fd,
\r
681 unsigned int sequence,
\r
682 unsigned int tv_sec,
\r
683 unsigned int tv_usec,
\r
686 void( *page_flip_handler )( int fd,
\r
687 unsigned int sequence,
\r
688 unsigned int tv_sec,
\r
689 unsigned int tv_usec,
\r
692 } drmEventContext, *drmEventContextPtr;
\r
694 extern int drmHandleEvent( int fd, drmEventContextPtr evctx );
\r
696 extern char *drmGetDeviceNameFromFd( int fd );
\r
697 extern int drmGetNodeTypeFromFd( int fd );
\r
699 extern int drmPrimeHandleToFD( int fd, uint32_t handle, uint32_t flags, int *prime_fd );
\r
700 extern int drmPrimeFDToHandle( int fd, int prime_fd, uint32_t *handle );
\r
702 extern char *drmGetPrimaryDeviceNameFromFd( int fd );
\r
703 extern char *drmGetRenderDeviceNameFromFd( int fd );
\r
705 #define DRM_BUS_PCI 0
\r
707 typedef struct _drmPciBusInfo {
\r
712 } drmPciBusInfo, *drmPciBusInfoPtr;
\r
714 typedef struct _drmPciDeviceInfo {
\r
715 uint16_t vendor_id;
\r
716 uint16_t device_id;
\r
717 uint16_t subvendor_id;
\r
718 uint16_t subdevice_id;
\r
719 uint8_t revision_id;
\r
720 } drmPciDeviceInfo, *drmPciDeviceInfoPtr;
\r
722 typedef struct _drmDevice {
\r
723 char **nodes; /* DRM_NODE_MAX sized array */
\r
724 int available_nodes; /* DRM_NODE_* bitmask */
\r
727 drmPciBusInfoPtr pci;
\r
730 drmPciDeviceInfoPtr pci;
\r
732 } drmDevice, *drmDevicePtr;
\r
734 extern int drmGetDevice( int fd, drmDevicePtr *device );
\r
735 extern void drmFreeDevice( drmDevicePtr *device );
\r
737 extern int drmGetDevices( drmDevicePtr devices[], int max_devices );
\r
738 extern void drmFreeDevices( drmDevicePtr devices[], int count );
\r
740 #if defined(__cplusplus)
\r