Back to index

libdrm  2.4.37
Classes | Defines | Typedefs | Enumerations | Functions
xf86drm.h File Reference

OS-independent header for DRM user-level library interface. More...

#include <stdarg.h>
#include <sys/types.h>
#include <stdint.h>
#include <drm.h>
#include <sys/ioccom.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _drmServerInfo
struct  drmHashEntry
struct  _drmVersion
 Driver version information. More...
struct  _drmStats
struct  _drmBufDesc
struct  _drmBufInfo
struct  _drmBuf
struct  _drmBufMap
 Buffer mapping information. More...
struct  _drmLock
struct  _drmDMAReq
 Indices here refer to the offset into list in drmBufInfo. More...
struct  _drmRegion
struct  _drmTextureRegion
struct  _drmVBlankReq
struct  _drmVBlankReply
union  _drmVBlank
struct  _drmSetVersion
struct  _drmEventContext
struct  _drmStats.data

Defines

#define DRM_MAX_MINOR   16
#define DRM_IOCTL_NR(n)   ((n) & 0xff)
#define DRM_IOC_VOID   IOC_VOID
#define DRM_IOC_READ   IOC_OUT
#define DRM_IOC_WRITE   IOC_IN
#define DRM_IOC_READWRITE   IOC_INOUT
#define DRM_IOC(dir, group, nr, size)   _IOC(dir, group, nr, size)
#define DRM_DEV_UID   0
#define DRM_DEV_GID   0
#define DRM_DEV_DIRMODE   (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
#define DRM_DEV_MODE   (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
#define DRM_DIR_NAME   "/dev/dri"
#define DRM_DEV_NAME   "%s/card%d"
#define DRM_CONTROL_DEV_NAME   "%s/controlD%d"
#define DRM_PROC_NAME   "/proc/dri/" /* For backward Linux compatibility */
#define DRM_ERR_NO_DEVICE   (-1001)
#define DRM_ERR_NO_ACCESS   (-1002)
#define DRM_ERR_NOT_ROOT   (-1003)
#define DRM_ERR_INVALID   (-1004)
#define DRM_ERR_NO_FD   (-1005)
#define DRM_AGP_NO_HANDLE   0
#define DRM_VBLANK_HIGH_CRTC_SHIFT   1
#define __drm_dummy_lock(lock)   (*(__volatile__ unsigned int *)lock)
#define DRM_LOCK_HELD   0x80000000U
 Hardware lock is held.
#define DRM_LOCK_CONT   0x40000000U
 Hardware lock is contended.
#define DRM_CAS(lock, old, new, ret)   do { ret=1; } while (0) /* FAST LOCK FAILS */
#define DRM_CAS_RESULT(_result)   char _result
#define DRM_LIGHT_LOCK(fd, lock, context)
#define DRM_LIGHT_LOCK_COUNT(fd, lock, context, count)
#define DRM_LOCK(fd, lock, context, flags)
#define DRM_UNLOCK(fd, lock, context)
#define DRM_SPINLOCK(spin, val)
#define DRM_SPINLOCK_TAKE(spin, val)
#define DRM_SPINLOCK_COUNT(spin, val, count, __ret)
#define DRM_SPINUNLOCK(spin, val)
#define DRM_EVENT_CONTEXT_VERSION   2

Typedefs

typedef unsigned int drmSize
typedef unsigned int * drmSizePtr
 For mapped regions.
typedef void * drmAddress
typedef void ** drmAddressPtr
 For mapped regions.
typedef struct _drmServerInfo drmServerInfo
typedef struct _drmServerInfodrmServerInfoPtr
typedef struct drmHashEntry drmHashEntry
typedef struct _drmVersion drmVersion
 Driver version information.
typedef struct _drmVersiondrmVersionPtr
typedef struct _drmStats drmStatsT
typedef enum drm_context_tFlagsdrm_context_tFlagsPtr
typedef struct _drmBufDesc drmBufDesc
typedef struct _drmBufDescdrmBufDescPtr
typedef struct _drmBufInfo drmBufInfo
typedef struct _drmBufInfodrmBufInfoPtr
typedef struct _drmBuf drmBuf
typedef struct _drmBufdrmBufPtr
typedef struct _drmBufMap drmBufMap
 Buffer mapping information.
typedef struct _drmBufMapdrmBufMapPtr
typedef struct _drmLock drmLock
typedef struct _drmLockdrmLockPtr
typedef struct _drmDMAReq drmDMAReq
 Indices here refer to the offset into list in drmBufInfo.
typedef struct _drmDMAReqdrmDMAReqPtr
typedef struct _drmRegion drmRegion
typedef struct _drmRegiondrmRegionPtr
typedef struct _drmTextureRegion drmTextureRegion
typedef struct _drmTextureRegiondrmTextureRegionPtr
typedef struct _drmVBlankReq drmVBlankReq
typedef struct _drmVBlankReqdrmVBlankReqPtr
typedef struct _drmVBlankReply drmVBlankReply
typedef struct _drmVBlankReplydrmVBlankReplyPtr
typedef union _drmVBlank drmVBlank
typedef union _drmVBlankdrmVBlankPtr
typedef struct _drmSetVersion drmSetVersion
typedef struct _drmSetVersiondrmSetVersionPtr
typedef struct _drmEventContext drmEventContext
typedef struct _drmEventContextdrmEventContextPtr

Enumerations

enum  drmMapType {
  DRM_FRAME_BUFFER = 0, DRM_REGISTERS = 1, DRM_SHM = 2, DRM_AGP = 3,
  DRM_SCATTER_GATHER = 4, DRM_CONSISTENT = 5
}
enum  drmMapFlags {
  DRM_RESTRICTED = 0x0001, DRM_READ_ONLY = 0x0002, DRM_LOCKED = 0x0004, DRM_KERNEL = 0x0008,
  DRM_WRITE_COMBINING = 0x0010, DRM_CONTAINS_LOCK = 0x0020, DRM_REMOVABLE = 0x0040
}
enum  drmDMAFlags {
  DRM_DMA_BLOCK = 0x01, DRM_DMA_WHILE_LOCKED = 0x02, DRM_DMA_PRIORITY = 0x04, DRM_DMA_WAIT = 0x10,
  DRM_DMA_SMALLER_OK = 0x20, DRM_DMA_LARGER_OK = 0x40
}
enum  drmBufDescFlags {
  DRM_PAGE_ALIGN = 0x01, DRM_AGP_BUFFER = 0x02, DRM_SG_BUFFER = 0x04, DRM_FB_BUFFER = 0x08,
  DRM_PCI_BUFFER_RO = 0x10
}
enum  drmLockFlags {
  DRM_LOCK_READY = 0x01, DRM_LOCK_QUIESCENT = 0x02, DRM_LOCK_FLUSH = 0x04, DRM_LOCK_FLUSH_ALL = 0x08,
  DRM_HALT_ALL_QUEUES = 0x10, DRM_HALT_CUR_QUEUES = 0x20
}
enum  drm_context_tFlags { DRM_CONTEXT_PRESERVED = 0x01, DRM_CONTEXT_2DONLY = 0x02 }
enum  drmVBlankSeqType {
  DRM_VBLANK_ABSOLUTE = 0x0, DRM_VBLANK_RELATIVE = 0x1, DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e, DRM_VBLANK_EVENT = 0x4000000,
  DRM_VBLANK_FLIP = 0x8000000, DRM_VBLANK_NEXTONMISS = 0x10000000, DRM_VBLANK_SECONDARY = 0x20000000, DRM_VBLANK_SIGNAL = 0x40000000
}

Functions

int drmIoctl (int fd, unsigned long request, void *arg)
 Call ioctl, restarting if it is interupted.
void * drmGetHashTable (void)
drmHashEntrydrmGetEntry (int fd)
int drmAvailable (void)
 Determine whether the DRM kernel driver has been loaded.
int drmOpen (const char *name, const char *busid)
 Open the DRM device.
int drmOpenControl (int minor)
int drmClose (int fd)
 Close the device.
drmVersionPtr drmGetVersion (int fd)
 Query the driver version information.
drmVersionPtr drmGetLibVersion (int fd)
 Get version information for the DRM user space library.
int drmGetCap (int fd, uint64_t capability, uint64_t *value)
void drmFreeVersion (drmVersionPtr)
 Free the version information returned by drmGetVersion().
int drmGetMagic (int fd, drm_magic_t *magic)
char * drmGetBusid (int fd)
 Get the bus ID of the device.
int drmGetInterruptFromBusID (int fd, int busnum, int devnum, int funcnum)
 Get IRQ from bus ID.
int drmGetMap (int fd, int idx, drm_handle_t *offset, drmSize *size, drmMapType *type, drmMapFlags *flags, drm_handle_t *handle, int *mtrr)
int drmGetClient (int fd, int idx, int *auth, int *pid, int *uid, unsigned long *magic, unsigned long *iocs)
int drmGetStats (int fd, drmStatsT *stats)
int drmSetInterfaceVersion (int fd, drmSetVersion *version)
 Issue a set-version ioctl.
int drmCommandNone (int fd, unsigned long drmCommandIndex)
 Send a device-specific command.
int drmCommandRead (int fd, unsigned long drmCommandIndex, void *data, unsigned long size)
 Send a device-specific read command.
int drmCommandWrite (int fd, unsigned long drmCommandIndex, void *data, unsigned long size)
 Send a device-specific write command.
int drmCommandWriteRead (int fd, unsigned long drmCommandIndex, void *data, unsigned long size)
 Send a device-specific read-write command.
void drmFreeBusid (const char *busid)
 Free the bus ID information.
int drmSetBusid (int fd, const char *busid)
 Set the bus ID of the device.
int drmAuthMagic (int fd, drm_magic_t magic)
int drmAddMap (int fd, drm_handle_t offset, drmSize size, drmMapType type, drmMapFlags flags, drm_handle_t *handle)
 Specifies a range of memory that is available for mapping by a non-root process.
int drmRmMap (int fd, drm_handle_t handle)
int drmAddContextPrivateMapping (int fd, drm_context_t ctx_id, drm_handle_t handle)
int drmAddBufs (int fd, int count, int size, drmBufDescFlags flags, int agp_offset)
 Make buffers available for DMA transfers.
int drmMarkBufs (int fd, double low, double high)
int drmCreateContext (int fd, drm_context_t *handle)
 Create context.
int drmSetContextFlags (int fd, drm_context_t context, drm_context_tFlags flags)
int drmGetContextFlags (int fd, drm_context_t context, drm_context_tFlagsPtr flags)
int drmAddContextTag (int fd, drm_context_t context, void *tag)
int drmDelContextTag (int fd, drm_context_t context)
void * drmGetContextTag (int fd, drm_context_t context)
drm_context_tdrmGetReservedContextList (int fd, int *count)
void drmFreeReservedContextList (drm_context_t *)
int drmSwitchToContext (int fd, drm_context_t context)
int drmDestroyContext (int fd, drm_context_t handle)
 Destroy context.
int drmCreateDrawable (int fd, drm_drawable_t *handle)
int drmDestroyDrawable (int fd, drm_drawable_t handle)
int drmUpdateDrawableInfo (int fd, drm_drawable_t handle, drm_drawable_info_type_t type, unsigned int num, void *data)
int drmCtlInstHandler (int fd, int irq)
 Install IRQ handler.
int drmCtlUninstHandler (int fd)
 Uninstall IRQ handler.
