]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for a bunch of DRM Ioctls. Fixes #207815.
authorJulian Seward <jseward@acm.org>
Thu, 8 Aug 2013 08:09:29 +0000 (08:09 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 8 Aug 2013 08:09:29 +0000 (08:09 +0000)
(Robert Bragg, bob@o-hand.com)

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13486

NEWS
coregrind/m_syswrap/syswrap-linux.c
include/Makefile.am
include/pub_tool_vki.h
include/vki/vki-linux-drm.h [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index e474c4cc13d736544714e7dafe1319216af66438..76939f8141a64039f42c700ef0943076d6446f45 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -444,6 +444,10 @@ FIXED r??
         FIXED 13467
 
 322851  0bXXX binary literal syntax is not standard 
+        FIXED 2736
+
+207815  Adds some of the drm ioctls to syswrap-linux.c 
+        FIXED 13486
 
 
 Release 3.8.1 (19 September 2012)
index 7d09c13650cbea02a45d03b35d2cd1b7ff4bb197..9201aa6c382ed5a1904e8ada535a364d391081e4 100644 (file)
@@ -5118,6 +5118,151 @@ PRE(sys_fcntl)
       PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex));
       break;
 
+   case VKI_DRM_IOCTL_VERSION:
+      if (ARG3) {
+         struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
+        PRE_MEM_WRITE("ioctl(DRM_VERSION).version_major", (Addr)&data->version_major, sizeof(data->version_major));
+         PRE_MEM_WRITE("ioctl(DRM_VERSION).version_minor", (Addr)&data->version_minor, sizeof(data->version_minor));
+         PRE_MEM_WRITE("ioctl(DRM_VERSION).version_patchlevel", (Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
+         PRE_MEM_READ("ioctl(DRM_VERSION).name_len", (Addr)&data->name_len, sizeof(data->name_len));
+         PRE_MEM_READ("ioctl(DRM_VERSION).name", (Addr)&data->name, sizeof(data->name));
+         PRE_MEM_WRITE("ioctl(DRM_VERSION).name", (Addr)data->name, data->name_len);
+         PRE_MEM_READ("ioctl(DRM_VERSION).date_len", (Addr)&data->date_len, sizeof(data->date_len));
+         PRE_MEM_READ("ioctl(DRM_VERSION).date", (Addr)&data->date, sizeof(data->date));
+         PRE_MEM_WRITE("ioctl(DRM_VERSION).date", (Addr)data->date, data->date_len);
+         PRE_MEM_READ("ioctl(DRM_VERSION).desc_len", (Addr)&data->desc_len, sizeof(data->desc_len));
+         PRE_MEM_READ("ioctl(DRM_VERSION).desc", (Addr)&data->desc, sizeof(data->desc));
+         PRE_MEM_WRITE("ioctl(DRM_VERSION).desc", (Addr)data->desc, data->desc_len);
+      }
+      break;
+   case VKI_DRM_IOCTL_GET_UNIQUE:
+      if (ARG3) {
+         struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique_len", (Addr)&data->unique_len, sizeof(data->unique_len));
+        PRE_MEM_READ("ioctl(DRM_GET_UNIQUE).unique", (Addr)&data->unique, sizeof(data->unique));
+        PRE_MEM_WRITE("ioctl(DRM_GET_UNIQUE).unique", (Addr)data->unique, data->unique_len);
+      }
+      break;
+   case VKI_DRM_IOCTL_GET_MAGIC:
+      if (ARG3) {
+         struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
+         PRE_MEM_WRITE("ioctl(DRM_GET_MAGIC).magic", (Addr)&data->magic, sizeof(data->magic));
+      }
+      break;
+   case VKI_DRM_IOCTL_WAIT_VBLANK:
+      if (ARG3) {
+         union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.type", (Addr)&data->request.type, sizeof(data->request.type));
+        PRE_MEM_READ("ioctl(DRM_WAIT_VBLANK).request.sequence", (Addr)&data->request.sequence, sizeof(data->request.sequence));
+        /* XXX: It seems request.signal isn't used */
+         PRE_MEM_WRITE("ioctl(DRM_WAIT_VBLANK).reply", (Addr)&data->reply, sizeof(data->reply));
+      }
+      break;
+   case VKI_DRM_IOCTL_GEM_CLOSE:
+      if (ARG3) {
+         struct vki_drm_gem_close *data = (struct vki_drm_gem_close *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_GEM_CLOSE).handle", (Addr)&data->handle, sizeof(data->handle));
+      }
+      break;
+   case VKI_DRM_IOCTL_GEM_FLINK:
+      if (ARG3) {
+         struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_GEM_FLINK).handle", (Addr)&data->handle, sizeof(data->handle));
+         PRE_MEM_WRITE("ioctl(DRM_GEM_FLINK).name", (Addr)&data->name, sizeof(data->name));
+      }
+      break;
+   case VKI_DRM_IOCTL_GEM_OPEN:
+      if (ARG3) {
+         struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_GEM_OPEN).name", (Addr)&data->name, sizeof(data->name));
+        PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).handle", (Addr)&data->handle, sizeof(data->handle));
+        PRE_MEM_WRITE("ioctl(DRM_GEM_OPEN).size", (Addr)&data->size, sizeof(data->size));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GETPARAM:
+      if (ARG3) {
+         vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GETPARAM).param", (Addr)&data->param, sizeof(data->param));
+        PRE_MEM_WRITE("ioctl(DRM_I915_GETPARAM).value", (Addr)data->value, sizeof(int));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_BUSY:
+      if (ARG3) {
+         struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_BUSY).handle", (Addr)&data->handle, sizeof(data->handle));
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_BUSY).busy", (Addr)&data->busy, sizeof(data->busy));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_CREATE:
+      if (ARG3) {
+         struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_CREATE).size", (Addr)&data->size, sizeof(data->size));
+        PRE_MEM_WRITE("ioctl(DRM_I915_GEM_CREATE).handle", (Addr)&data->handle, sizeof(data->handle));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_PREAD:
+      if (ARG3) {
+         struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).handle", (Addr)&data->handle, sizeof(data->handle));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).offset", (Addr)&data->offset, sizeof(data->offset));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).size", (Addr)&data->size, sizeof(data->size));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
+        PRE_MEM_WRITE("ioctl(DRM_I915_GEM_PREAD).data_ptr", (Addr)data->data_ptr, data->size);
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_PWRITE:
+      if (ARG3) {
+         struct vki_drm_i915_gem_pwrite *data = (struct vki_drm_i915_gem_pwrite *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).handle", (Addr)&data->handle, sizeof(data->handle));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).offset", (Addr)&data->offset, sizeof(data->offset));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).size", (Addr)&data->size, sizeof(data->size));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)&data->data_ptr, sizeof(data->data_ptr));
+        /* PRE_MEM_READ("ioctl(DRM_I915_GEM_PWRITE).data_ptr", (Addr)data->data_ptr, data->size);
+         * NB: the buffer is allowed to contain any amount of uninitialized data (e.g.
+         * interleaved vertex attributes may have a wide stride with uninitialized data between
+         * consecutive vertices) */
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
+      if (ARG3) {
+         struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_MMAP_GTT).handle", (Addr)&data->handle, sizeof(data->handle));
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_MMAP_GTT).offset", (Addr)&data->offset, sizeof(data->offset));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_SET_DOMAIN:
+      if (ARG3) {
+         struct vki_drm_i915_gem_set_domain *data = (struct vki_drm_i915_gem_set_domain *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).handle", (Addr)&data->handle, sizeof(data->handle));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).read_domains", (Addr)&data->read_domains, sizeof(data->read_domains));
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_DOMAIN).write_domain", (Addr)&data->write_domain, sizeof(data->write_domain));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
+      if (ARG3) {
+         struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
+         PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
+         PRE_MEM_READ("ioctl(DRM_I915_GEM_SET_TILING).stride", (Addr)&data->stride, sizeof(data->stride));
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_SET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
+      if (ARG3) {
+         struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
+        PRE_MEM_READ("ioctl(DRM_I915_GEM_GET_TILING).handle", (Addr)&data->handle, sizeof(data->handle));
+        PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).tiling_mode", (Addr)&data->tiling_mode, sizeof(data->tiling_mode));
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_TILING).swizzle_mode", (Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
+      if (ARG3) {
+         struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_size", (Addr)&data->aper_size, sizeof(data->aper_size));
+         PRE_MEM_WRITE("ioctl(DRM_I915_GEM_GET_APERTURE).aper_available_size", (Addr)&data->aper_available_size, sizeof(data->aper_available_size));
+      }
+      break;
+
    default:
       PRINT("sys_fcntl[UNKNOWN] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
       I_die_here;
@@ -5305,6 +5450,104 @@ PRE(sys_ioctl)
                     unsigned int, fd, unsigned int, request);
       return;
 
