Index: /trunk/include/VBox/VBoxGuest.h
===================================================================
--- /trunk/include/VBox/VBoxGuest.h	(revision 49626)
+++ /trunk/include/VBox/VBoxGuest.h	(revision 49627)
@@ -509,4 +509,24 @@
 #endif /* RT_OS_OS2 */
 
+#ifdef RT_OS_LINUX
+
+/* Private IOCtls between user space and the kernel video driver.  DRM private
+ * IOCtls always have the type 'd' and a number between 0x40 and 0x99 (0x9F?) */
+
+# define VBOX_DRM_IOCTL(a) (0x40 + DRM_VBOX_ ## a)
+
+/** Stop using HGSMI in the kernel driver until it is re-enabled, so that a
+ *  user-space driver can use it.  It must be re-enabled before the kernel
+ *  driver can be used again in a sensible way. */
+# define DRM_VBOX_DISABLE_HGSMI    0
+# define DRM_IOCTL_VBOX_DISABLE_HGSMI    VBOX_DRM_IOCTL(DISABLE_HGSMI)
+# define VBOXVIDEO_IOCTL_DISABLE_HGSMI   _IO('d', DRM_IOCTL_VBOX_DISABLE_HGSMI)
+/** Enable HGSMI in the kernel driver after it was previously disabled. */
+# define DRM_VBOX_ENABLE_HGSMI     1
+# define DRM_IOCTL_VBOX_ENABLE_HGSMI     VBOX_DRM_IOCTL(ENABLE_HGSMI)
+# define VBOXVIDEO_IOCTL_ENABLE_HGSMI    _IO('d', DRM_IOCTL_VBOX_ENABLE_HGSMI)
+
+#endif /* RT_OS_LINUX */
+
 /** @} */
 #endif /* !defined(IN_RC) && !defined(IN_RING0_AGNOSTIC) && !defined(IPRT_NO_CRT) */
Index: /trunk/src/VBox/Additions/linux/drm/vbox_drv.c
===================================================================
--- /trunk/src/VBox/Additions/linux/drm/vbox_drv.c	(revision 49626)
+++ /trunk/src/VBox/Additions/linux/drm/vbox_drv.c	(revision 49627)
@@ -48,4 +48,6 @@
 #include "vbox_drv.h"
 
+#include <VBox/VBoxGuest.h>
+
 #include <linux/module.h>
 #include <linux/console.h>
@@ -91,4 +93,14 @@
 };
 
+
+static struct drm_ioctl_desc vbox_ioctls[] =
+{
+    DRM_IOCTL_DEF_DRV(VBOX_DISABLE_HGSMI, VBoxDisableHGSMI,
+                      DRM_UNLOCKED|DRM_ROOT_ONLY),
+    DRM_IOCTL_DEF_DRV(VBOX_ENABLE_HGSMI, VBoxEnableHGSMI,
+                      DRM_UNLOCKED|DRM_ROOT_ONLY)
+};
+
+
 static const struct file_operations vbox_fops =
 {
@@ -114,4 +126,6 @@
     .unload = vbox_driver_unload,
 
+    .ioctls = vbox_ioctls,
+    .num_ioctls = RT_ELEMENTS(vbox_ioctls),
     .fops = &vbox_fops,
     .name = DRIVER_NAME,
Index: /trunk/src/VBox/Additions/linux/drm/vbox_drv.h
===================================================================
--- /trunk/src/VBox/Additions/linux/drm/vbox_drv.h	(revision 49626)
+++ /trunk/src/VBox/Additions/linux/drm/vbox_drv.h	(revision 49627)
@@ -90,5 +90,10 @@
     unsigned cCrtcs;
     bool vga2_clone;
+    /** Amount of available VRAM, including space used for buffers. */
+    uint32_t full_vram_size;
+    /** Amount of available VRAM, not including space used for buffers. */
     uint32_t vram_size;
+    /** Is HGSMI currently disabled? */
+    bool fDisableHGSMI;
 
     struct vbox_fbdev *fbdev;
@@ -161,4 +166,5 @@
 extern int vbox_mode_init(struct drm_device *dev);
 extern void vbox_mode_fini(struct drm_device *dev);
+extern void VBoxRefreshModes(struct drm_device *pDev);
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
@@ -222,4 +228,11 @@
           uint32_t flags, struct vbox_bo **pvboxbo);
 
+/** IOCtl handler to stop this driver using HGSMI so that user space can. */
+extern int VBoxDisableHGSMI(struct drm_device *dev, void *data,
+                            struct drm_file *file_priv);
+/** IOCtl handler to start this driver using HGSMI again. */
+extern int VBoxEnableHGSMI(struct drm_device *dev, void *data,
+                           struct drm_file *file_priv);
+
 int vbox_gem_create(struct drm_device *dev,
            u32 size, bool iskernel,