int drmMap (int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
 Map a region of memory.
int drmUnmap (drmAddress address, drmSize size)
 Unmap mappings obtained with drmMap().
drmBufInfoPtr drmGetBufInfo (int fd)
drmBufMapPtr drmMapBufs (int fd)
 Map all DMA buffers into client-virtual space.
int drmUnmapBufs (drmBufMapPtr bufs)
 Unmap buffers allocated with drmMapBufs().
int drmDMA (int fd, drmDMAReqPtr request)
 Reserve DMA buffers.
int drmFreeBufs (int fd, int count, int *list)
 Free buffers.
int drmGetLock (int fd, drm_context_t context, drmLockFlags flags)
 Obtain heavyweight hardware lock.
int drmUnlock (int fd, drm_context_t context)
 Release the hardware lock.
int drmFinish (int fd, int context, drmLockFlags flags)
int drmGetContextPrivateMapping (int fd, drm_context_t ctx_id, drm_handle_t *handle)
int drmAgpAcquire (int fd)
 Acquire the AGP device.
int drmAgpRelease (int fd)
 Release the AGP device.
int drmAgpEnable (int fd, unsigned long mode)
 Set the AGP mode.
int drmAgpAlloc (int fd, unsigned long size, unsigned long type, unsigned long *address, drm_handle_t *handle)
 Allocate a chunk of AGP memory.
int drmAgpFree (int fd, drm_handle_t handle)
 Free a chunk of AGP memory.
int drmAgpBind (int fd, drm_handle_t handle, unsigned long offset)
 Bind a chunk of AGP memory.
int drmAgpUnbind (int fd, drm_handle_t handle)
 Unbind a chunk of AGP memory.
int drmAgpVersionMajor (int fd)
 Get AGP driver major version number.
int drmAgpVersionMinor (int fd)
 Get AGP driver minor version number.
unsigned long drmAgpGetMode (int fd)
 Get AGP mode.
unsigned long drmAgpBase (int fd)
 Get AGP aperture base.
unsigned long drmAgpSize (int fd)
 Get AGP aperture size.
unsigned long drmAgpMemoryUsed (int fd)
 Get used AGP memory.
unsigned long drmAgpMemoryAvail (int fd)
 Get available AGP memory.
unsigned int drmAgpVendorId (int fd)
 Get hardware vendor ID.
unsigned int drmAgpDeviceId (int fd)
 Get hardware device ID.
int drmScatterGatherAlloc (int fd, unsigned long size, drm_handle_t *handle)
int drmScatterGatherFree (int fd, drm_handle_t handle)
int drmWaitVBlank (int fd, drmVBlankPtr vbl)
 Wait for VBLANK.
void drmSetServerInfo (drmServerInfoPtr info)
int drmError (int err, const char *label)
void * drmMalloc (int size)
void drmFree (void *pt)
void * drmHashCreate (void)
int drmHashDestroy (void *t)
int drmHashLookup (void *t, unsigned long key, void **value)
int drmHashInsert (void *t, unsigned long key, void *value)
int drmHashDelete (void *t, unsigned long key)
int drmHashFirst (void *t, unsigned long *key, void **value)
int drmHashNext (void *t, unsigned long *key, void **value)
void * drmRandomCreate (unsigned long seed)
int drmRandomDestroy (void *state)
unsigned long drmRandom (void *state)
double drmRandomDouble (void *state)
void * drmSLCreate (void)
int drmSLDestroy (void *l)
int drmSLLookup (void *l, unsigned long key, void **value)
int drmSLInsert (void *l, unsigned long key, void *value)
int drmSLDelete (void *l, unsigned long key)
int drmSLNext (void *l, unsigned long *key, void **value)
int drmSLFirst (void *l, unsigned long *key, void **value)
void drmSLDump (void *l)
int drmSLLookupNeighbors (void *l, unsigned long key, unsigned long *prev_key, void **prev_value, unsigned long *next_key, void **next_value)
int drmOpenOnce (void *unused, const char *BusID, int *newlyopened)
void drmCloseOnce (int fd)
void drmMsg (const char *format,...)
int drmSetMaster (int fd)
int drmDropMaster (int fd)
int drmHandleEvent (int fd, drmEventContextPtr evctx)
char * drmGetDeviceNameFromFd (int fd)

Detailed Description

OS-independent header for DRM user-level library interface.

Author:
Rickard E. (Rik) Faith faith.nosp@m.@val.nosp@m.inux..nosp@m.com

Definition in file xf86drm.h.


Class Documentation

struct _drmVersion

Driver version information.

See also:
drmGetVersion() and drmSetVersion().

Definition at line 116 of file xf86drm.h.

Class Members
char * date User-space buffer to hold date.
int date_len Length of date buffer.
char * desc User-space buffer to hold desc.
int desc_len Length of desc buffer.
char * name Name of driver.
int name_len Length of name buffer.
int version_major Major version.
int version_minor Minor version.
int version_patchlevel Patch level.
struct _drmStats

Definition at line 128 of file xf86drm.h.

Class Members
unsigned long count Number of data.
struct _drmStats data
struct _drmBufDesc

Definition at line 221 of file xf86drm.h.

Class Members
int count Number of buffers of this size.
int high_mark High water mark.
int low_mark Low water mark.
int size Size in bytes.
struct _drmBufInfo

Definition at line 228 of file xf86drm.h.

Collaboration diagram for _drmBufInfo:
Class Members
int count Number of buffers described in list.
drmBufDescPtr list List of buffer descriptions.
struct _drmBuf

Definition at line 233 of file xf86drm.h.

Class Members
drmAddress address Address.
int idx Index into the master buffer list.
int total Buffer size.
int used Amount of buffer in use (for DMA)
struct _drmBufMap

Buffer mapping information.

Used by drmMapBufs() and drmUnmapBufs() to store information about the mapped buffers.

Definition at line 246 of file xf86drm.h.

Collaboration diagram for _drmBufMap:
Class Members
int count Number of buffers mapped.
drmBufPtr list Buffers.
struct _drmLock

Definition at line 251 of file xf86drm.h.

Class Members
volatile unsigned int lock
char padding
struct _drmDMAReq

Indices here refer to the offset into list in drmBufInfo.

Definition at line 271 of file xf86drm.h.

Class Members
drm_context_t context Context handle.
drmDMAFlags flags Flags.
int granted_count Number of buffers granted at this size.
int request_count Number of buffers requested.
int * request_list Buffer information.
int request_size Desired size of buffers requested.
int * request_sizes Minimum acceptable sizes.
int send_count Number of buffers to send.
int * send_list List of handles to buffers.
int * send_sizes Lengths of data to send, in bytes.
struct _drmRegion

Definition at line 284 of file xf86drm.h.

Class Members
drm_handle_t handle
drmAddress map
unsigned int offset
drmSize size
struct _drmTextureRegion

Definition at line 291 of file xf86drm.h.

Class Members
unsigned int age
unsigned char in_use
unsigned char next
unsigned char padding Explicitly pad this out.
unsigned char prev
struct _drmVBlankReq

Definition at line 313 of file xf86drm.h.

Class Members
unsigned int sequence
unsigned long signal
drmVBlankSeqType type
struct _drmVBlankReply

Definition at line 319 of file xf86drm.h.

Class Members
unsigned int sequence
long tval_sec
long tval_usec
drmVBlankSeqType type
union _drmVBlank

Definition at line 326 of file xf86drm.h.

Collaboration diagram for _drmVBlank:
Class Members
drmVBlankReply reply
drmVBlankReq request
struct _drmSetVersion

Definition at line 331 of file xf86drm.h.

Class Members
int drm_dd_major
int drm_dd_minor
int drm_di_major
int drm_di_minor
struct _drmStats.data

Definition at line 130 of file xf86drm.h.

Class Members
int isvalue True if value (vs. counter)
const char * long_format Suggested format for long_name.
const char * long_name Long name for value.
int mult Multiplier value (e.g., 1024)
const char * mult_names Multiplier names (e.g., "KGM")
const char * rate_format Suggested format for rate_name.
const char * rate_name Short name for value per second.
unsigned long value Value from kernel.
int verbose Suggest only in verbose output.

Define Documentation

#define __drm_dummy_lock (   lock)    (*(__volatile__ unsigned int *)lock)

Definition at line 338 of file xf86drm.h.

#define DRM_AGP_NO_HANDLE   0

Definition at line 90 of file xf86drm.h.

#define DRM_CAS (   lock,
  old,
  new,
  ret 
)    do { ret=1; } while (0) /* FAST LOCK FAILS */

Definition at line 462 of file xf86drm.h.

#define DRM_CAS_RESULT (   _result)    char _result

Definition at line 470 of file xf86drm.h.

#define DRM_CONTROL_DEV_NAME   "%s/controlD%d"

Definition at line 81 of file xf86drm.h.

#define DRM_DEV_DIRMODE   (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)

Definition at line 75 of file xf86drm.h.

#define DRM_DEV_GID   0

Definition at line 73 of file xf86drm.h.

#define DRM_DEV_MODE   (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)

Definition at line 77 of file xf86drm.h.

#define DRM_DEV_NAME   "%s/card%d"

Definition at line 80 of file xf86drm.h.

#define DRM_DEV_UID   0

Definition at line 72 of file xf86drm.h.

#define DRM_DIR_NAME   "/dev/dri"

Definition at line 79 of file xf86drm.h.

#define DRM_ERR_INVALID   (-1004)

Definition at line 87 of file xf86drm.h.

#define DRM_ERR_NO_ACCESS   (-1002)

Definition at line 85 of file xf86drm.h.

#define DRM_ERR_NO_DEVICE   (-1001)

Definition at line 84 of file xf86drm.h.

#define DRM_ERR_NO_FD   (-1005)

Definition at line 88 of file xf86drm.h.

#define DRM_ERR_NOT_ROOT   (-1003)

Definition at line 86 of file xf86drm.h.

#define DRM_EVENT_CONTEXT_VERSION   2

Definition at line 704 of file xf86drm.h.

#define DRM_IOC (   dir,
  group,
  nr,
  size 
)    _IOC(dir, group, nr, size)

Definition at line 67 of file xf86drm.h.

#define DRM_IOC_READ   IOC_OUT

Definition at line 64 of file xf86drm.h.

#define DRM_IOC_READWRITE   IOC_INOUT

Definition at line 66 of file xf86drm.h.

#define DRM_IOC_VOID   IOC_VOID

Definition at line 63 of file xf86drm.h.

#define DRM_IOC_WRITE   IOC_IN

Definition at line 65 of file xf86drm.h.

#define DRM_IOCTL_NR (   n)    ((n) & 0xff)

Definition at line 62 of file xf86drm.h.

#define DRM_LIGHT_LOCK (   fd,
  lock,
  context 
)
Value:
do {                                                           \
                DRM_CAS_RESULT(__ret);                                 \
              DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
                if (__ret) drmGetLock(fd,context,0);                   \
        } while(0)

Definition at line 473 of file xf86drm.h.

#define DRM_LIGHT_LOCK_COUNT (   fd,
  lock,
  context,
  count 
)
Value:
do {                                                           \
                DRM_CAS_RESULT(__ret);                                 \
              DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
                if (__ret) drmGetLock(fd,context,0);                   \
                else       ++count;                                    \
        } while(0)

Definition at line 482 of file xf86drm.h.

#define DRM_LOCK (   fd,
  lock,
  context,
  flags 
)
Value:
do {                                                           \
              if (flags) drmGetLock(fd,context,flags);               \
              else       DRM_LIGHT_LOCK(fd,lock,context);            \
       } while(0)