+   case VKI_DRM_IOCTL_VERSION:
+      if (ARG3) {
+         struct vki_drm_version *data = (struct vki_drm_version *)ARG3;
+        POST_MEM_WRITE((Addr)&data->version_major, sizeof(data->version_major));
+         POST_MEM_WRITE((Addr)&data->version_minor, sizeof(data->version_minor));
+         POST_MEM_WRITE((Addr)&data->version_patchlevel, sizeof(data->version_patchlevel));
+         POST_MEM_WRITE((Addr)&data->name_len, sizeof(data->name_len));
+         POST_MEM_WRITE((Addr)data->name, data->name_len);
+         POST_MEM_WRITE((Addr)&data->date_len, sizeof(data->date_len));
+         POST_MEM_WRITE((Addr)data->date, data->date_len);
+         POST_MEM_WRITE((Addr)&data->desc_len, sizeof(data->desc_len));
+         POST_MEM_WRITE((Addr)data->desc, data->desc_len);
+      }
+      break;
+   case VKI_DRM_IOCTL_GET_UNIQUE:
+      if (ARG3) {
+         struct vki_drm_unique *data = (struct vki_drm_unique *)ARG3;
+        POST_MEM_WRITE((Addr)data->unique, sizeof(data->unique_len));
+      }
+      break;
+   case VKI_DRM_IOCTL_GET_MAGIC:
+      if (ARG3) {
+         struct vki_drm_auth *data = (struct vki_drm_auth *)ARG3;
+         POST_MEM_WRITE((Addr)&data->magic, sizeof(data->magic));
+      }
+      break;
+   case VKI_DRM_IOCTL_WAIT_VBLANK:
+      if (ARG3) {
+         union vki_drm_wait_vblank *data = (union vki_drm_wait_vblank *)ARG3;
+         POST_MEM_WRITE((Addr)&data->reply, sizeof(data->reply));
+      }
+      break;
+   case VKI_DRM_IOCTL_GEM_FLINK:
+      if (ARG3) {
+         struct vki_drm_gem_flink *data = (struct vki_drm_gem_flink *)ARG3;
+         POST_MEM_WRITE((Addr)&data->name, sizeof(data->name));
+      }
+      break;
+   case VKI_DRM_IOCTL_GEM_OPEN:
+      if (ARG3) {
+         struct vki_drm_gem_open *data = (struct vki_drm_gem_open *)ARG3;
+        POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
+        POST_MEM_WRITE((Addr)&data->size, sizeof(data->size));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GETPARAM:
+      if (ARG3) {
+         vki_drm_i915_getparam_t *data = (vki_drm_i915_getparam_t *)ARG3;
+        POST_MEM_WRITE((Addr)data->value, sizeof(int));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_BUSY:
+      if (ARG3) {
+         struct vki_drm_i915_gem_busy *data = (struct vki_drm_i915_gem_busy *)ARG3;
+         POST_MEM_WRITE((Addr)&data->busy, sizeof(data->busy));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_CREATE:
+      if (ARG3) {
+         struct vki_drm_i915_gem_create *data = (struct vki_drm_i915_gem_create *)ARG3;
+        POST_MEM_WRITE((Addr)&data->handle, sizeof(data->handle));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_PREAD:
+      if (ARG3) {
+         struct vki_drm_i915_gem_pread *data = (struct vki_drm_i915_gem_pread *)ARG3;
+        POST_MEM_WRITE((Addr)data->data_ptr, data->size);
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_MMAP_GTT:
+      if (ARG3) {
+         struct vki_drm_i915_gem_mmap_gtt *data = (struct vki_drm_i915_gem_mmap_gtt *)ARG3;
+         POST_MEM_WRITE((Addr)&data->offset, sizeof(data->offset));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_SET_TILING:
+      if (ARG3) {
+         struct vki_drm_i915_gem_set_tiling *data = (struct vki_drm_i915_gem_set_tiling *)ARG3;
+         POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
+         POST_MEM_WRITE((Addr)&data->stride, sizeof(data->stride));
+         POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_GET_TILING:
+      if (ARG3) {
+         struct vki_drm_i915_gem_get_tiling *data = (struct vki_drm_i915_gem_get_tiling *)ARG3;
+        POST_MEM_WRITE((Addr)&data->tiling_mode, sizeof(data->tiling_mode));
+         POST_MEM_WRITE((Addr)&data->swizzle_mode, sizeof(data->swizzle_mode));
+      }
+      break;
+   case VKI_DRM_IOCTL_I915_GEM_GET_APERTURE:
+      if (ARG3) {
+         struct vki_drm_i915_gem_get_aperture *data = (struct vki_drm_i915_gem_get_aperture *)ARG3;
+         POST_MEM_WRITE((Addr)&data->aper_size, sizeof(data->aper_size));
+         POST_MEM_WRITE((Addr)&data->aper_available_size, sizeof(data->aper_available_size));
+      }
+      break;
+
    default:
       PRINT("sys_ioctl ( %ld, 0x%lx, 0x%lx )",ARG1,ARG2,ARG3);
       PRE_REG_READ3(long, "ioctl",
index 358ee10a163c73629f095e859be65e73dc5006bb..f05916502a36d946eb8aff4b944fe2030bbaee6f 100644 (file)
@@ -66,5 +66,6 @@ nobase_pkginclude_HEADERS = \
        vki/vki-scnums-s390x-linux.h    \
        vki/vki-scnums-mips32-linux.h   \
        vki/vki-scnums-mips64-linux.h   \
-       vki/vki-scnums-darwin.h         \
-       vki/vki-xen.h
+       vki/vki-scnums-darwin.h         \
+       vki/vki-xen.h                   \
+       vki/vki-linux-drm.h
index 3610b1c86dfa098fd24141ac54ead7ac55e3b4b9..53a9ee535fe24f379e41ea61ff3995625960c229 100644 (file)
@@ -47,6 +47,7 @@
 
 #if defined(VGO_linux)
 #  include "vki/vki-linux.h"
+#  include "vki/vki-linux-drm.h"
 #elif defined(VGO_darwin)
 #  include "vki/vki-darwin.h"
 #else
diff --git a/include/vki/vki-linux-drm.h b/include/vki/vki-linux-drm.h
new file mode 100644 (file)
index 0000000..8bd0746
--- /dev/null
@@ -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                                                          ---*/
+/*--------------------------------------------------------------------*/