1
/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*-
2
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
4
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
8
* Permission is hereby granted, free of charge, to any person obtaining a
9
* copy of this software and associated documentation files (the "Software"),
10
* to deal in the Software without restriction, including without limitation
11
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
* and/or sell copies of the Software, and to permit persons to whom the
13
* Software is furnished to do so, subject to the following conditions:
15
* The above copyright notice and this permission notice (including the next
16
* paragraph) shall be included in all copies or substantial portions of the
19
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22
* VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25
* OTHER DEALINGS IN THE SOFTWARE.
28
* Rickard E. (Rik) Faith <faith@valinux.com>
31
* Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
38
#if defined(__linux__)
39
#include <linux/config.h>
40
#include <asm/ioctl.h> /* For _IO* macros */
41
#define DRM_IOCTL_NR(n) _IOC_NR(n)
42
#define DRM_IOC_VOID _IOC_NONE
43
#define DRM_IOC_READ _IOC_READ
44
#define DRM_IOC_WRITE _IOC_WRITE
45
#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
46
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
47
#elif defined(__FreeBSD__) || defined(__NetBSD__)
48
#if defined(__FreeBSD__) && defined(XFree86Server)
49
/* Prevent name collision when including sys/ioccom.h */
51
#include <sys/ioccom.h>
52
#define ioctl(a,b,c) xf86ioctl(a,b,c)
54
#include <sys/ioccom.h>
55
#endif /* __FreeBSD__ && xf86ioctl */
56
#define DRM_IOCTL_NR(n) ((n) & 0xff)
57
#define DRM_IOC_VOID IOC_VOID
58
#define DRM_IOC_READ IOC_OUT
59
#define DRM_IOC_WRITE IOC_IN
60
#define DRM_IOC_READWRITE IOC_INOUT
61
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
64
#define XFREE86_VERSION(major,minor,patch,snap) \
65
((major << 16) | (minor << 8) | patch)
67
#ifndef CONFIG_XFREE86_VERSION
68
#define CONFIG_XFREE86_VERSION XFREE86_VERSION(4,1,0,0)
71
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
72
#define DRM_PROC_DEVICES "/proc/devices"
73
#define DRM_PROC_MISC "/proc/misc"
74
#define DRM_PROC_DRM "/proc/drm"
75
#define DRM_DEV_DRM "/dev/drm"
76
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
81
#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0)
83
#define DRM_MAX_MINOR 15
85
#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */
86
#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */
87
#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */
88
#define DRM_RAM_PERCENT 10 /* How much system ram can we lock? */
90
#define _DRM_LOCK_HELD 0x80000000 /* Hardware lock is held */
91
#define _DRM_LOCK_CONT 0x40000000 /* Hardware lock is contended */
92
#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD)
93
#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
94
#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
96
typedef unsigned long drm_handle_t;
97
typedef unsigned int drm_context_t;
98
typedef unsigned int drm_drawable_t;
99
typedef unsigned int drm_magic_t;
101
/* Warning: If you change this structure, make sure you change
102
* XF86DRIClipRectRec in the server as well */
104
/* KW: Actually it's illegal to change either for
105
* backwards-compatibility reasons.
108
typedef struct drm_clip_rect {
115
typedef struct drm_tex_region {
118
unsigned char in_use;
119
unsigned char padding;
123
typedef struct drm_version {
124
int version_major; /* Major version */
125
int version_minor; /* Minor version */
126
int version_patchlevel;/* Patch level */
127
size_t name_len; /* Length of name buffer */
128
char *name; /* Name of driver */
129
size_t date_len; /* Length of date buffer */
130
char *date; /* User-space buffer to hold date */
131
size_t desc_len; /* Length of desc buffer */
132
char *desc; /* User-space buffer to hold desc */
135
typedef struct drm_unique {
136
size_t unique_len; /* Length of unique */
137
char *unique; /* Unique name for driver instantiation */
140
typedef struct drm_list {
141
int count; /* Length of user-space structures */
142
drm_version_t *version;
145
typedef struct drm_block {
149
typedef struct drm_control {
159
typedef enum drm_map_type {
160
_DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */
161
_DRM_REGISTERS = 1, /* no caching, no core dump */
162
_DRM_SHM = 2, /* shared, cached */
163
_DRM_AGP = 3, /* AGP/GART */
164
_DRM_SCATTER_GATHER = 4 /* Scatter/gather memory for PCI DMA */
167
typedef enum drm_map_flags {
168
_DRM_RESTRICTED = 0x01, /* Cannot be mapped to user-virtual */
169
_DRM_READ_ONLY = 0x02,
170
_DRM_LOCKED = 0x04, /* shared, cached, locked */
171
_DRM_KERNEL = 0x08, /* kernel requires access */
172
_DRM_WRITE_COMBINING = 0x10, /* use write-combining if available */
173
_DRM_CONTAINS_LOCK = 0x20, /* SHM page that contains lock */
174
_DRM_REMOVABLE = 0x40 /* Removable mapping */
177
typedef struct drm_ctx_priv_map {
178
unsigned int ctx_id; /* Context requesting private mapping */
179
void *handle; /* Handle of map */
180
} drm_ctx_priv_map_t;
182
typedef struct drm_map {
183
unsigned long offset; /* Requested physical address (0 for SAREA)*/
184
unsigned long size; /* Requested physical size (bytes) */
185
drm_map_type_t type; /* Type of memory to map */
186
drm_map_flags_t flags; /* Flags */
187
void *handle; /* User-space: "Handle" to pass to mmap */
188
/* Kernel-space: kernel-virtual address */
189
int mtrr; /* MTRR slot used */
193
typedef struct drm_client {
194
int idx; /* Which client desired? */
195
int auth; /* Is client authenticated? */
196
unsigned long pid; /* Process id */
197
unsigned long uid; /* User id */
198
unsigned long magic; /* Magic */
199
unsigned long iocs; /* Ioctl count */
209
_DRM_STAT_VALUE, /* Generic value */
210
_DRM_STAT_BYTE, /* Generic byte counter (1024bytes/K) */
211
_DRM_STAT_COUNT, /* Generic non-byte counter (1000/k) */
213
_DRM_STAT_IRQ, /* IRQ */
214
_DRM_STAT_PRIMARY, /* Primary DMA bytes */
215
_DRM_STAT_SECONDARY, /* Secondary DMA bytes */
216
_DRM_STAT_DMA, /* DMA */
217
_DRM_STAT_SPECIAL, /* Special DMA (e.g., priority or polled) */
218
_DRM_STAT_MISSED /* Missed DMA opportunity */
220
/* Add to the *END* of the list */
223
typedef struct drm_stats {
227
drm_stat_type_t type;
231
typedef enum drm_lock_flags {
232
_DRM_LOCK_READY = 0x01, /* Wait until hardware is ready for DMA */
233
_DRM_LOCK_QUIESCENT = 0x02, /* Wait until hardware quiescent */
234
_DRM_LOCK_FLUSH = 0x04, /* Flush this context's DMA queue first */
235
_DRM_LOCK_FLUSH_ALL = 0x08, /* Flush all DMA queues first */
236
/* These *HALT* flags aren't supported yet
237
-- they will be used to support the
238
full-screen DGA-like mode. */
239
_DRM_HALT_ALL_QUEUES = 0x10, /* Halt all current and future queues */
240
_DRM_HALT_CUR_QUEUES = 0x20 /* Halt all current queues */
243
typedef struct drm_lock {
245
drm_lock_flags_t flags;
248
typedef enum drm_dma_flags { /* These values *MUST* match xf86drm.h */
249
/* Flags for DMA buffer dispatch */
250
_DRM_DMA_BLOCK = 0x01, /* Block until buffer dispatched.
251
Note, the buffer may not yet have
252
been processed by the hardware --
253
getting a hardware lock with the
254
hardware quiescent will ensure
255
that the buffer has been
257
_DRM_DMA_WHILE_LOCKED = 0x02, /* Dispatch while lock held */
258
_DRM_DMA_PRIORITY = 0x04, /* High priority dispatch */
260
/* Flags for DMA buffer request */
261
_DRM_DMA_WAIT = 0x10, /* Wait for free buffers */
262
_DRM_DMA_SMALLER_OK = 0x20, /* Smaller-than-requested buffers ok */
263
_DRM_DMA_LARGER_OK = 0x40 /* Larger-than-requested buffers ok */
266
typedef struct drm_buf_desc {
267
int count; /* Number of buffers of this size */
268
int size; /* Size in bytes */
269
int low_mark; /* Low water mark */
270
int high_mark; /* High water mark */
272
_DRM_PAGE_ALIGN = 0x01, /* Align on page boundaries for DMA */
273
_DRM_AGP_BUFFER = 0x02, /* Buffer is in agp space */
274
_DRM_SG_BUFFER = 0x04 /* Scatter/gather memory buffer */
276
unsigned long agp_start; /* Start address of where the agp buffers
277
* are in the agp aperture */
280
typedef struct drm_buf_info {
281
int count; /* Entries in list */
282
drm_buf_desc_t *list;
285
typedef struct drm_buf_free {
290
typedef struct drm_buf_pub {
291
int idx; /* Index into master buflist */
292
int total; /* Buffer size */
293
int used; /* Amount of buffer in use (for DMA) */
294
void *address; /* Address of buffer */
297
typedef struct drm_buf_map {
298
int count; /* Length of buflist */
299
void *virtual; /* Mmaped area in user-virtual */
300
drm_buf_pub_t *list; /* Buffer information */
303
typedef struct drm_dma {
304
/* Indices here refer to the offset into
305
buflist in drm_buf_get_t. */
306
int context; /* Context handle */
307
int send_count; /* Number of buffers to send */
308
int *send_indices; /* List of handles to buffers */
309
int *send_sizes; /* Lengths of data to send */
310
drm_dma_flags_t flags; /* Flags */
311
int request_count; /* Number of buffers requested */
312
int request_size; /* Desired size for buffers */
313
int *request_indices; /* Buffer information */
315
int granted_count; /* Number of buffers granted */
319
_DRM_CONTEXT_PRESERVED = 0x01,
320
_DRM_CONTEXT_2DONLY = 0x02
323
typedef struct drm_ctx {
324
drm_context_t handle;
325
drm_ctx_flags_t flags;
328
typedef struct drm_ctx_res {
333
typedef struct drm_draw {
334
drm_drawable_t handle;
337
typedef struct drm_auth {
341
typedef struct drm_irq_busid {
349
_DRM_VBLANK_ABSOLUTE = 0x0, /* Wait for specific vblank sequence number */
350
_DRM_VBLANK_RELATIVE = 0x1, /* Wait for given number of vblanks */
351
_DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */
352
} drm_vblank_seq_type_t;
354
#define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL
356
struct drm_wait_vblank_request {
357
drm_vblank_seq_type_t type;
358
unsigned int sequence;
359
unsigned long signal;
362
struct drm_wait_vblank_reply {
363
drm_vblank_seq_type_t type;
364
unsigned int sequence;
369
typedef union drm_wait_vblank {
370
struct drm_wait_vblank_request request;
371
struct drm_wait_vblank_reply reply;
374
typedef struct drm_agp_mode {
378
/* For drm_agp_alloc -- allocated a buffer */
379
typedef struct drm_agp_buffer {
380
unsigned long size; /* In bytes -- will round to page boundary */
381
unsigned long handle; /* Used for BIND/UNBIND ioctls */
382
unsigned long type; /* Type of memory to allocate */
383
unsigned long physical; /* Physical used by i810 */
386
/* For drm_agp_bind */
387
typedef struct drm_agp_binding {
388
unsigned long handle; /* From drm_agp_buffer */
389
unsigned long offset; /* In bytes -- will round to page boundary */
392
typedef struct drm_agp_info {
393
int agp_version_major;
394
int agp_version_minor;
396
unsigned long aperture_base; /* physical address */
397
unsigned long aperture_size; /* bytes */
398
unsigned long memory_allowed; /* bytes */
399
unsigned long memory_used;
401
/* PCI information */
402
unsigned short id_vendor;
403
unsigned short id_device;
406
typedef struct drm_scatter_gather {
407
unsigned long size; /* In bytes -- will round to page boundary */
408
unsigned long handle; /* Used for mapping / unmapping */
409
} drm_scatter_gather_t;
411
#define DRM_IOCTL_BASE 'd'
412
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
413
#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
414
#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
415
#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
417
#define DRM_IOCTL_VERSION DRM_IOWR(0x00, drm_version_t)
418
#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm_unique_t)
419
#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, drm_auth_t)
420
#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, drm_irq_busid_t)
421
#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, drm_map_t)
422
#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, drm_client_t)
423
#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, drm_stats_t)
425
#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm_unique_t)
426
#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, drm_auth_t)
427
#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, drm_block_t)
428
#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, drm_block_t)
429
#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, drm_control_t)
430
#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, drm_map_t)
431
#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, drm_buf_desc_t)
432
#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, drm_buf_desc_t)
433
#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm_buf_info_t)
434
#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm_buf_map_t)
435
#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm_buf_free_t)
437
#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, drm_map_t)
439
#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, drm_ctx_priv_map_t)
440
#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, drm_ctx_priv_map_t)
442
#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, drm_ctx_t)
443
#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, drm_ctx_t)
444
#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, drm_ctx_t)
445
#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, drm_ctx_t)
446
#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, drm_ctx_t)
447
#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, drm_ctx_t)
448
#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, drm_ctx_res_t)
449
#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, drm_draw_t)
450
#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, drm_draw_t)
451
#define DRM_IOCTL_DMA DRM_IOWR(0x29, drm_dma_t)
452
#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, drm_lock_t)
453
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t)
454
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t)
456
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
457
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
458
#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, drm_agp_mode_t)
459
#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, drm_agp_info_t)
460
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t)
461
#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t)
462
#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, drm_agp_binding_t)
463
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t)
465
#define DRM_IOCTL_SG_ALLOC DRM_IOW( 0x38, drm_scatter_gather_t)
466
#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, drm_scatter_gather_t)
468
#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, drm_wait_vblank_t)
470
/* Device specfic ioctls should only be in their respective headers
471
* The device specific ioctl range is 0x40 to 0x79. */
472
#define DRM_COMMAND_BASE 0x40