Definition at line 490 of file xf86drm.h.

#define DRM_LOCK_CONT   0x40000000U

Hardware lock is contended.

Definition at line 341 of file xf86drm.h.

#define DRM_LOCK_HELD   0x80000000U

Hardware lock is held.

Definition at line 340 of file xf86drm.h.

#define DRM_MAX_MINOR   16

Definition at line 47 of file xf86drm.h.

#define DRM_PROC_NAME   "/proc/dri/" /* For backward Linux compatibility */

Definition at line 82 of file xf86drm.h.

#define DRM_SPINLOCK (   spin,
  val 
)
Value:
do {                                                           \
            DRM_CAS_RESULT(__ret);                                     \
           do {                                                       \
              DRM_CAS(spin,0,val,__ret);                             \
              if (__ret) while ((spin)->lock);                       \
           } while (__ret);                                           \
       } while(0)

Definition at line 504 of file xf86drm.h.

#define DRM_SPINLOCK_COUNT (   spin,
  val,
  count,
  __ret 
)
Value:
do {                                                           \
            int  __i;                                                  \
            __ret = 1;                                                 \
            for (__i = 0; __ret && __i < count; __i++) {               \
              DRM_CAS(spin,0,val,__ret);                             \
              if (__ret) for (;__i < count && (spin)->lock; __i++);  \
           }                                                          \
       } while(0)

Definition at line 523 of file xf86drm.h.

#define DRM_SPINLOCK_TAKE (   spin,
  val 
)
Value:
do {                                                           \
            DRM_CAS_RESULT(__ret);                                     \
            int  cur;                                                  \
           do {                                                       \
                cur = (*spin).lock;                                    \
              DRM_CAS(spin,cur,val,__ret);                           \
           } while (__ret);                                           \
       } while(0)

Definition at line 513 of file xf86drm.h.

#define DRM_SPINUNLOCK (   spin,
  val 
)
Value:
do {                                                           \
            DRM_CAS_RESULT(__ret);                                     \
            if ((*spin).lock == val) { /* else server stole lock */    \
               do {                                                   \
                  DRM_CAS(spin,val,0,__ret);                         \
               } while (__ret);                                       \
            }                                                          \
       } while(0)

Definition at line 533 of file xf86drm.h.

#define DRM_UNLOCK (   fd,
  lock,
  context 
)
Value:
do {                                                           \
                DRM_CAS_RESULT(__ret);                                 \
              DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret);     \
                if (__ret) drmUnlock(fd,context);                      \
        } while(0)

Definition at line 496 of file xf86drm.h.

Definition at line 311 of file xf86drm.h.


Typedef Documentation

typedef void* drmAddress

Definition at line 93 of file xf86drm.h.

typedef void ** drmAddressPtr

For mapped regions.

Definition at line 93 of file xf86drm.h.

typedef struct _drmBuf drmBuf
typedef struct _drmBufDesc drmBufDesc
typedef struct _drmBufDesc * drmBufDescPtr
typedef struct _drmBufInfo drmBufInfo
typedef struct _drmBufInfo * drmBufInfoPtr
typedef struct _drmBufMap drmBufMap

Buffer mapping information.

Used by drmMapBufs() and drmUnmapBufs() to store information about the mapped buffers.

typedef struct _drmBufMap * drmBufMapPtr
typedef struct _drmBuf * drmBufPtr
typedef struct _drmDMAReq drmDMAReq

Indices here refer to the offset into list in drmBufInfo.

typedef struct _drmDMAReq * drmDMAReqPtr
typedef struct drmHashEntry drmHashEntry
typedef struct _drmLock drmLock
typedef struct _drmLock * drmLockPtr
typedef struct _drmRegion drmRegion
typedef struct _drmRegion * drmRegionPtr
typedef struct _drmServerInfo drmServerInfo
typedef struct _drmServerInfo * drmServerInfoPtr
typedef struct _drmSetVersion drmSetVersion
typedef struct _drmSetVersion * drmSetVersionPtr
typedef unsigned int drmSize

Definition at line 92 of file xf86drm.h.

typedef unsigned int * drmSizePtr

For mapped regions.

Definition at line 92 of file xf86drm.h.

typedef struct _drmStats drmStatsT
typedef union _drmVBlank drmVBlank
typedef union _drmVBlank * drmVBlankPtr
typedef struct _drmVBlankReq drmVBlankReq
typedef struct _drmVBlankReq * drmVBlankReqPtr
typedef struct _drmVersion drmVersion

Driver version information.

See also:
drmGetVersion() and drmSetVersion().
typedef struct _drmVersion * drmVersionPtr

Enumeration Type Documentation

Enumerator:
DRM_CONTEXT_PRESERVED 

This context is preserved and never swapped.

DRM_CONTEXT_2DONLY 

This context is for 2D rendering only.

Definition at line 215 of file xf86drm.h.

Enumerator:
DRM_PAGE_ALIGN 
DRM_AGP_BUFFER 
DRM_SG_BUFFER 
DRM_FB_BUFFER 
DRM_PCI_BUFFER_RO 

Definition at line 195 of file xf86drm.h.

Warning:
These values MUST match drm.h
Enumerator:
DRM_DMA_BLOCK 

Block until buffer dispatched.

Note:
the buffer may not yet have been processed by the hardware -- getting a hardware lock with the hardware quiescent will ensure that the buffer has been processed.
DRM_DMA_WHILE_LOCKED 

Dispatch while lock held.

DRM_DMA_PRIORITY 

High priority dispatch.

DRM_DMA_WAIT 

Wait for free buffers.

DRM_DMA_SMALLER_OK 

Smaller-than-requested buffers OK.

DRM_DMA_LARGER_OK 

Larger-than-requested buffers OK.

Definition at line 171 of file xf86drm.h.

Enumerator:
DRM_LOCK_READY 

Wait until hardware is ready for DMA.

DRM_LOCK_QUIESCENT 

Wait until hardware quiescent.

DRM_LOCK_FLUSH 

Flush this context's DMA queue first.

DRM_LOCK_FLUSH_ALL 

Flush all DMA queues first.

DRM_HALT_ALL_QUEUES 

Halt all current and future queues.

DRM_HALT_CUR_QUEUES 

Halt all current queues.

Definition at line 203 of file xf86drm.h.

             {
    DRM_LOCK_READY      = 0x01, 
    DRM_LOCK_QUIESCENT  = 0x02, 
    DRM_LOCK_FLUSH      = 0x04, 
    DRM_LOCK_FLUSH_ALL  = 0x08, 
                            /* These *HALT* flags aren't supported yet
                                   -- they will be used to support the
                                   full-screen DGA-like mode. */
    DRM_HALT_ALL_QUEUES = 0x10, 
    DRM_HALT_CUR_QUEUES = 0x20  
} drmLockFlags;
Enumerator:
DRM_RESTRICTED 

Cannot be mapped to client-virtual.

DRM_READ_ONLY 

Read-only in client-virtual.

DRM_LOCKED 

Physical pages locked.

DRM_KERNEL 

Kernel requires access.

DRM_WRITE_COMBINING 

Use write-combining, if available.

DRM_CONTAINS_LOCK 

SHM page that contains lock.

DRM_REMOVABLE 

Removable mapping.

Definition at line 158 of file xf86drm.h.

             {
    DRM_RESTRICTED      = 0x0001, 
    DRM_READ_ONLY       = 0x0002, 
    DRM_LOCKED          = 0x0004, 
    DRM_KERNEL          = 0x0008, 
    DRM_WRITE_COMBINING = 0x0010, 
    DRM_CONTAINS_LOCK   = 0x0020, 
    DRM_REMOVABLE    = 0x0040  
} drmMapFlags;
enum drmMapType
Enumerator:
DRM_FRAME_BUFFER 

WC, no caching, no core dump.

DRM_REGISTERS 

no caching, no core dump

DRM_SHM 

shared, cached

DRM_AGP 

AGP/GART.

DRM_SCATTER_GATHER 

PCI scatter/gather.

DRM_CONSISTENT 

PCI consistent.

Definition at line 149 of file xf86drm.h.

Enumerator:
DRM_VBLANK_ABSOLUTE 

Wait for specific vblank sequence number.

DRM_VBLANK_RELATIVE 

Wait for given number of vblanks.

DRM_VBLANK_HIGH_CRTC_MASK 
DRM_VBLANK_EVENT 

Send event instead of blocking.

DRM_VBLANK_FLIP 

Scheduled buffer swap should flip.

DRM_VBLANK_NEXTONMISS 

If missed, wait for next vblank.

DRM_VBLANK_SECONDARY 

Secondary display controller.

DRM_VBLANK_SIGNAL 

Definition at line 300 of file xf86drm.h.

             {
    DRM_VBLANK_ABSOLUTE = 0x0,     
    DRM_VBLANK_RELATIVE = 0x1,     
    /* bits 1-6 are reserved for high crtcs */
    DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
    DRM_VBLANK_EVENT = 0x4000000,  
    DRM_VBLANK_FLIP = 0x8000000,   
    DRM_VBLANK_NEXTONMISS = 0x10000000,   
    DRM_VBLANK_SECONDARY = 0x20000000,    
    DRM_VBLANK_SIGNAL   = 0x40000000      /* Send signal instead of blocking */
} drmVBlankSeqType;

Function Documentation

int drmAddBufs ( int  fd,
int  count,
int  size,
drmBufDescFlags  flags,
int  agp_offset 
)

Make buffers available for DMA transfers.

Parameters:
fdfile descriptor.
countnumber of buffers.
sizesize of each buffer.
flagsbuffer allocation flags.
agp_offsetoffset in the AGP aperture
Returns:
number of buffers allocated, negative on error.

This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.

See also:
drm_buf_desc.

Definition at line 1010 of file xf86drm.c.

