1f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/** 2f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * \file xf86drm.h 3f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * OS-independent header for DRM user-level library interface. 4f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 5f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * \author Rickard E. (Rik) Faith <faith@valinux.com> 6f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 7f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 8f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* 9f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas. 10f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 11f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * All Rights Reserved. 12f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 13f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Permission is hereby granted, free of charge, to any person obtaining a 14f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * copy of this software and associated documentation files (the "Software"), 15f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * to deal in the Software without restriction, including without limitation 16f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 17f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * and/or sell copies of the Software, and to permit persons to whom the 18f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Software is furnished to do so, subject to the following conditions: 19f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 20f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * The above copyright notice and this permission notice (including the next 21f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * paragraph) shall be included in all copies or substantial portions of the 22f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Software. 23f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 24f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 27f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 28f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 29f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 30f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * DEALINGS IN THE SOFTWARE. 31f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 32f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 33f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 34f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#ifndef _XF86DRM_H_ 35f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define _XF86DRM_H_ 36f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 37ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu#if defined(__cplusplus) || defined(c_plusplus) 38ba11a2fc2212d1515016ae5b0e1754554789318bJason Huextern "C" { 39ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu#endif 40ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu 41f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <stdarg.h> 42f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <sys/types.h> 43f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <stdint.h> 44f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <drm.h> 45f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 46f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* Defaults, if nothing set in xf86config */ 47f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DEV_UID 0 48f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DEV_GID 0 49f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* Default /dev/dri directory permissions 0755 */ 50f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DEV_DIRMODE \ 51f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) 52f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 53f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 54f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DIR_NAME "/dev/dri" 55f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_DEV_NAME "%s/card%d" 56f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CONTROL_DEV_NAME "%s/controlD%d" 57f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */ 58f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 59f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_ERR_NO_DEVICE (-1001) 60f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_ERR_NO_ACCESS (-1002) 61f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_ERR_NOT_ROOT (-1003) 62f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_ERR_INVALID (-1004) 63f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_ERR_NO_FD (-1005) 64f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 65f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_AGP_NO_HANDLE 0 66f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 67f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef unsigned int drmSize, *drmSizePtr; /**< For mapped regions */ 68f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef void *drmAddress, **drmAddressPtr; /**< For mapped regions */ 69f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 70f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmServerInfo { 71f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int (*debug_print)(const char *format, va_list ap); 72f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int (*load_module)(const char *name); 73f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void (*get_perms)(gid_t *, mode_t *); 74f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmServerInfo, *drmServerInfoPtr; 75f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 76f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct drmHashEntry { 77f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int fd; 78f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void (*f)(int, void *, void *); 79f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void *tagTable; 80f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmHashEntry; 81f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 82f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmIoctl(int fd, unsigned long request, void *arg); 83f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmGetHashTable(void); 84f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drmHashEntry *drmGetEntry(int fd); 85f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 86f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/** 87f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Driver version information. 88f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 89f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * \sa drmGetVersion() and drmSetVersion(). 90f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 91f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmVersion { 92f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int version_major; /**< Major version */ 93f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int version_minor; /**< Minor version */ 94f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int version_patchlevel; /**< Patch level */ 95f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int name_len; /**< Length of name buffer */ 96f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu char *name; /**< Name of driver */ 97f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int date_len; /**< Length of date buffer */ 98f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu char *date; /**< User-space buffer to hold date */ 99f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int desc_len; /**< Length of desc buffer */ 100f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu char *desc; /**< User-space buffer to hold desc */ 101f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmVersion, *drmVersionPtr; 102f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 103f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmStats { 104f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long count; /**< Number of data */ 105f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu struct { 106f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long value; /**< Value from kernel */ 107f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu const char *long_format; /**< Suggested format for long_name */ 108f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu const char *long_name; /**< Long name for value */ 109f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu const char *rate_format; /**< Suggested format for rate_name */ 110f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu const char *rate_name; /**< Short name for value per second */ 111f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int isvalue; /**< True if value (vs. counter) */ 112f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu const char *mult_names; /**< Multiplier names (e.g., "KGM") */ 113f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int mult; /**< Multiplier value (e.g., 1024) */ 114f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int verbose; /**< Suggest only in verbose output */ 115f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } data[15]; 116f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmStatsT; 117f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 118f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 119f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* All of these enums *MUST* match with the 120f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu kernel implementation -- so do *NOT* 121f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu change them! (The drmlib implementation 122f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu will just copy the flags instead of 123f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu translating them.) */ 124f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 125f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_FRAME_BUFFER = 0, /**< WC, no caching, no core dump */ 126f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_REGISTERS = 1, /**< no caching, no core dump */ 127f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_SHM = 2, /**< shared, cached */ 128f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_AGP = 3, /**< AGP/GART */ 129f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_SCATTER_GATHER = 4, /**< PCI scatter/gather */ 130f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CONSISTENT = 5 /**< PCI consistent */ 131f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmMapType; 132f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 133f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 134f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_RESTRICTED = 0x0001, /**< Cannot be mapped to client-virtual */ 135f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_READ_ONLY = 0x0002, /**< Read-only in client-virtual */ 136f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_LOCKED = 0x0004, /**< Physical pages locked */ 137f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_KERNEL = 0x0008, /**< Kernel requires access */ 138f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_WRITE_COMBINING = 0x0010, /**< Use write-combining, if available */ 139f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CONTAINS_LOCK = 0x0020, /**< SHM page that contains lock */ 140f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_REMOVABLE = 0x0040 /**< Removable mapping */ 141f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmMapFlags; 142f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 143f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/** 144f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * \warning These values *MUST* match drm.h 145f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 146f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 147f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /** \name Flags for DMA buffer dispatch */ 148f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*@{*/ 149f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_BLOCK = 0x01, /**< 150f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Block until buffer dispatched. 151f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 152f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * \note the buffer may not yet have been 153f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * processed by the hardware -- getting a 154f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * hardware lock with the hardware quiescent 155f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * will ensure that the buffer has been 156f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * processed. 157f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 158f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */ 159f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */ 160f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*@}*/ 161f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 162f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /** \name Flags for DMA buffer request */ 163f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*@{*/ 164f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */ 165f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */ 166f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */ 167f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*@}*/ 168f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmDMAFlags; 169f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 170f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 171f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_PAGE_ALIGN = 0x01, 172f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_AGP_BUFFER = 0x02, 173f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_SG_BUFFER = 0x04, 174f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_FB_BUFFER = 0x08, 175f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_PCI_BUFFER_RO = 0x10 176f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmBufDescFlags; 177f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 178f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 179f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */ 180f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */ 181f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */ 182f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */ 183f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* These *HALT* flags aren't supported yet 184f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu -- they will be used to support the 185f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu full-screen DGA-like mode. */ 186f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */ 187f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */ 188f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmLockFlags; 189f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 190f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 191f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CONTEXT_PRESERVED = 0x01, /**< This context is preserved and 192f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu never swapped. */ 193f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CONTEXT_2DONLY = 0x02 /**< This context is for 2D rendering only. */ 194f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drm_context_tFlags, *drm_context_tFlagsPtr; 195f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 196f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmBufDesc { 197f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int count; /**< Number of buffers of this size */ 198f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int size; /**< Size in bytes */ 199f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int low_mark; /**< Low water mark */ 200f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int high_mark; /**< High water mark */ 201f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmBufDesc, *drmBufDescPtr; 202f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 203f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmBufInfo { 204f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int count; /**< Number of buffers described in list */ 205f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmBufDescPtr list; /**< List of buffer descriptions */ 206f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmBufInfo, *drmBufInfoPtr; 207f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 208f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmBuf { 209f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int idx; /**< Index into the master buffer list */ 210f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int total; /**< Buffer size */ 211f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int used; /**< Amount of buffer in use (for DMA) */ 212f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmAddress address; /**< Address */ 213f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmBuf, *drmBufPtr; 214f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 215f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/** 216f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Buffer mapping information. 217f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * 218f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Used by drmMapBufs() and drmUnmapBufs() to store information about the 219f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * mapped buffers. 220f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 221f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmBufMap { 222f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int count; /**< Number of buffers mapped */ 223f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmBufPtr list; /**< Buffers */ 224f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmBufMap, *drmBufMapPtr; 225f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 226f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmLock { 227f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu volatile unsigned int lock; 228f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu char padding[60]; 229f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* This is big enough for most current (and future?) architectures: 230f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DEC Alpha: 32 bytes 231f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Intel Merced: ? 232f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Intel P5/PPro/PII/PIII: 32 bytes 233f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Intel StrongARM: 32 bytes 234f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Intel i386/i486: 16 bytes 235f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu MIPS: 32 bytes (?) 236f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Motorola 68k: 16 bytes 237f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Motorola PowerPC: 32 bytes 238f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu Sun SPARC: 32 bytes 239f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 240f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmLock, *drmLockPtr; 241f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 242f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/** 243f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * Indices here refer to the offset into 244f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu * list in drmBufInfo 245f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu */ 246f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmDMAReq { 247f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_context_t context; /**< Context handle */ 248f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int send_count; /**< Number of buffers to send */ 249f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *send_list; /**< List of handles to buffers */ 250f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *send_sizes; /**< Lengths of data to send, in bytes */ 251f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmDMAFlags flags; /**< Flags */ 252f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int request_count; /**< Number of buffers requested */ 253f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int request_size; /**< Desired size of buffers requested */ 254f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *request_list; /**< Buffer information */ 255f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *request_sizes; /**< Minimum acceptable sizes */ 256f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int granted_count; /**< Number of buffers granted at this size */ 257f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmDMAReq, *drmDMAReqPtr; 258f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 259f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmRegion { 260f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t handle; 261f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int offset; 262f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmSize size; 263f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmAddress map; 264f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmRegion, *drmRegionPtr; 265f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 266f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmTextureRegion { 267f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned char next; 268f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned char prev; 269f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned char in_use; 270f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned char padding; /**< Explicitly pad this out */ 271f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int age; 272f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmTextureRegion, *drmTextureRegionPtr; 273f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 274f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 275f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef enum { 276f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */ 277f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */ 278f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */ 279f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */ 280f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */ 281f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */ 282f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmVBlankSeqType; 283f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 284f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmVBlankReq { 285f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmVBlankSeqType type; 286f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int sequence; 287f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long signal; 288f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmVBlankReq, *drmVBlankReqPtr; 289f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 290f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmVBlankReply { 291f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmVBlankSeqType type; 292f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int sequence; 293f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu long tval_sec; 294f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu long tval_usec; 295f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmVBlankReply, *drmVBlankReplyPtr; 296f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 297f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef union _drmVBlank { 298f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmVBlankReq request; 299f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmVBlankReply reply; 300f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmVBlank, *drmVBlankPtr; 301f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 302f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryutypedef struct _drmSetVersion { 303f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int drm_di_major; 304f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int drm_di_minor; 305f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int drm_dd_major; 306f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int drm_dd_minor; 307f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} drmSetVersion, *drmSetVersionPtr; 308f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 309f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock) 310f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 311f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */ 312f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */ 313f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 314f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#if defined(__GNUC__) && (__GNUC__ >= 2) 315f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu# if defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__) 316f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* Reflect changes here to drmP.h */ 317f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,__ret) \ 318f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 319f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int __dummy; /* Can't mark eax as clobbered */ \ 320f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __asm__ __volatile__( \ 321f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "lock ; cmpxchg %4,%1\n\t" \ 322f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "setnz %0" \ 323f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "=d" (__ret), \ 324f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "=m" (__drm_dummy_lock(lock)), \ 325f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "=a" (__dummy) \ 326f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "2" (old), \ 327f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "r" (new)); \ 328f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (0) 329f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 330f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#elif defined(__alpha__) 331f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 332f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock, old, new, ret) \ 333f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 334f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int tmp, old32; \ 335f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __asm__ __volatile__( \ 336f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " addl $31, %5, %3\n" \ 337f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "1: ldl_l %0, %2\n" \ 338f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " cmpeq %0, %3, %1\n" \ 339f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " beq %1, 2f\n" \ 340f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " mov %4, %0\n" \ 341f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " stl_c %0, %2\n" \ 342f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " beq %0, 3f\n" \ 343f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " mb\n" \ 344f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "2: cmpeq %1, 0, %1\n" \ 345f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu ".subsection 2\n" \ 346f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "3: br 1b\n" \ 347f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu ".previous" \ 348f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "=&r"(tmp), "=&r"(ret), \ 349f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "=m"(__drm_dummy_lock(lock)), \ 350f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "=&r"(old32) \ 351f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "r"(new), "r"(old) \ 352f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "memory"); \ 353f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (0) 354f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 355f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#elif defined(__sparc__) 356f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 357f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,__ret) \ 358f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryudo { register unsigned int __old __asm("o0"); \ 359f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu register unsigned int __new __asm("o1"); \ 360f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu register volatile unsigned int *__lock __asm("o2"); \ 361f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __old = old; \ 362f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __new = new; \ 363f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __lock = (volatile unsigned int *)lock; \ 364f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __asm__ __volatile__( \ 365f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*"cas [%2], %3, %0"*/ \ 366f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu ".word 0xd3e29008\n\t" \ 367f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /*"membar #StoreStore | #StoreLoad"*/ \ 368f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu ".word 0x8143e00a" \ 369f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "=&r" (__new) \ 370f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "0" (__new), \ 371f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "r" (__lock), \ 372f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "r" (__old) \ 373f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "memory"); \ 374f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __ret = (__new != __old); \ 375f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu} while(0) 376f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 377f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#elif defined(__ia64__) 378f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 379f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#ifdef __INTEL_COMPILER 380f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* this currently generates bad code (missing stop bits)... */ 381f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#include <ia64intrin.h> 382f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 383f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,__ret) \ 384f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 385f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long __result, __old = (old) & 0xffffffff; \ 386f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __mf(); \ 387f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __result = _InterlockedCompareExchange_acq(&__drm_dummy_lock(lock), (new), __old);\ 388f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __ret = (__result) != (__old); \ 389f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* __ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \ 390f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu (old), (new)) \ 391f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu != (old)); */\ 392f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (0) 393f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 394f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#else 395f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,__ret) \ 396f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 397f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int __result, __old = (old); \ 398f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __asm__ __volatile__( \ 399f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "mf\n" \ 400f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "mov ar.ccv=%2\n" \ 401f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu ";;\n" \ 402f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "cmpxchg4.acq %0=%1,%3,ar.ccv" \ 403f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "=r" (__result), "=m" (__drm_dummy_lock(lock)) \ 404f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "r" ((unsigned long)__old), "r" (new) \ 405f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "memory"); \ 406f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __ret = (__result) != (__old); \ 407f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (0) 408f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 409f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif 410f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 411f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#elif defined(__powerpc__) 412f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 413f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,__ret) \ 414f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 415f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __asm__ __volatile__( \ 416f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "sync;" \ 417f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "0: lwarx %0,0,%1;" \ 418f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " xor. %0,%3,%0;" \ 419f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " bne 1f;" \ 420f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " stwcx. %2,0,%1;" \ 421f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu " bne- 0b;" \ 422f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "1: " \ 423f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu "sync;" \ 424f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "=&r"(__ret) \ 425f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "r"(lock), "r"(new), "r"(old) \ 426f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu : "cr0", "memory"); \ 427f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (0) 428f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 429f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif /* architecture */ 430f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif /* __GNUC__ >= 2 */ 431f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 432f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#ifndef DRM_CAS 433f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */ 434f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif 435f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 436f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#if defined(__alpha__) 437f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS_RESULT(_result) long _result 438f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#elif defined(__powerpc__) 439f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS_RESULT(_result) int _result 440f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#else 441f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_CAS_RESULT(_result) char _result 442f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif 443f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 444f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_LIGHT_LOCK(fd,lock,context) \ 445f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 446f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 447f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \ 448f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (__ret) drmGetLock(fd,context,0); \ 449f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 450f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 451f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* This one counts fast locks -- for 452f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu benchmarking only. */ 453f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count) \ 454f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 455f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 456f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \ 457f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (__ret) drmGetLock(fd,context,0); \ 458f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu else ++count; \ 459f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 460f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 461f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_LOCK(fd,lock,context,flags) \ 462f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 463f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (flags) drmGetLock(fd,context,flags); \ 464f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu else DRM_LIGHT_LOCK(fd,lock,context); \ 465f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 466f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 467f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_UNLOCK(fd,lock,context) \ 468f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 469f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 470f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret); \ 471f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (__ret) drmUnlock(fd,context); \ 472f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 473f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 474f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu /* Simple spin locks */ 475f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_SPINLOCK(spin,val) \ 476f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 477f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 478f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 479f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(spin,0,val,__ret); \ 480f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (__ret) while ((spin)->lock); \ 481f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (__ret); \ 482f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 483f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 484f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_SPINLOCK_TAKE(spin,val) \ 485f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 486f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 487f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int cur; \ 488f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 489f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu cur = (*spin).lock; \ 490f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(spin,cur,val,__ret); \ 491f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (__ret); \ 492f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 493f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 494f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_SPINLOCK_COUNT(spin,val,count,__ret) \ 495f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 496f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int __i; \ 497f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu __ret = 1; \ 498f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu for (__i = 0; __ret && __i < count; __i++) { \ 499f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(spin,0,val,__ret); \ 500f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if (__ret) for (;__i < count && (spin)->lock; __i++); \ 501f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } \ 502f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 503f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 504f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#define DRM_SPINUNLOCK(spin,val) \ 505f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 506f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS_RESULT(__ret); \ 507f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu if ((*spin).lock == val) { /* else server stole lock */ \ 508f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu do { \ 509f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu DRM_CAS(spin,val,0,__ret); \ 510f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while (__ret); \ 511f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } \ 512f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu } while(0) 513f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 514f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 515f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 516f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* General user-level programmer's API: unprivileged */ 517f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAvailable(void); 518f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmOpen(const char *name, const char *busid); 519f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmOpenControl(int minor); 520f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmClose(int fd); 521f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drmVersionPtr drmGetVersion(int fd); 522f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drmVersionPtr drmGetLibVersion(int fd); 523f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmFreeVersion(drmVersionPtr); 524f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetMagic(int fd, drm_magic_t * magic); 525f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern char *drmGetBusid(int fd); 526f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetInterruptFromBusID(int fd, int busnum, int devnum, 527f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int funcnum); 528f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetMap(int fd, int idx, drm_handle_t *offset, 529f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmSize *size, drmMapType *type, 530f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmMapFlags *flags, drm_handle_t *handle, 531f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *mtrr); 532f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetClient(int fd, int idx, int *auth, int *pid, 533f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int *uid, unsigned long *magic, 534f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long *iocs); 535f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetStats(int fd, drmStatsT *stats); 536f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSetInterfaceVersion(int fd, drmSetVersion *version); 537f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCommandNone(int fd, unsigned long drmCommandIndex); 538f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCommandRead(int fd, unsigned long drmCommandIndex, 539f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void *data, unsigned long size); 540f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCommandWrite(int fd, unsigned long drmCommandIndex, 541f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void *data, unsigned long size); 542f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCommandWriteRead(int fd, unsigned long drmCommandIndex, 543f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu void *data, unsigned long size); 544f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 545f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* General user-level programmer's API: X server (root) only */ 546f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmFreeBusid(const char *busid); 547f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSetBusid(int fd, const char *busid); 548f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAuthMagic(int fd, drm_magic_t magic); 549f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAddMap(int fd, 550f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t offset, 551f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmSize size, 552f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmMapType type, 553f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmMapFlags flags, 554f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t * handle); 555f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmRmMap(int fd, drm_handle_t handle); 556f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, 557f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t handle); 558f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 559f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAddBufs(int fd, int count, int size, 560f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmBufDescFlags flags, 561f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu int agp_offset); 562f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmMarkBufs(int fd, double low, double high); 563f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCreateContext(int fd, drm_context_t * handle); 564f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSetContextFlags(int fd, drm_context_t context, 565f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_context_tFlags flags); 566f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetContextFlags(int fd, drm_context_t context, 567f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_context_tFlagsPtr flags); 568f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAddContextTag(int fd, drm_context_t context, void *tag); 569f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmDelContextTag(int fd, drm_context_t context); 570f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmGetContextTag(int fd, drm_context_t context); 571f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drm_context_t * drmGetReservedContextList(int fd, int *count); 572f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmFreeReservedContextList(drm_context_t *); 573f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSwitchToContext(int fd, drm_context_t context); 574f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmDestroyContext(int fd, drm_context_t handle); 575f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCreateDrawable(int fd, drm_drawable_t * handle); 576f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmDestroyDrawable(int fd, drm_drawable_t handle); 577f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmUpdateDrawableInfo(int fd, drm_drawable_t handle, 578f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_drawable_info_type_t type, 579f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned int num, void *data); 580f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCtlInstHandler(int fd, int irq); 581f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmCtlUninstHandler(int fd); 582f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 583f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* General user-level programmer's API: authenticated client and/or X */ 584f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmMap(int fd, 585f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t handle, 586f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmSize size, 587f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmAddressPtr address); 588f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmUnmap(drmAddress address, drmSize size); 589f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drmBufInfoPtr drmGetBufInfo(int fd); 590f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern drmBufMapPtr drmMapBufs(int fd); 591f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmUnmapBufs(drmBufMapPtr bufs); 592f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmDMA(int fd, drmDMAReqPtr request); 593f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmFreeBufs(int fd, int count, int *list); 594f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetLock(int fd, 595f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_context_t context, 596f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drmLockFlags flags); 597f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmUnlock(int fd, drm_context_t context); 598f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmFinish(int fd, int context, drmLockFlags flags); 599f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 600f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t * handle); 601f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 602f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* AGP/GART support: X server (root) only */ 603f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpAcquire(int fd); 604f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpRelease(int fd); 605f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpEnable(int fd, unsigned long mode); 606f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpAlloc(int fd, unsigned long size, 607f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long type, unsigned long *address, 608f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t *handle); 609f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpFree(int fd, drm_handle_t handle); 610f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpBind(int fd, drm_handle_t handle, 611f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long offset); 612f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpUnbind(int fd, drm_handle_t handle); 613f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 614f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* AGP/GART info: authenticated client and/or X */ 615f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpVersionMajor(int fd); 616f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmAgpVersionMinor(int fd); 617f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmAgpGetMode(int fd); 618f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmAgpBase(int fd); /* Physical location */ 619f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmAgpSize(int fd); /* Bytes */ 620f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmAgpMemoryUsed(int fd); 621f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmAgpMemoryAvail(int fd); 622f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned int drmAgpVendorId(int fd); 623f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned int drmAgpDeviceId(int fd); 624f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 625f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* PCI scatter/gather support: X server (root) only */ 626f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmScatterGatherAlloc(int fd, unsigned long size, 627f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu drm_handle_t *handle); 628f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmScatterGatherFree(int fd, drm_handle_t handle); 629f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 630f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmWaitVBlank(int fd, drmVBlankPtr vbl); 631f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 632f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* Support routines */ 633f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmSetServerInfo(drmServerInfoPtr info); 634f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmError(int err, const char *label); 635f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmMalloc(int size); 636f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmFree(void *pt); 637f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 638f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* Hash table routines */ 639f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmHashCreate(void); 640f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashDestroy(void *t); 641f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashLookup(void *t, unsigned long key, void **value); 642f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashInsert(void *t, unsigned long key, void *value); 643f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashDelete(void *t, unsigned long key); 644f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashFirst(void *t, unsigned long *key, void **value); 645f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmHashNext(void *t, unsigned long *key, void **value); 646f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 647f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* PRNG routines */ 648f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmRandomCreate(unsigned long seed); 649f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmRandomDestroy(void *state); 650f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern unsigned long drmRandom(void *state); 651f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern double drmRandomDouble(void *state); 652f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 653f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu/* Skip list routines */ 654f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 655f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void *drmSLCreate(void); 656f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLDestroy(void *l); 657f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLLookup(void *l, unsigned long key, void **value); 658f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLInsert(void *l, unsigned long key, void *value); 659f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLDelete(void *l, unsigned long key); 660f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLNext(void *l, unsigned long *key, void **value); 661f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLFirst(void *l, unsigned long *key, void **value); 662f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmSLDump(void *l); 663f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSLLookupNeighbors(void *l, unsigned long key, 664f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long *prev_key, void **prev_value, 665f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu unsigned long *next_key, void **next_value); 666f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 667f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmOpenOnce(void *unused, const char *BusID, int *newlyopened); 668f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmCloseOnce(int fd); 669f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern void drmMsg(const char *format, ...); 670f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 671f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmSetMaster(int fd); 672f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryuextern int drmDropMaster(int fd); 673f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu 674ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu#if defined(__cplusplus) || defined(c_plusplus) 675ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu} 676ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu#endif 677ba11a2fc2212d1515016ae5b0e1754554789318bJason Hu 678f0352d4fde4ec179ffe04c3f834199d3bad36087Ho-Eun Ryu#endif 679