Add support for a bunch of DRM Ioctls.  Fixes #207815.
(Robert Bragg, bob@o-hand.com)


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13486 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/include/vki/vki-linux-drm.h b/include/vki/vki-linux-drm.h
new file mode 100644
index 0000000..8bd0746
--- /dev/null
+++ b/include/vki/vki-linux-drm.h
@@ -0,0 +1,810 @@
+/*
+ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
+ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
+ * Copyright (c) 2003-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
+ * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
+ * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com>
+ * Copyright (c) 2007-2008 Intel Corporation
+ * Copyright (c) 2008 Red Hat Inc.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef __VKI_LINUX_DRM_H
+#define __VKI_LINUX_DRM_H
+
+//----------------------------------------------------------------------
+// From include/drm/drm.h
+//----------------------------------------------------------------------
+
+typedef unsigned int vki_drm_context_t;
+typedef unsigned int vki_drm_drawable_t;
+typedef unsigned int vki_drm_magic_t;
+
+struct vki_drm_clip_rect {
+	unsigned short x1;
+	unsigned short y1;
+	unsigned short x2;
+	unsigned short y2;
+};
+struct vki_drm_version {
+	int version_major;	  /**< Major version */
+	int version_minor;	  /**< Minor version */
+	int version_patchlevel;	  /**< Patch level */
+	vki_size_t name_len;	  /**< Length of name buffer */
+	char __user *name;	  /**< Name of driver */
+	vki_size_t date_len;	  /**< Length of date buffer */
+	char __user *date;	  /**< User-space buffer to hold date */
+	vki_size_t desc_len;	  /**< Length of desc buffer */
+	char __user *desc;	  /**< User-space buffer to hold desc */
+};
+struct vki_drm_unique {
+	vki_size_t unique_len;	  /**< Length of unique */
+	char __user *unique;	  /**< Unique name for driver instantiation */
+};
+struct vki_drm_block {
+	int unused;
+};
+struct vki_drm_control {
+	enum {
+		VKI_DRM_ADD_COMMAND,
+		VKI_DRM_RM_COMMAND,
+		VKI_DRM_INST_HANDLER,
+		VKI_DRM_UNINST_HANDLER
+	} func;
+	int irq;
+};
+
+enum vki_drm_map_type {
+	_VKI_DRM_FRAME_BUFFER = 0,	  /**< WC (no caching), no core dump */
+	_VKI_DRM_REGISTERS = 1,	  /**< no caching, no core dump */
+	_VKI_DRM_SHM = 2,		  /**< shared, cached */
+	_VKI_DRM_AGP = 3,		  /**< AGP/GART */
+	_VKI_DRM_SCATTER_GATHER = 4,  /**< Scatter/gather memory for PCI DMA */
+	_VKI_DRM_CONSISTENT = 5,	  /**< Consistent memory for PCI DMA */
+	_VKI_DRM_GEM = 6,		  /**< GEM object */
+};
+enum vki_drm_map_flags {
+	_VKI_DRM_RESTRICTED = 0x01,	     /**< Cannot be mapped to user-virtual */
+	_VKI_DRM_READ_ONLY = 0x02,
+	_VKI_DRM_LOCKED = 0x04,	     /**< shared, cached, locked */
+	_VKI_DRM_KERNEL = 0x08,	     /**< kernel requires access */
+	_VKI_DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
+	_VKI_DRM_CONTAINS_LOCK = 0x20,   /**< SHM page that contains lock */
+	_VKI_DRM_REMOVABLE = 0x40,	     /**< Removable mapping */
+	_VKI_DRM_DRIVER = 0x80	     /**< Managed by driver */
+};
+struct vki_drm_ctx_priv_map {
+	unsigned int ctx_id;	 /**< Context requesting private mapping */
+	void *handle;		 /**< Handle of map */
+};
+struct vki_drm_map {
+	unsigned long offset;	 /**< Requested physical address (0 for SAREA)*/
+	unsigned long size;	 /**< Requested physical size (bytes) */
+	enum vki_drm_map_type type;	 /**< Type of memory to map */
+	enum vki_drm_map_flags flags;	 /**< Flags */
+	void *handle;		 /**< User-space: "Handle" to pass to mmap() */
+				 /**< Kernel-space: kernel-virtual address */
+	int mtrr;		 /**< MTRR slot used */
+	/*   Private data */
+};
+struct vki_drm_client {
+	int idx;		/**< Which client desired? */
+	int auth;		/**< Is client authenticated? */
+	unsigned long pid;	/**< Process ID */
+	unsigned long uid;	/**< User ID */
+	unsigned long magic;	/**< Magic */
+	unsigned long iocs;	/**< Ioctl count */
+};
+enum vki_drm_stat_type {
+	_VKI_DRM_STAT_LOCK,
+	_VKI_DRM_STAT_OPENS,
+	_VKI_DRM_STAT_CLOSES,
+	_VKI_DRM_STAT_IOCTLS,
+	_VKI_DRM_STAT_LOCKS,
+	_VKI_DRM_STAT_UNLOCKS,
+	_VKI_DRM_STAT_VALUE,	/**< Generic value */
+	_VKI_DRM_STAT_BYTE,		/**< Generic byte counter (1024bytes/K) */
+	_VKI_DRM_STAT_COUNT,	/**< Generic non-byte counter (1000/k) */
+
+	_VKI_DRM_STAT_IRQ,		/**< IRQ */
+	_VKI_DRM_STAT_PRIMARY,	/**< Primary DMA bytes */
+	_VKI_DRM_STAT_SECONDARY,	/**< Secondary DMA bytes */
+	_VKI_DRM_STAT_DMA,		/**< DMA */
+	_VKI_DRM_STAT_SPECIAL,	/**< Special DMA (e.g., priority or polled) */
+	_VKI_DRM_STAT_MISSED	/**< Missed DMA opportunity */
+	    /* Add to the *END* of the list */
+};
+struct vki_drm_stats {
+	unsigned long count;
+	struct {
+		unsigned long value;
+		enum vki_drm_stat_type type;
+	} data[15];
+};
+enum vki_drm_lock_flags {
+	_VKI_DRM_LOCK_READY = 0x01,	     /**< Wait until hardware is ready for DMA */
+	_VKI_DRM_LOCK_QUIESCENT = 0x02,  /**< Wait until hardware quiescent */
+	_VKI_DRM_LOCK_FLUSH = 0x04,	     /**< Flush this context's DMA queue first */
+	_VKI_DRM_LOCK_FLUSH_ALL = 0x08,  /**< Flush all DMA queues first */
+	/* These *HALT* flags aren't supported yet
+	   -- they will be used to support the
+	   full-screen DGA-like mode. */
+	_VKI_DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
+	_VKI_DRM_HALT_CUR_QUEUES = 0x20  /**< Halt all current queues */
+};
+struct vki_drm_lock {
+	int context;
+	enum vki_drm_lock_flags flags;
+};
+enum vki_drm_dma_flags {
+	/* Flags for DMA buffer dispatch */
+	_VKI_DRM_DMA_BLOCK = 0x01,	      /**<
+				       * 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.
+				       */
+	_VKI_DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
+	_VKI_DRM_DMA_PRIORITY = 0x04,     /**< High priority dispatch */
+
+	/* Flags for DMA buffer request */
+	_VKI_DRM_DMA_WAIT = 0x10,	      /**< Wait for free buffers */
+	_VKI_DRM_DMA_SMALLER_OK = 0x20,   /**< Smaller-than-requested buffers OK */
+	_VKI_DRM_DMA_LARGER_OK = 0x40     /**< Larger-than-requested buffers OK */
+};
+struct vki_drm_buf_desc {
+	int count;		 /**< Number of buffers of this size */
+	int size;		 /**< Size in bytes */
+	int low_mark;		 /**< Low water mark */
+	int high_mark;		 /**< High water mark */
+	enum {
+		_VKI_DRM_PAGE_ALIGN = 0x01,	/**< Align on page boundaries for DMA */
+		_VKI_DRM_AGP_BUFFER = 0x02,	/**< Buffer is in AGP space */
+		_VKI_DRM_SG_BUFFER = 0x04,	/**< Scatter/gather memory buffer */
+		_VKI_DRM_FB_BUFFER = 0x08,	/**< Buffer is in frame buffer */
+		_VKI_DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */
+	} flags;
+	unsigned long agp_start; /**<
+				  * Start address of where the AGP buffers are
+				  * in the AGP aperture
+				  */
+};
+struct vki_drm_buf_info {
+	int count;		/**< Entries in list */
+	struct vki_drm_buf_desc __user *list;
+};
+struct vki_drm_buf_free {
+	int count;
+	int __user *list;
+};
+
+struct vki_drm_buf_pub {
+	int idx;		       /**< Index into the master buffer list */
+	int total;		       /**< Buffer size */
+	int used;		       /**< Amount of buffer in use (for DMA) */
+	void __user *address;	       /**< Address of buffer */
+};
+struct vki_drm_buf_map {
+	int count;		/**< Length of the buffer list */
+	void __user *virtual;		/**< Mmap'd area in user-virtual */
+	struct vki_drm_buf_pub __user *list;	/**< Buffer information */
+};
+struct vki_drm_dma {
+	int context;			  /**< Context handle */
+	int send_count;			  /**< Number of buffers to send */
+	int __user *send_indices;	  /**< List of handles to buffers */
+	int __user *send_sizes;		  /**< Lengths of data to send */
+	enum vki_drm_dma_flags flags;	  /**< Flags */
+	int request_count;		  /**< Number of buffers requested */
+	int request_size;		  /**< Desired size for buffers */
+	int __user *request_indices;	  /**< Buffer information */
+	int __user *request_sizes;
+	int granted_count;		  /**< Number of buffers granted */
+};
+
+enum vki_drm_ctx_flags {
+	_VKI_DRM_CONTEXT_PRESERVED = 0x01,
+	_VKI_DRM_CONTEXT_2DONLY = 0x02
+};
+struct vki_drm_ctx {
+	vki_drm_context_t handle;
+	enum vki_drm_ctx_flags flags;
+};
+struct vki_drm_ctx_res {
+	int count;
+	struct vki_drm_ctx __user *contexts;
+};
+struct vki_drm_draw {
+	vki_drm_drawable_t handle;
+};
+typedef enum {
+	VKI_DRM_DRAWABLE_CLIPRECTS,
+} vki_drm_drawable_info_type_t;
+struct vki_drm_update_draw {
+	vki_drm_drawable_t handle;
+	unsigned int type;
+	unsigned int num;
+	unsigned long long data;
+};
+struct vki_drm_auth {
+	vki_drm_magic_t magic;
+};
+struct vki_drm_irq_busid {
+	int irq;	/**< IRQ number */
+	int busnum;	/**< bus number */
+	int devnum;	/**< device number */
+	int funcnum;	/**< function number */
+};
+enum vki_drm_vblank_seq_type {
+	_VKI_DRM_VBLANK_ABSOLUTE = 0x0,	/**< Wait for specific vblank sequence number */
+	_VKI_DRM_VBLANK_RELATIVE = 0x1,	/**< Wait for given number of vblanks */
+	_VKI_DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
+	_VKI_DRM_VBLANK_EVENT = 0x4000000,   /**< Send event instead of blocking */
+	_VKI_DRM_VBLANK_FLIP = 0x8000000,   /**< Scheduled buffer swap should flip */
+	_VKI_DRM_VBLANK_NEXTONMISS = 0x10000000,	/**< If missed, wait for next vblank */
+	_VKI_DRM_VBLANK_SECONDARY = 0x20000000,	/**< Secondary display controller */
+	_VKI_DRM_VBLANK_SIGNAL = 0x40000000	/**< Send signal instead of blocking, unsupported */
+};
+struct vki_drm_wait_vblank_request {
+	enum vki_drm_vblank_seq_type type;
+	unsigned int sequence;
+	unsigned long signal;
+};
+struct vki_drm_wait_vblank_reply {
+	enum vki_drm_vblank_seq_type type;
+	unsigned int sequence;
+	long tval_sec;
+	long tval_usec;
+};
+union vki_drm_wait_vblank {
+	struct vki_drm_wait_vblank_request request;
+	struct vki_drm_wait_vblank_reply reply;
+};
+struct vki_drm_modeset_ctl {
+	__vki_u32 crtc;
+	__vki_u32 cmd;
+};
+struct vki_drm_agp_mode {
+	unsigned long mode;	/**< AGP mode */
+};
+struct vki_drm_agp_buffer {
+	unsigned long size;	/**< In bytes -- will round to page boundary */
+	unsigned long handle;	/**< Used for binding / unbinding */
+	unsigned long type;	/**< Type of memory to allocate */
+	unsigned long physical;	/**< Physical used by i810 */
+};
+struct vki_drm_agp_binding {
+	unsigned long handle;	/**< From drm_agp_buffer */
+	unsigned long offset;	/**< In bytes -- will round to page boundary */
+};
+struct vki_drm_agp_info {
+	int agp_version_major;
+	int agp_version_minor;
+	unsigned long mode;
+	unsigned long aperture_base;	/* physical address */
+	unsigned long aperture_size;	/* bytes */
+	unsigned long memory_allowed;	/* bytes */
+	unsigned long memory_used;
+	unsigned short id_vendor;
+	unsigned short id_device;
+};
+struct vki_drm_scatter_gather {
+	unsigned long size;	/**< In bytes -- will round to page boundary */
+	unsigned long handle;	/**< Used for mapping / unmapping */
+};
+
+struct vki_drm_set_version {
+	int drm_di_major;
+	int drm_di_minor;
+	int drm_dd_major;
+	int drm_dd_minor;
+};
+struct vki_drm_gem_close {
+	__vki_u32 handle;
+	__vki_u32 pad;
+};
+struct vki_drm_gem_flink {
+	__vki_u32 handle;
+	__vki_u32 name;
+};
+struct vki_drm_gem_open {
+	__vki_u32 name;
+	__vki_u32 handle;
+	__vki_u64 size;
+};
+
+//----------------------------------------------------------------------
+// From include/drm/drm_mode.h
+//----------------------------------------------------------------------
+
+#define VKI_DRM_DISPLAY_MODE_LEN 32
+#define VKI_DRM_PROP_NAME_LEN 32
+struct vki_drm_mode_modeinfo {
+	__vki_u32 clock;
+	__vki_u16 hdisplay, hsync_start, hsync_end, htotal, hskew;
+	__vki_u16 vdisplay, vsync_start, vsync_end, vtotal, vscan;
+
+	__vki_u32 vrefresh; /* vertical refresh * 1000 */
+
+	__vki_u32 flags;
+	__vki_u32 type;
+	char name[VKI_DRM_DISPLAY_MODE_LEN];
+};
+struct vki_drm_mode_card_res {
+	__vki_u64 fb_id_ptr;
+	__vki_u64 crtc_id_ptr;
+	__vki_u64 connector_id_ptr;
+	__vki_u64 encoder_id_ptr;
+	__vki_u32 count_fbs;
+	__vki_u32 count_crtcs;
+	__vki_u32 count_connectors;
+	__vki_u32 count_encoders;
+	__vki_u32 min_width, max_width;
+	__vki_u32 min_height, max_height;
+};
+struct vki_drm_mode_crtc {
+	__vki_u64 set_connectors_ptr;
+	__vki_u32 count_connectors;
+
+	__vki_u32 crtc_id; /**< Id */
+	__vki_u32 fb_id; /**< Id of framebuffer */
+
+	__vki_u32 x, y; /**< Position on the frameuffer */
+
+	__vki_u32 gamma_size;
+	__vki_u32 mode_valid;
+	struct vki_drm_mode_modeinfo mode;
+};
+struct vki_drm_mode_get_encoder {
+	__vki_u32 encoder_id;
+	__vki_u32 encoder_type;
+
+	__vki_u32 crtc_id; /**< Id of crtc */
+
+	__vki_u32 possible_crtcs;
+	__vki_u32 possible_clones;
+};
+struct vki_drm_mode_get_property {
+	__vki_u64 values_ptr; /* values and blob lengths */
+	__vki_u64 enum_blob_ptr; /* enum and blob id ptrs */
+
+	__vki_u32 prop_id;
+	__vki_u32 flags;
+	char name[VKI_DRM_PROP_NAME_LEN];
+
+	__vki_u32 count_values;
+	__vki_u32 count_enum_blobs;
+};
+struct vki_drm_mode_connector_set_property {
+	__vki_u64 value;
+	__vki_u32 prop_id;
+	__vki_u32 connector_id;
+};
+struct vki_drm_mode_get_blob {
+	__vki_u32 blob_id;
+	__vki_u32 length;
+	__vki_u64 data;
+};
+struct vki_drm_mode_fb_cmd {
+	__vki_u32 fb_id;
+	__vki_u32 width, height;
+	__vki_u32 pitch;
+	__vki_u32 bpp;
+	__vki_u32 depth;
+	/* driver specific handle */
+	__vki_u32 handle;
+};
+struct vki_drm_mode_mode_cmd {
+	__vki_u32 connector_id;
+	struct vki_drm_mode_modeinfo mode;
+};
+struct vki_drm_mode_cursor {
+	__vki_u32 flags;
+	__vki_u32 crtc_id;
+	__vki_s32 x;
+	__vki_s32 y;
+	__vki_u32 width;
+	__vki_u32 height;
+	/* driver specific handle */
+	__vki_u32 handle;
+};
+struct vki_drm_mode_crtc_lut {
+	__vki_u32 crtc_id;
+	__vki_u32 gamma_size;
+
+	/* pointers to arrays */
+	__vki_u64 red;
+	__vki_u64 green;
+	__vki_u64 blue;
+};
+
+//----------------------------------------------------------------------
+// From include/drm/drm.h
+//----------------------------------------------------------------------
+
+#define VKI_DRM_IOCTL_BASE		'd'
+
+#define VKI_DRM_IO(nr)			_VKI_IO(VKI_DRM_IOCTL_BASE,nr)
+#define VKI_DRM_IOR(nr,type)		_VKI_IOR(VKI_DRM_IOCTL_BASE,nr,type)
+#define VKI_DRM_IOW(nr,type)		_VKI_IOW(VKI_DRM_IOCTL_BASE,nr,type)
+#define VKI_DRM_IOWR(nr,type)		_VKI_IOWR(VKI_DRM_IOCTL_BASE,nr,type)
+
+
+#define VKI_DRM_IOCTL_VERSION		VKI_DRM_IOWR(0x00, struct vki_drm_version)
+#define VKI_DRM_IOCTL_GET_UNIQUE	VKI_DRM_IOWR(0x01, struct vki_drm_unique)
+#define VKI_DRM_IOCTL_GET_MAGIC		VKI_DRM_IOR( 0x02, struct vki_drm_auth)
+#define VKI_DRM_IOCTL_IRQ_BUSID		VKI_DRM_IOWR(0x03, struct vki_drm_irq_busid)
+#define VKI_DRM_IOCTL_GET_MAP           VKI_DRM_IOWR(0x04, struct vki_drm_map)
+#define VKI_DRM_IOCTL_GET_CLIENT        VKI_DRM_IOWR(0x05, struct vki_drm_client)
+#define VKI_DRM_IOCTL_GET_STATS         VKI_DRM_IOR( 0x06, struct vki_drm_stats)
+#define VKI_DRM_IOCTL_SET_VERSION	VKI_DRM_IOWR(0x07, struct vki_drm_set_version)
+#define VKI_DRM_IOCTL_MODESET_CTL       VKI_DRM_IOW(0x08, struct vki_drm_modeset_ctl)
+#define VKI_DRM_IOCTL_GEM_CLOSE		VKI_DRM_IOW (0x09, struct vki_drm_gem_close)
+#define VKI_DRM_IOCTL_GEM_FLINK		VKI_DRM_IOWR(0x0a, struct vki_drm_gem_flink)
+#define VKI_DRM_IOCTL_GEM_OPEN		VKI_DRM_IOWR(0x0b, struct vki_drm_gem_open)
+
+#define VKI_DRM_IOCTL_SET_UNIQUE	VKI_DRM_IOW( 0x10, struct vki_drm_unique)
+#define VKI_DRM_IOCTL_AUTH_MAGIC	VKI_DRM_IOW( 0x11, struct vki_drm_auth)
+#define VKI_DRM_IOCTL_BLOCK		VKI_DRM_IOWR(0x12, struct vki_drm_block)
+#define VKI_DRM_IOCTL_UNBLOCK		VKI_DRM_IOWR(0x13, struct vki_drm_block)
+#define VKI_DRM_IOCTL_CONTROL		VKI_DRM_IOW( 0x14, struct vki_drm_control)
+#define VKI_DRM_IOCTL_ADD_MAP		VKI_DRM_IOWR(0x15, struct vki_drm_map)
+#define VKI_DRM_IOCTL_ADD_BUFS		VKI_DRM_IOWR(0x16, struct vki_drm_buf_desc)
+#define VKI_DRM_IOCTL_MARK_BUFS		VKI_DRM_IOW( 0x17, struct vki_drm_buf_desc)
+#define VKI_DRM_IOCTL_INFO_BUFS		VKI_DRM_IOWR(0x18, struct vki_drm_buf_info)
+#define VKI_DRM_IOCTL_MAP_BUFS		VKI_DRM_IOWR(0x19, struct vki_drm_buf_map)
+#define VKI_DRM_IOCTL_FREE_BUFS		VKI_DRM_IOW( 0x1a, struct vki_drm_buf_free)
+
+#define VKI_DRM_IOCTL_RM_MAP		VKI_DRM_IOW( 0x1b, struct vki_drm_map)
+
+#define VKI_DRM_IOCTL_SET_SAREA_CTX	VKI_DRM_IOW( 0x1c, struct vki_drm_ctx_priv_map)
+#define VKI_DRM_IOCTL_GET_SAREA_CTX 	VKI_DRM_IOWR(0x1d, struct vki_drm_ctx_priv_map)
+
+#define VKI_DRM_IOCTL_SET_MASTER        VKI_DRM_IO(0x1e)
+#define VKI_DRM_IOCTL_DROP_MASTER       VKI_DRM_IO(0x1f)
+
+#define VKI_DRM_IOCTL_ADD_CTX		VKI_DRM_IOWR(0x20, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_RM_CTX		VKI_DRM_IOWR(0x21, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_MOD_CTX		VKI_DRM_IOW( 0x22, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_GET_CTX		VKI_DRM_IOWR(0x23, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_SWITCH_CTX	VKI_DRM_IOW( 0x24, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_NEW_CTX		VKI_DRM_IOW( 0x25, struct vki_drm_ctx)
+#define VKI_DRM_IOCTL_RES_CTX		VKI_DRM_IOWR(0x26, struct vki_drm_ctx_res)
+#define VKI_DRM_IOCTL_ADD_DRAW		VKI_DRM_IOWR(0x27, struct vki_drm_draw)
+#define VKI_DRM_IOCTL_RM_DRAW		VKI_DRM_IOWR(0x28, struct vki_drm_draw)
+#define VKI_DRM_IOCTL_DMA		VKI_DRM_IOWR(0x29, struct vki_drm_dma)
+#define VKI_DRM_IOCTL_LOCK		VKI_DRM_IOW( 0x2a, struct vki_drm_lock)
+#define VKI_DRM_IOCTL_UNLOCK		VKI_DRM_IOW( 0x2b, struct vki_drm_lock)
+#define VKI_DRM_IOCTL_FINISH		VKI_DRM_IOW( 0x2c, struct vki_drm_lock)
+
+#define VKI_DRM_IOCTL_AGP_ACQUIRE	VKI_DRM_IO(  0x30)
+#define VKI_DRM_IOCTL_AGP_RELEASE	VKI_DRM_IO(  0x31)
+#define VKI_DRM_IOCTL_AGP_ENABLE	VKI_DRM_IOW( 0x32, struct vki_drm_agp_mode)
+#define VKI_DRM_IOCTL_AGP_INFO		VKI_DRM_IOR( 0x33, struct vki_drm_agp_info)
+#define VKI_DRM_IOCTL_AGP_ALLOC		VKI_DRM_IOWR(0x34, struct vki_drm_agp_buffer)
+#define VKI_DRM_IOCTL_AGP_FREE		VKI_DRM_IOW( 0x35, struct vki_drm_agp_buffer)
+#define VKI_DRM_IOCTL_AGP_BIND		VKI_DRM_IOW( 0x36, struct vki_drm_agp_binding)
+#define VKI_DRM_IOCTL_AGP_UNBIND	VKI_DRM_IOW( 0x37, struct vki_drm_agp_binding)
+
+#define VKI_DRM_IOCTL_SG_ALLOC		VKI_DRM_IOWR(0x38, struct vki_drm_scatter_gather)
+#define VKI_DRM_IOCTL_SG_FREE		VKI_DRM_IOW( 0x39, struct vki_drm_scatter_gather)
+
+#define VKI_DRM_IOCTL_WAIT_VBLANK	VKI_DRM_IOWR(0x3a, union vki_drm_wait_vblank)
+
+#define VKI_DRM_IOCTL_UPDATE_DRAW	VKI_DRM_IOW(0x3f, struct vki_drm_update_draw)
+
+#define VKI_DRM_IOCTL_MODE_GETRESOURCES	VKI_DRM_IOWR(0xA0, struct vki_drm_mode_card_res)
+#define VKI_DRM_IOCTL_MODE_GETCRTC	VKI_DRM_IOWR(0xA1, struct vki_drm_mode_crtc)
+#define VKI_DRM_IOCTL_MODE_SETCRTC	VKI_DRM_IOWR(0xA2, struct vki_drm_mode_crtc)
+#define VKI_DRM_IOCTL_MODE_CURSOR	VKI_DRM_IOWR(0xA3, struct vki_drm_mode_cursor)
+#define VKI_DRM_IOCTL_MODE_GETGAMMA	VKI_DRM_IOWR(0xA4, struct vki_drm_mode_crtc_lut)
+#define VKI_DRM_IOCTL_MODE_SETGAMMA	VKI_DRM_IOWR(0xA5, struct vki_drm_mode_crtc_lut)
+#define VKI_DRM_IOCTL_MODE_GETENCODER	VKI_DRM_IOWR(0xA6, struct vki_drm_mode_get_encoder)
+#define VKI_DRM_IOCTL_MODE_GETCONNECTOR	VKI_DRM_IOWR(0xA7, struct vki_drm_mode_get_connector)
+#define VKI_DRM_IOCTL_MODE_ATTACHMODE	VKI_DRM_IOWR(0xA8, struct vki_drm_mode_mode_cmd)
+#define VKI_DRM_IOCTL_MODE_DETACHMODE	VKI_DRM_IOWR(0xA9, struct vki_drm_mode_mode_cmd)
+
+#define VKI_DRM_IOCTL_MODE_GETPROPERTY	VKI_DRM_IOWR(0xAA, struct vki_drm_mode_get_property)
+#define VKI_DRM_IOCTL_MODE_SETPROPERTY	VKI_DRM_IOWR(0xAB, struct vki_drm_mode_connector_set_property)
+#define VKI_DRM_IOCTL_MODE_GETPROPBLOB	VKI_DRM_IOWR(0xAC, struct vki_drm_mode_get_blob)
+#define VKI_DRM_IOCTL_MODE_GETFB	VKI_DRM_IOWR(0xAD, struct vki_drm_mode_fb_cmd)
+#define VKI_DRM_IOCTL_MODE_ADDFB	VKI_DRM_IOWR(0xAE, struct vki_drm_mode_fb_cmd)
+#define VKI_DRM_IOCTL_MODE_RMFB		VKI_DRM_IOWR(0xAF, unsigned int)
+
+#define VKI_DRM_COMMAND_BASE            0x40
+#define VKI_DRM_COMMAND_END		0xA0
+
+//----------------------------------------------------------------------
+// From include/drm/i915_drm.h
+//----------------------------------------------------------------------
+
+typedef struct _vki_drm_i915_init {
+	enum {
+		VKI_I915_INIT_DMA = 0x01,
+		VKI_I915_CLEANUP_DMA = 0x02,
+		VKI_I915_RESUME_DMA = 0x03
+	} func;
+	unsigned int mmio_offset;
+	int sarea_priv_offset;
+	unsigned int ring_start;
+	unsigned int ring_end;
+	unsigned int ring_size;
+	unsigned int front_offset;
+	unsigned int back_offset;
+	unsigned int depth_offset;
+	unsigned int w;
+	unsigned int h;
+	unsigned int pitch;
+	unsigned int pitch_bits;
+	unsigned int back_pitch;
+	unsigned int depth_pitch;
+	unsigned int cpp;
+	unsigned int chipset;
+} vki_drm_i915_init_t;
+
+#define VKI_DRM_I915_INIT		    0x00
+#define VKI_DRM_I915_FLUSH		    0x01
+#define VKI_DRM_I915_FLIP		    0x02
+#define VKI_DRM_I915_BATCHBUFFER	    0x03
+#define VKI_DRM_I915_IRQ_EMIT		    0x04
+#define VKI_DRM_I915_IRQ_WAIT		    0x05
+#define VKI_DRM_I915_GETPARAM		    0x06
+#define VKI_DRM_I915_SETPARAM		    0x07
+#define VKI_DRM_I915_ALLOC		    0x08
+#define VKI_DRM_I915_FREE		    0x09
+#define VKI_DRM_I915_INIT_HEAP		    0x0a
+#define VKI_DRM_I915_CMDBUFFER		    0x0b
+#define VKI_DRM_I915_DESTROY_HEAP	    0x0c
+#define VKI_DRM_I915_SET_VBLANK_PIPE	    0x0d
+#define VKI_DRM_I915_GET_VBLANK_PIPE	    0x0e
+#define VKI_DRM_I915_VBLANK_SWAP	    0x0f
+#define VKI_DRM_I915_HWS_ADDR		    0x11
+#define VKI_DRM_I915_GEM_INIT		    0x13
+#define VKI_DRM_I915_GEM_EXECBUFFER	    0x14
+#define VKI_DRM_I915_GEM_PIN		    0x15
+#define VKI_DRM_I915_GEM_UNPIN		    0x16
+#define VKI_DRM_I915_GEM_BUSY		    0x17
+#define VKI_DRM_I915_GEM_THROTTLE	    0x18
+#define VKI_DRM_I915_GEM_ENTERVT	    0x19
+#define VKI_DRM_I915_GEM_LEAVEVT	    0x1a
+#define VKI_DRM_I915_GEM_CREATE		    0x1b
+#define VKI_DRM_I915_GEM_PREAD		    0x1c
+#define VKI_DRM_I915_GEM_PWRITE		    0x1d
+#define VKI_DRM_I915_GEM_MMAP		    0x1e
+#define VKI_DRM_I915_GEM_SET_DOMAIN	    0x1f
+#define VKI_DRM_I915_GEM_SW_FINISH	    0x20
+#define VKI_DRM_I915_GEM_SET_TILING	    0x21
+#define VKI_DRM_I915_GEM_GET_TILING	    0x22
+#define VKI_DRM_I915_GEM_GET_APERTURE	    0x23
+#define VKI_DRM_I915_GEM_MMAP_GTT	    0x24
+#define VKI_DRM_I915_GET_PIPE_FROM_CRTC_ID  0x25
+#define VKI_DRM_I915_GEM_MADVISE	    0x26
+#define VKI_DRM_I915_OVERLAY_PUT_IMAGE	    0x27
+#define VKI_DRM_I915_OVERLAY_ATTRS	    0x28
+#define VKI_DRM_I915_GEM_EXECBUFFER2	    0x29
+
+#define VKI_DRM_IOCTL_I915_INIT			    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_INIT, vki_drm_i915_init_t)
+#define VKI_DRM_IOCTL_I915_FLUSH		    VKI_DRM_IO ( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_FLUSH)
+#define VKI_DRM_IOCTL_I915_FLIP			    VKI_DRM_IO ( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_FLIP)
+#define VKI_DRM_IOCTL_I915_BATCHBUFFER		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_BATCHBUFFER, vki_drm_i915_batchbuffer_t)
+#define VKI_DRM_IOCTL_I915_IRQ_EMIT		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_IRQ_EMIT, vki_drm_i915_irq_emit_t)
+#define VKI_DRM_IOCTL_I915_IRQ_WAIT		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_IRQ_WAIT, vki_drm_i915_irq_wait_t)
+#define VKI_DRM_IOCTL_I915_GETPARAM		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GETPARAM, vki_drm_i915_getparam_t)
+#define VKI_DRM_IOCTL_I915_SETPARAM		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_SETPARAM, vki_drm_i915_setparam_t)
+#define VKI_DRM_IOCTL_I915_ALLOC		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_ALLOC, vki_drm_i915_mem_alloc_t)
+#define VKI_DRM_IOCTL_I915_FREE			    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_FREE, vki_drm_i915_mem_free_t)
+#define VKI_DRM_IOCTL_I915_INIT_HEAP		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_INIT_HEAP, vki_drm_i915_mem_init_heap_t)
+#define VKI_DRM_IOCTL_I915_CMDBUFFER		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_CMDBUFFER, vki_drm_i915_cmdbuffer_t)
+#define VKI_DRM_IOCTL_I915_DESTROY_HEAP		    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_DESTROY_HEAP, vki_drm_i915_mem_destroy_heap_t)
+#define VKI_DRM_IOCTL_I915_SET_VBLANK_PIPE	    VKI_DRM_IOW( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_SET_VBLANK_PIPE, vki_drm_i915_vblank_pipe_t)
+#define VKI_DRM_IOCTL_I915_GET_VBLANK_PIPE	    VKI_DRM_IOR( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GET_VBLANK_PIPE, vki_drm_i915_vblank_pipe_t)
+#define VKI_DRM_IOCTL_I915_VBLANK_SWAP		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_VBLANK_SWAP, vki_drm_i915_vblank_swap_t)
+#define VKI_DRM_IOCTL_I915_GEM_INIT		    VKI_DRM_IOW(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_INIT, struct vki_drm_i915_gem_init)
+#define VKI_DRM_IOCTL_I915_GEM_EXECBUFFER	    VKI_DRM_IOW(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_EXECBUFFER, struct vki_drm_i915_gem_execbuffer)
+#define VKI_DRM_IOCTL_I915_GEM_PIN		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_PIN, struct vki_drm_i915_gem_pin)
+#define VKI_DRM_IOCTL_I915_GEM_UNPIN		    VKI_DRM_IOW(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_UNPIN, struct vki_drm_i915_gem_unpin)
+#define VKI_DRM_IOCTL_I915_GEM_BUSY		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_BUSY, struct vki_drm_i915_gem_busy)
+#define VKI_DRM_IOCTL_I915_GEM_THROTTLE		    VKI_DRM_IO ( VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_THROTTLE)
+#define VKI_DRM_IOCTL_I915_GEM_ENTERVT		    VKI_DRM_IO(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_ENTERVT)
+#define VKI_DRM_IOCTL_I915_GEM_LEAVEVT		    VKI_DRM_IO(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_LEAVEVT)
+#define VKI_DRM_IOCTL_I915_GEM_CREATE		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_CREATE, struct vki_drm_i915_gem_create)
+#define VKI_DRM_IOCTL_I915_GEM_PREAD		    VKI_DRM_IOW (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_PREAD, struct vki_drm_i915_gem_pread)
+#define VKI_DRM_IOCTL_I915_GEM_PWRITE		    VKI_DRM_IOW (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_PWRITE, struct vki_drm_i915_gem_pwrite)
+#define VKI_DRM_IOCTL_I915_GEM_MMAP		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_MMAP, struct vki_drm_i915_gem_mmap)
+#define VKI_DRM_IOCTL_I915_GEM_MMAP_GTT		    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_MMAP_GTT, struct vki_drm_i915_gem_mmap_gtt)
+#define VKI_DRM_IOCTL_I915_GEM_SET_DOMAIN	    VKI_DRM_IOW (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_SET_DOMAIN, struct vki_drm_i915_gem_set_domain)
+#define VKI_DRM_IOCTL_I915_GEM_SW_FINISH	    VKI_DRM_IOW (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_SW_FINISH, struct vki_drm_i915_gem_sw_finish)
+#define VKI_DRM_IOCTL_I915_GEM_SET_TILING	    VKI_DRM_IOWR (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_SET_TILING, struct vki_drm_i915_gem_set_tiling)
+#define VKI_DRM_IOCTL_I915_GEM_GET_TILING	    VKI_DRM_IOWR (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_GET_TILING, struct vki_drm_i915_gem_get_tiling)
+#define VKI_DRM_IOCTL_I915_GEM_GET_APERTURE	    VKI_DRM_IOR  (VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GEM_GET_APERTURE, struct vki_drm_i915_gem_get_aperture)
+#define VKI_DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID    VKI_DRM_IOWR(VKI_DRM_COMMAND_BASE + VKI_DRM_I915_GET_PIPE_FROM_CRTC_ID, struct vki_drm_intel_get_pipe_from_crtc_id)
+
+typedef struct vki_drm_i915_batchbuffer {
+	int start;		/* agp offset */
+	int used;		/* nr bytes in use */
+	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */
+	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */
+	int num_cliprects;	/* mulitpass with multiple cliprects? */
+	struct vki_drm_clip_rect __user *cliprects;	/* pointer to userspace cliprects */
+} vki_drm_i915_batchbuffer_t;
+typedef struct _vki_drm_i915_cmdbuffer {
+	char __user *buf;	/* pointer to userspace command buffer */
+	int sz;			/* nr bytes in buf */
+	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */
+	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */
+	int num_cliprects;	/* mulitpass with multiple cliprects? */
+	struct vki_drm_clip_rect __user *cliprects;	/* pointer to userspace cliprects */
+} vki_drm_i915_cmdbuffer_t;
+typedef struct vki_drm_i915_irq_emit {
+	int __user *irq_seq;
+} vki_drm_i915_irq_emit_t;
+typedef struct vki_drm_i915_irq_wait {
+	int irq_seq;
+} vki_drm_i915_irq_wait_t;
+typedef struct vki_drm_i915_getparam {
+	int param;
+	int __user *value;
+} vki_drm_i915_getparam_t;
+typedef struct vki_drm_i915_setparam {
+	int param;
+	int value;
+} vki_drm_i915_setparam_t;
+typedef struct vki_drm_i915_mem_alloc {
+	int region;
+	int alignment;
+	int size;
+	int __user *region_offset;	/* offset from start of fb or agp */
+} vki_drm_i915_mem_alloc_t;
+typedef struct vki_drm_i915_mem_free {
+	int region;
+	int region_offset;
+} vki_drm_i915_mem_free_t;
+typedef struct vki_drm_i915_mem_init_heap {
+	int region;
+	int size;
+	int start;
+} vki_drm_i915_mem_init_heap_t;
+typedef struct vki_drm_i915_mem_destroy_heap {
+	int region;
+} vki_drm_i915_mem_destroy_heap_t;
+typedef struct vki_drm_i915_vblank_pipe {
+	int pipe;
+} vki_drm_i915_vblank_pipe_t;
+typedef struct vki_drm_i915_vblank_swap {
+	vki_drm_drawable_t drawable;
+	enum vki_drm_vblank_seq_type seqtype;
+	unsigned int sequence;
+} vki_drm_i915_vblank_swap_t;
+typedef struct vki_drm_i915_hws_addr {
+	__vki_u64 addr;
+} vki_drm_i915_hws_addr_t;
+struct vki_drm_i915_gem_init {
+	__vki_u64 gtt_start;
+	__vki_u64 gtt_end;
+};
+struct vki_drm_i915_gem_create {
+	__vki_u64 size;
+	__vki_u32 handle;
+	__vki_u32 pad;
+};
+struct vki_drm_i915_gem_pread {
+	__vki_u32 handle;
+	__vki_u32 pad;
+	__vki_u64 offset;
+	__vki_u64 size;
+	__vki_u64 data_ptr;
+};
+struct vki_drm_i915_gem_pwrite {
+	__vki_u32 handle;
+	__vki_u32 pad;
+	__vki_u64 offset;
+	__vki_u64 size;
+	__vki_u64 data_ptr;
+};
+struct vki_drm_i915_gem_mmap {
+	__vki_u32 handle;
+	__vki_u32 pad;
+	__vki_u64 offset;
+	__vki_u64 size;
+	__vki_u64 addr_ptr;
+};
+struct vki_drm_i915_gem_mmap_gtt {
+	__vki_u32 handle;
+	__vki_u32 pad;
+	__vki_u64 offset;
+};
+struct vki_drm_i915_gem_set_domain {
+	__vki_u32 handle;
+	__vki_u32 read_domains;
+	__vki_u32 write_domain;
+};
+struct vki_drm_i915_gem_sw_finish {
+	__vki_u32 handle;
+};
+struct vki_drm_i915_gem_relocation_entry {
+	__vki_u32 target_handle;
+	__vki_u32 delta;
+	__vki_u64 offset;
+	__vki_u64 presumed_offset;
+	__vki_u32 read_domains;
+	__vki_u32 write_domain;
+};
+struct vki_drm_i915_gem_exec_object {
+	__vki_u32 handle;
+	__vki_u32 relocation_count;
+	__vki_u64 relocs_ptr;
+	__vki_u64 alignment;
+	__vki_u64 offset;
+};
+struct vki_drm_i915_gem_execbuffer {
+	__vki_u64 buffers_ptr;
+	__vki_u32 buffer_count;
+	__vki_u32 batch_start_offset;
+	__vki_u32 batch_len;
+	__vki_u32 DR1;
+	__vki_u32 DR4;
+	__vki_u32 num_cliprects;
+	__vki_u64 cliprects_ptr;
+};
+struct vki_drm_i915_gem_pin {
+	__vki_u32 handle;
+	__vki_u32 pad;
+	__vki_u64 alignment;
+	__vki_u64 offset;
+};
+struct vki_drm_i915_gem_unpin {
+	__vki_u32 handle;
+	__vki_u32 pad;
+};
+struct vki_drm_i915_gem_busy {
+	__vki_u32 handle;
+	__vki_u32 busy;
+};
+struct vki_drm_i915_gem_set_tiling {
+	__vki_u32 handle;
+	__vki_u32 tiling_mode;
+	__vki_u32 stride;
+	__vki_u32 swizzle_mode;
+};
+struct vki_drm_i915_gem_get_tiling {
+	__vki_u32 handle;
+	__vki_u32 tiling_mode;
+	__vki_u32 swizzle_mode;
+};
+struct vki_drm_i915_gem_get_aperture {
+	__vki_u64 aper_size;
+	__vki_u64 aper_available_size;
+};
+struct vki_drm_i915_get_pipe_from_crtc_id {
+	__vki_u32 crtc_id;
+	__vki_u32 pipe;
+};
+
+#endif //__VKI_LINUX_DRM_H
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                          ---*/
+/*--------------------------------------------------------------------*/