{
    drm_buf_desc_t request;

    request.count     = count;
    request.size      = size;
    request.low_mark  = 0;
    request.high_mark = 0;
    request.flags     = flags;
    request.agp_start = agp_offset;

    if (drmIoctl(fd, DRM_IOCTL_ADD_BUFS, &request))
       return -errno;
    return request.count;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmAddContextPrivateMapping ( int  fd,
drm_context_t  ctx_id,
drm_handle_t  handle 
)

Definition at line 2117 of file xf86drm.c.

{
    drm_ctx_priv_map_t map;

    map.ctx_id = ctx_id;
    map.handle = (void *)(uintptr_t)handle;

    if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmAddContextTag ( int  fd,
drm_context_t  context,
void *  tag 
)

Definition at line 2088 of file xf86drm.c.

{
    drmHashEntry  *entry = drmGetEntry(fd);

    if (drmHashInsert(entry->tagTable, context, tag)) {
       drmHashDelete(entry->tagTable, context);
       drmHashInsert(entry->tagTable, context, tag);
    }
    return 0;
}

Here is the call graph for this function:

int drmAddMap ( int  fd,
drm_handle_t  offset,
drmSize  size,
drmMapType  type,
drmMapFlags  flags,
drm_handle_t handle 
)

Specifies a range of memory that is available for mapping by a non-root process.

Parameters:
fdfile descriptor.
offsetusually the physical address. The actual meaning depends of the type parameter. See below.
sizeof the memory in bytes.
typetype of the memory to be mapped.
flagscombination of several flags to modify the function actions.
handlewill be set to a value that may be used as the offset parameter for mmap().
Returns:
zero on success or a negative value on error.
Mapping the frame buffer
For the frame buffer
  • offset will be the physical address of the start of the frame buffer,
  • size will be the size of the frame buffer in bytes, and
  • type will be DRM_FRAME_BUFFER.
The area mapped will be uncached. If MTRR support is available in the kernel, the frame buffer area will be set to write combining.
Mapping the MMIO register area
For the MMIO register area,
  • offset will be the physical address of the start of the register area,
  • size will be the size of the register area bytes, and
  • type will be DRM_REGISTERS.
The area mapped will be uncached.
Mapping the SAREA
For the SAREA,
  • offset will be ignored and should be set to zero,
  • size will be the desired size of the SAREA in bytes,
  • type will be DRM_SHM.
A shared memory area of the requested size will be created and locked in kernel memory. This area may be mapped into client-space by using the handle returned.
Note:
May only be called by root.

This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing the arguments in a drm_map structure.

Definition at line 966 of file xf86drm.c.

{
    drm_map_t map;

    map.offset  = offset;
    map.size    = size;
    map.handle  = 0;
    map.type    = type;
    map.flags   = flags;
    if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map))
       return -errno;
    if (handle)
       *handle = (drm_handle_t)(uintptr_t)map.handle;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmAgpAcquire ( int  fd)

Acquire the AGP device.

Must be called before any of the other AGP related calls.

Parameters:
fdfile descriptor.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.

Definition at line 1563 of file xf86drm.c.

{
    if (drmIoctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmAgpAlloc ( int  fd,
unsigned long  size,
unsigned long  type,
unsigned long *  address,
drm_handle_t handle 
)

Allocate a chunk of AGP memory.

Parameters:
fdfile descriptor.
sizerequested memory size in bytes. Will be rounded to page boundary.
typetype of memory to allocate.
addressif not zero, will be set to the physical address of the allocated memory.
handleon success will be set to a handle of the allocated memory.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the arguments in a drm_agp_buffer structure.

Definition at line 1628 of file xf86drm.c.

{
    drm_agp_buffer_t b;

    *handle = DRM_AGP_NO_HANDLE;
    b.size   = size;
    b.handle = 0;
    b.type   = type;
    if (drmIoctl(fd, DRM_IOCTL_AGP_ALLOC, &b))
       return -errno;
    if (address != 0UL)
       *address = b.physical;
    *handle = b.handle;
    return 0;
}

Here is the call graph for this function:

unsigned long drmAgpBase ( int  fd)

Get AGP aperture base.

Parameters:
fdfile descriptor.
Returns:
aperture base on success, zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1793 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.aperture_base;
}

Here is the call graph for this function:

int drmAgpBind ( int  fd,
drm_handle_t  handle,
unsigned long  offset 
)

Bind a chunk of AGP memory.

Parameters:
fdfile descriptor.
handlehandle to the allocated memory, as given by drmAgpAllocate().
offsetoffset in bytes. It will round to page boundary.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the argument in a drm_agp_binding structure.

Definition at line 1683 of file xf86drm.c.

{
    drm_agp_binding_t b;

    b.handle = handle;
    b.offset = offset;
    if (drmIoctl(fd, DRM_IOCTL_AGP_BIND, &b))
       return -errno;
    return 0;
}

Here is the call graph for this function:

unsigned int drmAgpDeviceId ( int  fd)

Get hardware device ID.

Parameters:
fdfile descriptor.
Returns:
zero on success, or zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1898 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.id_device;
}

Here is the call graph for this function:

int drmAgpEnable ( int  fd,
unsigned long  mode 
)

Set the AGP mode.

Parameters:
fdfile descriptor.
modeAGP mode.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the argument in a drm_agp_mode structure.

Definition at line 1601 of file xf86drm.c.

{
    drm_agp_mode_t m;

    m.mode = mode;
    if (drmIoctl(fd, DRM_IOCTL_AGP_ENABLE, &m))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmAgpFree ( int  fd,
drm_handle_t  handle 
)

Free a chunk of AGP memory.

Parameters:
fdfile descriptor.
handlehandle to the allocated memory, as given by drmAgpAllocate().
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the argument in a drm_agp_buffer structure.

Definition at line 1658 of file xf86drm.c.

{
    drm_agp_buffer_t b;

    b.size   = 0;
    b.handle = handle;
    if (drmIoctl(fd, DRM_IOCTL_AGP_FREE, &b))
       return -errno;
    return 0;
}

Here is the call graph for this function:

unsigned long drmAgpGetMode ( int  fd)

Get AGP mode.

Parameters:
fdfile descriptor.
Returns:
mode on success, or zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1772 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.mode;
}

Here is the call graph for this function:

unsigned long drmAgpMemoryAvail ( int  fd)

Get available AGP memory.

Parameters:
fdfile descriptor.
Returns:
memory available on success, or zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1856 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.memory_allowed;
}

Here is the call graph for this function:

unsigned long drmAgpMemoryUsed ( int  fd)

Get used AGP memory.

Parameters:
fdfile descriptor.
Returns:
memory used on success, or zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1835 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.memory_used;
}

Here is the call graph for this function:

int drmAgpRelease ( int  fd)

Release the AGP device.

Parameters:
fdfile descriptor.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.

Definition at line 1581 of file xf86drm.c.

{
    if (drmIoctl(fd, DRM_IOCTL_AGP_RELEASE, NULL))
       return -errno;
    return 0;
}

Here is the call graph for this function:

unsigned long drmAgpSize ( int  fd)

Get AGP aperture size.

Parameters:
fdfile descriptor.
Returns:
aperture size on success, zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1814 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.aperture_size;
}

Here is the call graph for this function:

int drmAgpUnbind ( int  fd,
drm_handle_t  handle 
)

Unbind a chunk of AGP memory.

Parameters:
fdfile descriptor.
handlehandle to the allocated memory, as given by drmAgpAllocate().
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing the argument in a drm_agp_binding structure.

Definition at line 1707 of file xf86drm.c.

{
    drm_agp_binding_t b;

    b.handle = handle;
    b.offset = 0;
    if (drmIoctl(fd, DRM_IOCTL_AGP_UNBIND, &b))
       return -errno;
    return 0;
}

Here is the call graph for this function:

unsigned int drmAgpVendorId ( int  fd)

Get hardware vendor ID.

Parameters:
fdfile descriptor.
Returns:
vendor ID on success, or zero on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1877 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return 0;
    return i.id_vendor;
}

Here is the call graph for this function:

int drmAgpVersionMajor ( int  fd)

Get AGP driver major version number.

Parameters:
fdfile descriptor.
Returns:
major version number on success, or a negative value on failure..

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1730 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return -errno;
    return i.agp_version_major;
}

Here is the call graph for this function:

int drmAgpVersionMinor ( int  fd)

Get AGP driver minor version number.

Parameters:
fdfile descriptor.
Returns:
minor version number on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the necessary information in a drm_agp_info structure.

Definition at line 1751 of file xf86drm.c.

{
    drm_agp_info_t i;

    if (drmIoctl(fd, DRM_IOCTL_AGP_INFO, &i))
       return -errno;
    return i.agp_version_minor;
}

Here is the call graph for this function:

int drmAuthMagic ( int  fd,
drm_magic_t  magic 
)

Definition at line 906 of file xf86drm.c.

{
    drm_auth_t auth;

    auth.magic = magic;
    if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmAvailable ( void  )

Determine whether the DRM kernel driver has been loaded.

Returns:
1 if the DRM driver is loaded, 0 otherwise.

Determine the presence of the kernel driver by attempting to open the 0 minor and get version information. For backward compatibility with older Linux implementations, /proc/dri is also checked.

Definition at line 437 of file xf86drm.c.

{
    drmVersionPtr version;
    int           retval = 0;
    int           fd;

    if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) {
#ifdef __linux__
       /* Try proc for backward Linux compatibility */
       if (!access("/proc/dri/0", R_OK))
           return 1;
#endif
       return 0;
    }
    
    if ((version = drmGetVersion(fd))) {
       retval = 1;
       drmFreeVersion(version);
    }
    close(fd);

    return retval;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmClose ( int  fd)

Close the device.

Parameters:
fdfile descriptor.

This function closes the file descriptor.

Definition at line 1099 of file xf86drm.c.

{
    unsigned long key    = drmGetKeyFromFd(fd);
    drmHashEntry  *entry = drmGetEntry(fd);

    drmHashDestroy(entry->tagTable);
    entry->fd       = 0;
    entry->f        = NULL;
    entry->tagTable = NULL;

    drmHashDelete(drmHashTable, key);
    drmFree(entry);

    return close(fd);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void drmCloseOnce ( int  fd)

Definition at line 2491 of file xf86drm.c.

{
    int i;

    for (i = 0; i < nr_fds; i++) {
       if (fd == connection[i].fd) {
           if (--connection[i].refcount == 0) {
              drmClose(connection[i].fd);
              free(connection[i].BusID);
           
              if (i < --nr_fds) 
                  connection[i] = connection[nr_fds];

              return;
           }
       }
    }
}

Here is the call graph for this function:

int drmCommandNone ( int  fd,
unsigned long  drmCommandIndex 
)

Send a device-specific command.

Parameters:
fdfile descriptor.
drmCommandIndexcommand index
Returns:
zero on success, or a negative value on failure.

It issues a ioctl given by

 DRM_COMMAND_BASE + drmCommandIndex 

.

Definition at line 2350 of file xf86drm.c.

{
    void *data = NULL; /* dummy */
    unsigned long request;

    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);

    if (drmIoctl(fd, request, data)) {
       return -errno;
    }
    return 0;
}

Here is the call graph for this function:

int drmCommandRead ( int  fd,
unsigned long  drmCommandIndex,
void *  data,
unsigned long  size 
)

Send a device-specific read command.

Parameters:
fdfile descriptor.
drmCommandIndexcommand index
datadestination pointer of the data to be read.
sizesize of the data to be read.
Returns:
zero on success, or a negative value on failure.

It issues a read ioctl given by

 DRM_COMMAND_BASE + drmCommandIndex 

.

Definition at line 2378 of file xf86drm.c.

{
    unsigned long request;

    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 
       DRM_COMMAND_BASE + drmCommandIndex, size);

    if (drmIoctl(fd, request, data)) {
       return -errno;
    }
    return 0;
}

Here is the call graph for this function:

int drmCommandWrite ( int  fd,
unsigned long  drmCommandIndex,
void *  data,
unsigned long  size 
)

Send a device-specific write command.

Parameters:
fdfile descriptor.
drmCommandIndexcommand index
datasource pointer of the data to be written.
sizesize of the data to be written.
Returns:
zero on success, or a negative value on failure.

It issues a write ioctl given by

 DRM_COMMAND_BASE + drmCommandIndex 

.

Definition at line 2407 of file xf86drm.c.

{
    unsigned long request;

    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 
       DRM_COMMAND_BASE + drmCommandIndex, size);

    if (drmIoctl(fd, request, data)) {
       return -errno;
    }
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmCommandWriteRead ( int  fd,
unsigned long  drmCommandIndex,
void *  data,
unsigned long  size 
)

Send a device-specific read-write command.

Parameters:
fdfile descriptor.
drmCommandIndexcommand index
datasource pointer of the data to be read and written.
sizesize of the data to be read and written.
Returns:
zero on success, or a negative value on failure.

It issues a read-write ioctl given by

 DRM_COMMAND_BASE + drmCommandIndex 

.

Definition at line 2436 of file xf86drm.c.

{
    unsigned long request;

    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 
       DRM_COMMAND_BASE + drmCommandIndex, size);

    if (drmIoctl(fd, request, data))
       return -errno;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmCreateContext ( int  fd,
drm_context_t handle 
)

Create context.

Used by the X server during GLXContext initialization. This causes per-context kernel-level resources to be allocated.

Parameters:
fdfile descriptor.
handleis set on success. To be used by the client when requesting DMA dispatch with drmDMA().
Returns:
zero on success, or a negative value on failure.
Note:
May only be called by root.

This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the argument in a drm_ctx structure.

Definition at line 1432 of file xf86drm.c.

{
    drm_ctx_t ctx;

    ctx.flags = 0;   /* Modified with functions below */
    if (drmIoctl(fd, DRM_IOCTL_ADD_CTX, &ctx))
       return -errno;
    *handle = ctx.handle;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmCreateDrawable ( int  fd,
drm_drawable_t handle 
)

Definition at line 1516 of file xf86drm.c.

{
    drm_draw_t draw;
    if (drmIoctl(fd, DRM_IOCTL_ADD_DRAW, &draw))
       return -errno;
    *handle = draw.handle;
    return 0;
}

Here is the call graph for this function:

int drmCtlInstHandler ( int  fd,
int  irq 
)

Install IRQ handler.

Parameters:
fdfile descriptor.
irqIRQ number.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the argument in a drm_control structure.

Definition at line 2011 of file xf86drm.c.

{
    drm_control_t ctl;

    ctl.func  = DRM_INST_HANDLER;
    ctl.irq   = irq;
    if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmCtlUninstHandler ( int  fd)

Uninstall IRQ handler.

Parameters:
fdfile descriptor.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the argument in a drm_control structure.

Definition at line 2034 of file xf86drm.c.

{
    drm_control_t ctl;

    ctl.func  = DRM_UNINST_HANDLER;
    ctl.irq   = 0;
    if (drmIoctl(fd, DRM_IOCTL_CONTROL, &ctl))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmDelContextTag ( int  fd,
drm_context_t  context 
)

Definition at line 2099 of file xf86drm.c.

{
    drmHashEntry  *entry = drmGetEntry(fd);

    return drmHashDelete(entry->tagTable, context);
}

Here is the call graph for this function:

int drmDestroyContext ( int  fd,
drm_context_t  handle 
)

Destroy context.

Free any kernel-level resources allocated with drmCreateContext() associated with the context.

Parameters:
fdfile descriptor.
handlehandle given by drmCreateContext().
Returns:
zero on success, or a negative value on failure.
Note:
May only be called by root.

This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the argument in a drm_ctx structure.

Definition at line 1507 of file xf86drm.c.

{
    drm_ctx_t ctx;
    ctx.handle = handle;
    if (drmIoctl(fd, DRM_IOCTL_RM_CTX, &ctx))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmDestroyDrawable ( int  fd,
drm_drawable_t  handle 
)

Definition at line 1525 of file xf86drm.c.

{
    drm_draw_t draw;
    draw.handle = handle;
    if (drmIoctl(fd, DRM_IOCTL_RM_DRAW, &draw))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmDMA ( int  fd,
drmDMAReqPtr  request 
)

Reserve DMA buffers.

Parameters:
fdfile descriptor.
request
Returns:
zero on success, or a negative value on failure.

Assemble the arguments into a drm_dma structure and keeps issuing the DRM_IOCTL_DMA ioctl until success or until maximum number of retries.

Definition at line 1293 of file xf86drm.c.

{
    drm_dma_t dma;
    int ret, i = 0;

    dma.context         = request->context;
    dma.send_count      = request->send_count;
    dma.send_indices    = request->send_list;
    dma.send_sizes      = request->send_sizes;
    dma.flags           = request->flags;
    dma.request_count   = request->request_count;
    dma.request_size    = request->request_size;
    dma.request_indices = request->request_list;
    dma.request_sizes   = request->request_sizes;
    dma.granted_count   = 0;

    do {
       ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );

    if ( ret == 0 ) {
       request->granted_count = dma.granted_count;
       return 0;
    } else {
       return -errno;
    }
}

Here is the caller graph for this function:

int drmDropMaster ( int  fd)

Definition at line 2515 of file xf86drm.c.

{
       return ioctl(fd, DRM_IOCTL_DROP_MASTER, 0);
}
int drmError ( int  err,
const char *  label 
)

Definition at line 1974 of file xf86drm.c.

{
    switch (err) {
    case DRM_ERR_NO_DEVICE:
       fprintf(stderr, "%s: no device\n", label);
       break;
    case DRM_ERR_NO_ACCESS:
       fprintf(stderr, "%s: no access\n", label);
       break;
    case DRM_ERR_NOT_ROOT:
       fprintf(stderr, "%s: not root\n", label);
       break;
    case DRM_ERR_INVALID:
       fprintf(stderr, "%s: invalid args\n", label);
       break;
    default:
       if (err < 0)
           err = -err;
       fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
       break;
    }

    return 1;
}

Here is the caller graph for this function:

int drmFinish ( int  fd,
int  context,
drmLockFlags  flags 
)

Definition at line 2045 of file xf86drm.c.

{
    drm_lock_t lock;

    lock.context = context;
    lock.flags   = 0;
    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
    if (drmIoctl(fd, DRM_IOCTL_FINISH, &lock))
       return -errno;
    return 0;
}

Here is the call graph for this function:

void drmFree ( void *  pt)

Definition at line 152 of file xf86drm.c.

{
    if (pt)
       free(pt);
}

Here is the caller graph for this function:

int drmFreeBufs ( int  fd,
int  count,
int *  list 
)

Free buffers.

Parameters:
fdfile descriptor.
countnumber of buffers to free.
listlist of buffers to be freed.
Returns:
zero on success, or a negative value on failure.
Note:
This function is primarily used for debugging.

This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing the arguments in a drm_buf_free structure.

Definition at line 1079 of file xf86drm.c.

{
    drm_buf_free_t request;

    request.count = count;
    request.list  = list;
    if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request))
       return -errno;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void drmFreeBusid ( const char *  busid)

Free the bus ID information.

Parameters:
busidbus ID information string as given by drmGetBusid().

This function is just frees the memory pointed by busid.

Definition at line 834 of file xf86drm.c.

{
    drmFree((void *)busid);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 1409 of file xf86drm.c.

{
    drmFree(pt);
}

Here is the call graph for this function:

Free the version information returned by drmGetVersion().

Parameters:
vpointer to the version information.

It frees the memory pointed by v as well as all the non-null strings pointers in it.

Definition at line 667 of file xf86drm.c.

{
    if (!v)
       return;
    drmFree(v->name);
    drmFree(v->date);
    drmFree(v->desc);
    drmFree(v);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 1165 of file xf86drm.c.

{
    drm_buf_info_t info;
    drmBufInfoPtr  retval;
    int            i;

    info.count = 0;
    info.list  = NULL;

    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
       return NULL;

    if (info.count) {
       if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
           return NULL;

       if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
           drmFree(info.list);
           return NULL;
       }

       retval = drmMalloc(sizeof(*retval));
       retval->count = info.count;
       retval->list  = drmMalloc(info.count * sizeof(*retval->list));
       for (i = 0; i < info.count; i++) {
           retval->list[i].count     = info.list[i].count;
           retval->list[i].size      = info.list[i].size;
           retval->list[i].low_mark  = info.list[i].low_mark;
           retval->list[i].high_mark = info.list[i].high_mark;
       }
       drmFree(info.list);
       return retval;
    }
    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* drmGetBusid ( int  fd)

Get the bus ID of the device.

Parameters:
fdfile descriptor.
Returns:
bus ID string.

This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to get the string length and data, passing the arguments in a drm_unique structure.

Definition at line 852 of file xf86drm.c.

{
    drm_unique_t u;

    u.unique_len = 0;
    u.unique     = NULL;

    if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
       return NULL;
    u.unique = drmMalloc(u.unique_len + 1);
    if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
       return NULL;
    u.unique[u.unique_len] = '\0';

    return u.unique;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmGetCap ( int  fd,
uint64_t  capability,
uint64_t *  value 
)

Definition at line 813 of file xf86drm.c.

{
       struct drm_get_cap cap = { capability, 0 };
       int ret;

       ret = drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap);
       if (ret)
              return ret;

       *value = cap.value;
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmGetClient ( int  fd,
int  idx,
int *  auth,
int *  pid,
int *  uid,
unsigned long *  magic,
unsigned long *  iocs 
)

Definition at line 2163 of file xf86drm.c.

{
    drm_client_t client;

    client.idx = idx;
    if (drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client))
       return -errno;
    *auth      = client.auth;
    *pid       = client.pid;
    *uid       = client.uid;
    *magic     = client.magic;
    *iocs      = client.iocs;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmGetContextFlags ( int  fd,
drm_context_t  context,
drm_context_tFlagsPtr  flags 
)

Definition at line 1474 of file xf86drm.c.

{
    drm_ctx_t ctx;

    ctx.handle = context;
    if (drmIoctl(fd, DRM_IOCTL_GET_CTX, &ctx))
       return -errno;
    *flags = 0;
    if (ctx.flags & _DRM_CONTEXT_PRESERVED)
       *flags |= DRM_CONTEXT_PRESERVED;
    if (ctx.flags & _DRM_CONTEXT_2DONLY)
       *flags |= DRM_CONTEXT_2DONLY;
    return 0;
}

Here is the call graph for this function:

int drmGetContextPrivateMapping ( int  fd,
drm_context_t  ctx_id,
drm_handle_t handle 
)

Definition at line 2130 of file xf86drm.c.

{
    drm_ctx_priv_map_t map;

    map.ctx_id = ctx_id;

    if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
       return -errno;
    if (handle)
       *handle = (drm_handle_t)(uintptr_t)map.handle;

    return 0;
}

Here is the call graph for this function:

void* drmGetContextTag ( int  fd,
drm_context_t  context 
)

Definition at line 2106 of file xf86drm.c.

{
    drmHashEntry  *entry = drmGetEntry(fd);
    void          *value;

    if (drmHashLookup(entry->tagTable, context, &value))
       return NULL;

    return value;
}

Here is the call graph for this function:

char* drmGetDeviceNameFromFd ( int  fd)

Definition at line 2520 of file xf86drm.c.

{
       char name[128];
       struct stat sbuf;
       dev_t d;
       int i;

       /* The whole drmOpen thing is a fiasco and we need to find a way
        * back to just using open(2).  For now, however, lets just make
        * things worse with even more ad hoc directory walking code to
        * discover the device file name. */

       fstat(fd, &sbuf);
       d = sbuf.st_rdev;

       for (i = 0; i < DRM_MAX_MINOR; i++) {
              snprintf(name, sizeof name, DRM_DEV_NAME, DRM_DIR_NAME, i);
              if (stat(name, &sbuf) == 0 && sbuf.st_rdev == d)
                     break;
       }
       if (i == DRM_MAX_MINOR)
              return NULL;

       return strdup(name);
}

Here is the caller graph for this function:

drmHashEntry* drmGetEntry ( int  fd)

Definition at line 181 of file xf86drm.c.

{
    unsigned long key = drmGetKeyFromFd(fd);
    void          *value;
    drmHashEntry  *entry;

    if (!drmHashTable)
       drmHashTable = drmHashCreate();

    if (drmHashLookup(drmHashTable, key, &value)) {
       entry           = drmMalloc(sizeof(*entry));
       entry->fd       = fd;
       entry->f        = NULL;
       entry->tagTable = drmHashCreate();
       drmHashInsert(drmHashTable, key, entry);
    } else {
       entry = value;
    }
    return entry;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void* drmGetHashTable ( void  )

Definition at line 139 of file xf86drm.c.

{
    return drmHashTable;
}
int drmGetInterruptFromBusID ( int  fd,
int  busnum,
int  devnum,
int  funcnum 
)

Get IRQ from bus ID.

Parameters:
fdfile descriptor.
busnumbus number.
devnumdevice number.
funcnumfunction number.
Returns:
IRQ number on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the arguments in a drm_irq_busid structure.

Definition at line 2076 of file xf86drm.c.

{
    drm_irq_busid_t p;

    p.busnum  = busnum;
    p.devnum  = devnum;
    p.funcnum = funcnum;
    if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p))
       return -errno;
    return p.irq;
}

Here is the call graph for this function:

Get version information for the DRM user space library.

This version number is driver independent.

Parameters:
fdfile descriptor.
Returns:
version information.

This function allocates and fills a drm_version structure with a hard coded version number.

Definition at line 792 of file xf86drm.c.

{
    drm_version_t *version = drmMalloc(sizeof(*version));

    /* Version history:
     *   NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it
     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
     *                    entry point and many drm<Device> extensions
     *   revision 1.1.x = added drmCommand entry points for device extensions
     *                    added drmGetLibVersion to identify libdrm.a version
     *   revision 1.2.x = added drmSetInterfaceVersion
     *                    modified drmOpen to handle both busid and name
     *   revision 1.3.x = added server + memory manager
     */
    version->version_major      = 1;
    version->version_minor      = 3;
    version->version_patchlevel = 0;

    return (drmVersionPtr)version;
}

Here is the call graph for this function:

int drmGetLock ( int  fd,
drm_context_t  context,
drmLockFlags  flags 
)

Obtain heavyweight hardware lock.

Parameters:
fdfile descriptor.
contextcontext.
flagsflags that determine the sate of the hardware when the function returns.
Returns:
always zero.

This function translates the arguments into a drm_lock structure and issue the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.

Definition at line 1336 of file xf86drm.c.

{
    drm_lock_t lock;

    lock.context = context;
    lock.flags   = 0;
    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;

    while (drmIoctl(fd, DRM_IOCTL_LOCK, &lock))
       ;
    return 0;
}

Here is the call graph for this function:

int drmGetMagic ( int  fd,
drm_magic_t magic 
)

Definition at line 895 of file xf86drm.c.

{
    drm_auth_t auth;

    *magic = 0;
    if (drmIoctl(fd, DRM_IOCTL_GET_MAGIC, &auth))
       return -errno;
    *magic = auth.magic;
    return 0;
}

Here is the call graph for this function:

int drmGetMap ( int  fd,
int  idx,
drm_handle_t offset,
drmSize size,
drmMapType type,
drmMapFlags flags,
drm_handle_t handle,
int *  mtrr 
)

Definition at line 2145 of file xf86drm.c.

{
    drm_map_t map;

    map.offset = idx;
    if (drmIoctl(fd, DRM_IOCTL_GET_MAP, &map))
       return -errno;
    *offset = map.offset;
    *size   = map.size;
    *type   = map.type;
    *flags  = map.flags;
    *handle = (unsigned long)map.handle;
    *mtrr   = map.mtrr;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

drm_context_t* drmGetReservedContextList ( int  fd,
int *  count 
)

Definition at line 1375 of file xf86drm.c.

{
    drm_ctx_res_t res;
    drm_ctx_t     *list;
    drm_context_t * retval;
    int           i;

    res.count    = 0;
    res.contexts = NULL;
    if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res))
       return NULL;

    if (!res.count)
       return NULL;

    if (!(list   = drmMalloc(res.count * sizeof(*list))))
       return NULL;
    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
       drmFree(list);
       return NULL;
    }

    res.contexts = list;
    if (drmIoctl(fd, DRM_IOCTL_RES_CTX, &res))
       return NULL;

    for (i = 0; i < res.count; i++)
       retval[i] = list[i].handle;
    drmFree(list);

    *count = res.count;
    return retval;
}

Here is the call graph for this function:

int drmGetStats ( int  fd,
drmStatsT stats 
)

Definition at line 2179 of file xf86drm.c.

{
    drm_stats_t s;
    int         i;

    if (drmIoctl(fd, DRM_IOCTL_GET_STATS, &s))
       return -errno;

    stats->count = 0;
    memset(stats, 0, sizeof(*stats));
    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
       return -1;

#define SET_VALUE                              \
    stats->data[i].long_format = "%-20.20s";   \
    stats->data[i].rate_format = "%8.8s";      \
    stats->data[i].isvalue     = 1;            \
    stats->data[i].verbose     = 0

#define SET_COUNT                              \
    stats->data[i].long_format = "%-20.20s";   \
    stats->data[i].rate_format = "%5.5s";      \
    stats->data[i].isvalue     = 0;            \
    stats->data[i].mult_names  = "kgm";        \
    stats->data[i].mult        = 1000;         \
    stats->data[i].verbose     = 0

#define SET_BYTE                               \
    stats->data[i].long_format = "%-20.20s";   \
    stats->data[i].rate_format = "%5.5s";      \
    stats->data[i].isvalue     = 0;            \
    stats->data[i].mult_names  = "KGM";        \
    stats->data[i].mult        = 1024;         \
    stats->data[i].verbose     = 0


    stats->count = s.count;
    for (i = 0; i < s.count; i++) {
       stats->data[i].value = s.data[i].value;
       switch (s.data[i].type) {
       case _DRM_STAT_LOCK:
           stats->data[i].long_name = "Lock";
           stats->data[i].rate_name = "Lock";
           SET_VALUE;
           break;
       case _DRM_STAT_OPENS:
           stats->data[i].long_name = "Opens";
           stats->data[i].rate_name = "O";
           SET_COUNT;
           stats->data[i].verbose   = 1;
           break;
       case _DRM_STAT_CLOSES:
           stats->data[i].long_name = "Closes";
           stats->data[i].rate_name = "Lock";
           SET_COUNT;
           stats->data[i].verbose   = 1;
           break;
       case _DRM_STAT_IOCTLS:
           stats->data[i].long_name = "Ioctls";
           stats->data[i].rate_name = "Ioc/s";
           SET_COUNT;
           break;
       case _DRM_STAT_LOCKS:
           stats->data[i].long_name = "Locks";
           stats->data[i].rate_name = "Lck/s";
           SET_COUNT;
           break;
       case _DRM_STAT_UNLOCKS:
           stats->data[i].long_name = "Unlocks";
           stats->data[i].rate_name = "Unl/s";
           SET_COUNT;
           break;
       case _DRM_STAT_IRQ:
           stats->data[i].long_name = "IRQs";
           stats->data[i].rate_name = "IRQ/s";
           SET_COUNT;
           break;
       case _DRM_STAT_PRIMARY:
           stats->data[i].long_name = "Primary Bytes";
           stats->data[i].rate_name = "PB/s";
           SET_BYTE;
           break;
       case _DRM_STAT_SECONDARY:
           stats->data[i].long_name = "Secondary Bytes";
           stats->data[i].rate_name = "SB/s";
           SET_BYTE;
           break;
       case _DRM_STAT_DMA:
           stats->data[i].long_name = "DMA";
           stats->data[i].rate_name = "DMA/s";
           SET_COUNT;
           break;
       case _DRM_STAT_SPECIAL:
           stats->data[i].long_name = "Special DMA";
           stats->data[i].rate_name = "dma/s";
           SET_COUNT;
           break;
       case _DRM_STAT_MISSED:
           stats->data[i].long_name = "Miss";
           stats->data[i].rate_name = "Ms/s";
           SET_COUNT;
           break;
       case _DRM_STAT_VALUE:
           stats->data[i].long_name = "Value";
           stats->data[i].rate_name = "Value";
           SET_VALUE;
           break;
       case _DRM_STAT_BYTE:
           stats->data[i].long_name = "Bytes";
           stats->data[i].rate_name = "B/s";
           SET_BYTE;
           break;
       case _DRM_STAT_COUNT:
       default:
           stats->data[i].long_name = "Count";
           stats->data[i].rate_name = "Cnt/s";
           SET_COUNT;
           break;
       }
    }
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Query the driver version information.

Parameters:
fdfile descriptor.
Returns:
pointer to a drmVersion structure which should be freed with drmFreeVersion().
Note:
Similar information is available via /proc/dri.

It gets the version information via successive DRM_IOCTL_VERSION ioctls, first with zeros to get the string lengths, and then the actually strings. It also null-terminates them since they might not be already.

Definition at line 737 of file xf86drm.c.

{
    drmVersionPtr retval;
    drm_version_t *version = drmMalloc(sizeof(*version));

    version->name_len    = 0;
    version->name        = NULL;
    version->date_len    = 0;
    version->date        = NULL;
    version->desc_len    = 0;
    version->desc        = NULL;

    if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) {
       drmFreeKernelVersion(version);
       return NULL;
    }

    if (version->name_len)
       version->name    = drmMalloc(version->name_len + 1);
    if (version->date_len)
       version->date    = drmMalloc(version->date_len + 1);
    if (version->desc_len)
       version->desc    = drmMalloc(version->desc_len + 1);

    if (drmIoctl(fd, DRM_IOCTL_VERSION, version)) {
       drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
       drmFreeKernelVersion(version);
       return NULL;
    }

    /* The results might not be null-terminated strings, so terminate them. */
    if (version->name_len) version->name[version->name_len] = '\0';
    if (version->date_len) version->date[version->date_len] = '\0';
    if (version->desc_len) version->desc[version->desc_len] = '\0';

    retval = drmMalloc(sizeof(*retval));
    drmCopyVersion(retval, version);
    drmFreeKernelVersion(version);
    return retval;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmHandleEvent ( int  fd,
drmEventContextPtr  evctx 
)

Definition at line 772 of file xf86drmMode.c.

{
       char buffer[1024];
       int len, i;
       struct drm_event *e;
       struct drm_event_vblank *vblank;
       
       /* The DRM read semantics guarantees that we always get only
        * complete events. */

       len = read(fd, buffer, sizeof buffer);
       if (len == 0)
              return 0;
       if (len < sizeof *e)
              return -1;

       i = 0;
       while (i < len) {
              e = (struct drm_event *) &buffer[i];
              switch (e->type) {
              case DRM_EVENT_VBLANK:
                     if (evctx->version < 1 ||
                         evctx->vblank_handler == NULL)
                            break;
                     vblank = (struct drm_event_vblank *) e;
                     evctx->vblank_handler(fd,
                                         vblank->sequence, 
                                         vblank->tv_sec,
                                         vblank->tv_usec,
                                         U642VOID (vblank->user_data));
                     break;
              case DRM_EVENT_FLIP_COMPLETE:
                     if (evctx->version < 2 ||
                         evctx->page_flip_handler == NULL)
                            break;
                     vblank = (struct drm_event_vblank *) e;
                     evctx->page_flip_handler(fd,
                                           vblank->sequence,
                                           vblank->tv_sec,
                                           vblank->tv_usec,
                                           U642VOID (vblank->user_data));
                     break;
              default:
                     break;
              }
              i += e->length;
       }

       return 0;
}

Here is the caller graph for this function:

void* drmHashCreate ( void  )

Definition at line 157 of file xf86drmHash.c.

{
    HashTablePtr table;
    int          i;

    table           = HASH_ALLOC(sizeof(*table));
    if (!table) return NULL;
    table->magic    = HASH_MAGIC;
    table->entries  = 0;
    table->hits     = 0;
    table->partials = 0;
    table->misses   = 0;

    for (i = 0; i < HASH_SIZE; i++) table->buckets[i] = NULL;
    return table;
}

Here is the caller graph for this function:

int drmHashDelete ( void *  t,
unsigned long  key 
)

Definition at line 260 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;
    unsigned long hash;
    HashBucketPtr bucket;

    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */

    bucket = HashFind(table, key, &hash);

    if (!bucket) return 1;  /* Not found */

    table->buckets[hash] = bucket->next;
    HASH_FREE(bucket);
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmHashDestroy ( void *  t)

Definition at line 174 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;
    HashBucketPtr bucket;
    HashBucketPtr next;
    int           i;

    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */

    for (i = 0; i < HASH_SIZE; i++) {
       for (bucket = table->buckets[i]; bucket;) {
           next = bucket->next;
           HASH_FREE(bucket);
           bucket = next;
       }
    }
    HASH_FREE(table);
    return 0;
}

Here is the caller graph for this function:

int drmHashFirst ( void *  t,
unsigned long *  key,
void **  value 
)

Definition at line 294 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;

    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */

    table->p0 = 0;
    table->p1 = table->buckets[0];
    return drmHashNext(table, key, value);
}

Here is the call graph for this function:

int drmHashInsert ( void *  t,
unsigned long  key,
void *  value 
)

Definition at line 238 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;
    HashBucketPtr bucket;
    unsigned long hash;

    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */

    if (HashFind(table, key, &hash)) return 1; /* Already in table */

    bucket               = HASH_ALLOC(sizeof(*bucket));
    if (!bucket) return -1; /* Error */
    bucket->key          = key;
    bucket->value        = value;
    bucket->next         = table->buckets[hash];
    table->buckets[hash] = bucket;
#if HASH_DEBUG
    printf("Inserted %d at %d/%p\n", key, hash, bucket);
#endif
    return 0;               /* Added to table */
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmHashLookup ( void *  t,
unsigned long  key,
void **  value 
)

Definition at line 225 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;
    HashBucketPtr bucket;

    if (!table || table->magic != HASH_MAGIC) return -1; /* Bad magic */

    bucket = HashFind(table, key, NULL);
    if (!bucket) return 1;  /* Not found */
    *value = bucket->value;
    return 0;               /* Found */
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmHashNext ( void *  t,
unsigned long *  key,
void **  value 
)

Definition at line 277 of file xf86drmHash.c.

{
    HashTablePtr  table = (HashTablePtr)t;

    while (table->p0 < HASH_SIZE) {
       if (table->p1) {
           *key       = table->p1->key;
           *value     = table->p1->value;
           table->p1  = table->p1->next;
           return 1;
       }
       table->p1 = table->buckets[table->p0];
       ++table->p0;
    }
    return 0;
}

Here is the caller graph for this function:

int drmIoctl ( int  fd,
unsigned long  request,
void *  arg 
)

Call ioctl, restarting if it is interupted.

Definition at line 162 of file xf86drm.c.

{
    int       ret;

    do {
       ret = ioctl(fd, request, arg);
    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
    return ret;
}
void* drmMalloc ( int  size)

Definition at line 144 of file xf86drm.c.

{
    void *pt;
    if ((pt = malloc(size)))
       memset(pt, 0, size);
    return pt;
}

Here is the caller graph for this function:

int drmMap ( int  fd,
drm_handle_t  handle,
drmSize  size,
drmAddressPtr  address 
)

Map a region of memory.

Parameters:
fdfile descriptor.
handlehandle returned by drmAddMap().
sizesize in bytes. Must match the size used by drmAddMap().
addresswill contain the user-space virtual address where the mapping begins.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper for mmap().

Definition at line 1130 of file xf86drm.c.

{
    static unsigned long pagesize_mask = 0;

    if (fd < 0)
       return -EINVAL;

    if (!pagesize_mask)
       pagesize_mask = getpagesize() - 1;

    size = (size + pagesize_mask) & ~pagesize_mask;

    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
    if (*address == MAP_FAILED)
       return -errno;
    return 0;
}

Here is the caller graph for this function:

drmBufMapPtr drmMapBufs ( int  fd)

Map all DMA buffers into client-virtual space.

Parameters:
fdfile descriptor.
Returns:
a pointer to a drmBufMap structure.
Note:
The client may not use these buffers until obtaining buffer indices with drmDMA().

This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned information about the buffers in a drm_buf_map structure into the client-visible data structures.

Definition at line 1216 of file xf86drm.c.

{
    drm_buf_map_t bufs;
    drmBufMapPtr  retval;
    int           i;

    bufs.count = 0;
    bufs.list  = NULL;
    bufs.virtual = NULL;
    if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
       return NULL;

    if (!bufs.count)
       return NULL;

       if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
           return NULL;

       if (drmIoctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
           drmFree(bufs.list);
           return NULL;
       }

       retval = drmMalloc(sizeof(*retval));
       retval->count = bufs.count;
       retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
       for (i = 0; i < bufs.count; i++) {
           retval->list[i].idx     = bufs.list[i].idx;
           retval->list[i].total   = bufs.list[i].total;
           retval->list[i].used    = 0;
           retval->list[i].address = bufs.list[i].address;
       }

       drmFree(bufs.list);
       
       return retval;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmMarkBufs ( int  fd,
double  low,
double  high 
)

Definition at line 1027 of file xf86drm.c.

{
    drm_buf_info_t info;
    int            i;

    info.count = 0;
    info.list  = NULL;

    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info))
       return -EINVAL;

    if (!info.count)
       return -EINVAL;

    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
       return -ENOMEM;

    if (drmIoctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
       int retval = -errno;
       drmFree(info.list);
       return retval;
    }

    for (i = 0; i < info.count; i++) {
       info.list[i].low_mark  = low  * info.list[i].count;
       info.list[i].high_mark = high * info.list[i].count;
       if (drmIoctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
           int retval = -errno;
           drmFree(info.list);
           return retval;
       }
    }
    drmFree(info.list);

    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void drmMsg ( const char *  format,
  ... 
)

Definition at line 115 of file xf86drm.c.

{
    va_list   ap;
    const char *env;
    if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info)
    {
       va_start(ap, format);
       if (drm_server_info) {
         drm_server_info->debug_print(format,ap);
       } else {
         drm_debug_print(format, ap);
       }
       va_end(ap);
    }
}

Here is the caller graph for this function:

int drmOpen ( const char *  name,
const char *  busid 
)

Open the DRM device.

Looks up the specified name and bus ID, and opens the device found. The entry in /dev/dri is created if necessary and if called by root.

Parameters:
namedriver name. Not referenced if bus ID is supplied.
busidbus ID. Zero if not known.
Returns:
a file descriptor on success, or a negative value on error.

It calls drmOpenByBusid() if busid is specified or drmOpenByName() otherwise.

Definition at line 631 of file xf86drm.c.

{
    if (!drmAvailable() && name != NULL && drm_server_info) {
       /* try to load the kernel */
       if (!drm_server_info->load_module(name)) {
           drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
           return -1;
       }
    }

    if (busid) {
       int fd = drmOpenByBusid(busid);
       if (fd >= 0)
           return fd;
    }
    
    if (name)
       return drmOpenByName(name);

    return -1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmOpenControl ( int  minor)

Definition at line 653 of file xf86drm.c.

{
    return drmOpenMinor(minor, 0, DRM_NODE_CONTROL);
}

Here is the call graph for this function:

int drmOpenOnce ( void *  unused,
const char *  BusID,
int *  newlyopened 
)

Definition at line 2458 of file xf86drm.c.

{
    int i;
    int fd;
   
    for (i = 0; i < nr_fds; i++)
       if (strcmp(BusID, connection[i].BusID) == 0) {
           connection[i].refcount++;
           *newlyopened = 0;
           return connection[i].fd;
       }

    fd = drmOpen(unused, BusID);
    if (fd <= 0 || nr_fds == DRM_MAX_FDS)
       return fd;
   
    connection[nr_fds].BusID = strdup(BusID);
    connection[nr_fds].fd = fd;
    connection[nr_fds].refcount = 1;
    *newlyopened = 1;

    if (0)
       fprintf(stderr, "saved connection %d for %s %d\n", 
              nr_fds, connection[nr_fds].BusID, 
              strcmp(BusID, connection[nr_fds].BusID));

    nr_fds++;

    return fd;
}

Here is the call graph for this function:

unsigned long drmRandom ( void *  state)

Definition at line 147 of file xf86drmRandom.c.

{
    RandomState   *s = (RandomState *)state;
    long          hi;
    long          lo;

    hi      = s->seed / s->q;
    lo      = s->seed % s->q;
    s->seed = s->a * lo - s->r * hi;
    if (s->seed <= 0) s->seed += s->m;

    return s->seed;
}

Here is the caller graph for this function:

void* drmRandomCreate ( unsigned long  seed)

Definition at line 111 of file xf86drmRandom.c.

{
    RandomState  *state;

    state           = RANDOM_ALLOC(sizeof(*state));
    if (!state) return NULL;
    state->magic    = RANDOM_MAGIC;
#if 0
                            /* Park & Miller, October 1988 */
    state->a        = 16807;
    state->m        = 2147483647;
    state->check    = 1043618065; /* After 10000 iterations */
#else
                            /* Park, Miller, and Stockmeyer, July 1993 */
    state->a        = 48271;
    state->m        = 2147483647;
    state->check    = 399268537; /* After 10000 iterations */
#endif
    state->q        = state->m / state->a;
    state->r        = state->m % state->a;

    state->seed     = seed;
                            /* Check for illegal boundary conditions,
                                   and choose closest legal value. */
    if (state->seed <= 0)        state->seed = 1;
    if (state->seed >= state->m) state->seed = state->m - 1;

    return state;
}
int drmRandomDestroy ( void *  state)

Definition at line 141 of file xf86drmRandom.c.

{
    RANDOM_FREE(state);
    return 0;
}
double drmRandomDouble ( void *  state)

Definition at line 161 of file xf86drmRandom.c.

{
    RandomState *s = (RandomState *)state;
    
    return (double)drmRandom(state)/(double)s->m;
}

Here is the call graph for this function:

int drmRmMap ( int  fd,
drm_handle_t  handle 
)

Definition at line 983 of file xf86drm.c.

{
    drm_map_t map;

    map.handle = (void *)(uintptr_t)handle;

    if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmScatterGatherAlloc ( int  fd,
unsigned long  size,
drm_handle_t handle 
)

Definition at line 1907 of file xf86drm.c.

{
    drm_scatter_gather_t sg;

    *handle = 0;
    sg.size   = size;
    sg.handle = 0;
    if (drmIoctl(fd, DRM_IOCTL_SG_ALLOC, &sg))
       return -errno;
    *handle = sg.handle;
    return 0;
}

Here is the call graph for this function:

int drmScatterGatherFree ( int  fd,
drm_handle_t  handle 
)

Definition at line 1920 of file xf86drm.c.

{
    drm_scatter_gather_t sg;

    sg.size   = 0;
    sg.handle = handle;
    if (drmIoctl(fd, DRM_IOCTL_SG_FREE, &sg))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmSetBusid ( int  fd,
const char *  busid 
)

Set the bus ID of the device.

Parameters:
fdfile descriptor.
busidbus ID string.
Returns:
zero on success, negative on failure.

This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing the arguments in a drm_unique structure.

Definition at line 882 of file xf86drm.c.

{
    drm_unique_t u;

    u.unique     = (char *)busid;
    u.unique_len = strlen(busid);

    if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
       return -errno;
    }
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmSetContextFlags ( int  fd,
drm_context_t  context,
drm_context_tFlags  flags 
)

Definition at line 1453 of file xf86drm.c.

{
    drm_ctx_t ctx;

    /*
     * Context preserving means that no context switches are done between DMA
     * buffers from one context and the next.  This is suitable for use in the
     * X server (which promises to maintain hardware context), or in the
     * client-side library when buffers are swapped on behalf of two threads.
     */
    ctx.handle = context;
    ctx.flags  = 0;
    if (flags & DRM_CONTEXT_PRESERVED)
       ctx.flags |= _DRM_CONTEXT_PRESERVED;
    if (flags & DRM_CONTEXT_2DONLY)
       ctx.flags |= _DRM_CONTEXT_2DONLY;
    if (drmIoctl(fd, DRM_IOCTL_MOD_CTX, &ctx))
       return -errno;
    return 0;
}

Here is the call graph for this function:

int drmSetInterfaceVersion ( int  fd,
drmSetVersion version 
)

Issue a set-version ioctl.

Parameters:
fdfile descriptor.
drmCommandIndexcommand index
datasource pointer of the data to be read and written.
sizesize of the data to be read and written.
Returns:
zero on success, or a negative value on failure.

It issues a read-write ioctl given by

 DRM_COMMAND_BASE + drmCommandIndex 

.

Definition at line 2316 of file xf86drm.c.

{
    int retcode = 0;
    drm_set_version_t sv;

    sv.drm_di_major = version->drm_di_major;
    sv.drm_di_minor = version->drm_di_minor;
    sv.drm_dd_major = version->drm_dd_major;
    sv.drm_dd_minor = version->drm_dd_minor;

    if (drmIoctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
       retcode = -errno;
    }

    version->drm_di_major = sv.drm_di_major;
    version->drm_di_minor = sv.drm_di_minor;
    version->drm_dd_major = sv.drm_dd_major;
    version->drm_dd_minor = sv.drm_dd_minor;

    return retcode;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmSetMaster ( int  fd)

Definition at line 2510 of file xf86drm.c.

{
       return ioctl(fd, DRM_IOCTL_SET_MASTER, 0);
}

Definition at line 93 of file xf86drm.c.

{
    drm_server_info = info;
}
void* drmSLCreate ( void  )

Definition at line 132 of file xf86drmSL.c.

{
    SkipListPtr  list;
    int          i;

    list           = SL_ALLOC(sizeof(*list));
    if (!list) return NULL;
    list->magic    = SL_LIST_MAGIC;
    list->level    = 0;
    list->head     = SLCreateEntry(SL_MAX_LEVEL, 0, NULL);
    list->count    = 0;

    for (i = 0; i <= SL_MAX_LEVEL; i++) list->head->forward[i] = NULL;
    
    return list;
}

Here is the call graph for this function:

int drmSLDelete ( void *  l,
unsigned long  key 
)

Definition at line 219 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    SLEntryPtr    update[SL_MAX_LEVEL + 1];
    SLEntryPtr    entry;
    int           i;

    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */

    entry = SLLocate(list, key, update);

    if (!entry || entry->key != key) return 1; /* Not found */

                            /* Fix up forward pointers */
    for (i = 0; i <= list->level; i++) {
       if (update[i]->forward[i] == entry)
           update[i]->forward[i] = entry->forward[i];
    }

    entry->magic = SL_FREED_MAGIC;
    SL_FREE(entry);

    while (list->level && !list->head->forward[list->level]) --list->level;
    --list->count;
    return 0;
}

Here is the call graph for this function:

int drmSLDestroy ( void *  l)

Definition at line 149 of file xf86drmSL.c.

{
    SkipListPtr   list  = (SkipListPtr)l;
    SLEntryPtr    entry;
    SLEntryPtr    next;

    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */

    for (entry = list->head; entry; entry = next) {
       if (entry->magic != SL_ENTRY_MAGIC) return -1; /* Bad magic */
       next         = entry->forward[0];
       entry->magic = SL_FREED_MAGIC;
       SL_FREE(entry);
    }

    list->magic = SL_FREED_MAGIC;
    SL_FREE(list);
    return 0;
}
void drmSLDump ( void *  l)

Definition at line 316 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    SLEntryPtr    entry;
    int           i;
    
    if (list->magic != SL_LIST_MAGIC) {
       printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
              list->magic, SL_LIST_MAGIC);
       return;
    }

    printf("Level = %d, count = %d\n", list->level, list->count);
    for (entry = list->head; entry; entry = entry->forward[0]) {
       if (entry->magic != SL_ENTRY_MAGIC) {
           printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
                 list->magic, SL_ENTRY_MAGIC);
       }
       printf("\nEntry %p <0x%08lx, %p> has %2d levels\n",
              entry, entry->key, entry->value, entry->levels);
       for (i = 0; i < entry->levels; i++) {
           if (entry->forward[i]) {
              printf("   %2d: %p <0x%08lx, %p>\n",
                     i,
                     entry->forward[i],
                     entry->forward[i]->key,
                     entry->forward[i]->value);
           } else {
              printf("   %2d: %p\n", i, entry->forward[i]);
           }
       }
    }
}
int drmSLFirst ( void *  l,
unsigned long *  key,
void **  value 
)

Definition at line 305 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    
    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
    
    list->p0 = list->head->forward[0];
    return drmSLNext(list, key, value);
}

Here is the call graph for this function:

int drmSLInsert ( void *  l,
unsigned long  key,
void *  value 
)

Definition at line 186 of file xf86drmSL.c.

{
    SkipListPtr   list  = (SkipListPtr)l;
    SLEntryPtr    entry;
    SLEntryPtr    update[SL_MAX_LEVEL + 1];
    int           level;
    int           i;

    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */

    entry = SLLocate(list, key, update);

    if (entry && entry->key == key) return 1; /* Already in list */


    level = SLRandomLevel();
    if (level > list->level) {
       level = ++list->level;
       update[level] = list->head;
    }

    entry = SLCreateEntry(level, key, value);

                            /* Fix up forward pointers */
    for (i = 0; i <= level; i++) {
       entry->forward[i]     = update[i]->forward[i];
       update[i]->forward[i] = entry;
    }

    ++list->count;
    return 0;               /* Added to table */
}

Here is the call graph for this function:

int drmSLLookup ( void *  l,
unsigned long  key,
void **  value 
)

Definition at line 246 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    SLEntryPtr    update[SL_MAX_LEVEL + 1];
    SLEntryPtr    entry;

    entry = SLLocate(list, key, update);

    if (entry && entry->key == key) {
       *value = entry;
       return 0;
    }
    *value = NULL;
    return -1;
}

Here is the call graph for this function:

int drmSLLookupNeighbors ( void *  l,
unsigned long  key,
unsigned long *  prev_key,
void **  prev_value,
unsigned long *  next_key,
void **  next_value 
)

Definition at line 262 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    SLEntryPtr    update[SL_MAX_LEVEL + 1];
    int           retcode = 0;

    *prev_key   = *next_key   = key;
    *prev_value = *next_value = NULL;
       
    if (update[0]) {
       *prev_key   = update[0]->key;
       *prev_value = update[0]->value;
       ++retcode;
       if (update[0]->forward[0]) {
           *next_key   = update[0]->forward[0]->key;
           *next_value = update[0]->forward[0]->value;
           ++retcode;
       }
    }
    return retcode;
}
int drmSLNext ( void *  l,
unsigned long *  key,
void **  value 
)

Definition at line 286 of file xf86drmSL.c.

{
    SkipListPtr   list = (SkipListPtr)l;
    SLEntryPtr    entry;
    
    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */

    entry    = list->p0;

    if (entry) {
       list->p0 = entry->forward[0];
       *key     = entry->key;
       *value   = entry->value;
       return 1;
    }
    list->p0 = NULL;
    return 0;
}

Here is the caller graph for this function:

int drmSwitchToContext ( int  fd,
drm_context_t  context 
)

Definition at line 1443 of file xf86drm.c.

{
    drm_ctx_t ctx;

    ctx.handle = context;
    if (drmIoctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx))
       return -errno;
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int drmUnlock ( int  fd,
drm_context_t  context 
)

Release the hardware lock.

Parameters:
fdfile descriptor.
contextcontext.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the argument in a drm_lock structure.

Definition at line 1366 of file xf86drm.c.

{
    drm_lock_t lock;

    lock.context = context;
    lock.flags   = 0;
    return drmIoctl(fd, DRM_IOCTL_UNLOCK, &lock);
}

Here is the call graph for this function:

int drmUnmap ( drmAddress  address,
drmSize  size 
)

Unmap mappings obtained with drmMap().

Parameters:
addressaddress as given by drmMap().
sizesize in bytes. Must match the size used by drmMap().
Returns:
zero on success, or a negative value on failure.

This function is a wrapper for munmap().

Definition at line 1160 of file xf86drm.c.

{
    return munmap(address, size);
}
int drmUnmapBufs ( drmBufMapPtr  bufs)

Unmap buffers allocated with drmMapBufs().

Returns:
zero on success, or negative value on failure.

Calls munmap() for every buffer stored in bufs and frees the memory allocated by drmMapBufs().

Definition at line 1264 of file xf86drm.c.

{
    int i;

    for (i = 0; i < bufs->count; i++) {
       munmap(bufs->list[i].address, bufs->list[i].total);
    }

    drmFree(bufs->list);
    drmFree(bufs);
       
    return 0;
}

Here is the call graph for this function:

int drmUpdateDrawableInfo ( int  fd,
drm_drawable_t  handle,
drm_drawable_info_type_t  type,
unsigned int  num,
void *  data 
)

Definition at line 1534 of file xf86drm.c.

{
    drm_update_draw_t update;

    update.handle = handle;
    update.type = type;
    update.num = num;
    update.data = (unsigned long long)(unsigned long)data;

    if (drmIoctl(fd, DRM_IOCTL_UPDATE_DRAW, &update))
       return -errno;

    return 0;
}

Here is the call graph for this function:

int drmWaitVBlank ( int  fd,
drmVBlankPtr  vbl 
)

Wait for VBLANK.

Parameters:
fdfile descriptor.
vblpointer to a drmVBlank structure.
Returns:
zero on success, or a negative value on failure.

This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.

Definition at line 1942 of file xf86drm.c.

{
    struct timespec timeout, cur;
    int ret;

    ret = clock_gettime(CLOCK_MONOTONIC, &timeout);
    if (ret < 0) {
       fprintf(stderr, "clock_gettime failed: %s\n", strerror(ret));
       goto out;
    }
    timeout.tv_sec++;

    do {
       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
       if (ret && errno == EINTR) {
              clock_gettime(CLOCK_MONOTONIC, &cur);
              /* Timeout after 1s */
              if (cur.tv_sec > timeout.tv_sec + 1 ||
                 (cur.tv_sec == timeout.tv_sec && cur.tv_nsec >=
                  timeout.tv_nsec)) {
                     errno = EBUSY;
                     ret = -1;
                     break;
              }
       }
    } while (ret && errno == EINTR);

out:
    return ret;
}

Here is the caller graph for this function: