ff70199
From c1d9b32d8ee2e97e2867fa759eb84d436cca0311 Mon Sep 17 00:00:00 2001
ff70199
From: Thomas Hellstrom <thellstrom@vmware.com>
ff70199
Date: Thu, 25 Jun 2015 10:47:43 -0700
ff70199
Subject: [PATCH 1/2] vmwgfx: Rework device initialization
ff70199
ff70199
This commit reworks device initialization so that we always enable the
ff70199
FIFO at driver load, deferring SVGA enable until either first modeset
ff70199
or fbdev enable.
ff70199
This should always leave the fifo properly enabled for render- and
ff70199
control nodes.
ff70199
In addition,
ff70199
*) We disable the use of VRAM when SVGA is not enabled.
ff70199
*) We simplify PM support so that we only throw out resources on hibernate,
ff70199
not on suspend, since the device keeps its state on suspend.
ff70199
ff70199
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
ff70199
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
ff70199
---
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_context.c |   8 +-
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c     | 337 ++++++++++++++++++--------------
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h     |  19 +-
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_fb.c      |   4 +
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c    |  12 +-
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c     |   1 +
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_mob.c     |   6 +-
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c    |   1 +
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_shader.c  |   4 +-
ff70199
 drivers/gpu/drm/vmwgfx/vmwgfx_surface.c |  12 +-
ff70199
 10 files changed, 230 insertions(+), 174 deletions(-)
ff70199
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_context.c b/drivers/gpu/drm/vmwgfx/vmwgfx_context.c
ff70199
index 5ac92874404d..a8e370a55e90 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_context.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_context.c
ff70199
@@ -140,7 +140,7 @@ static void vmw_hw_context_destroy(struct vmw_resource *res)
ff70199
 	cmd->body.cid = cpu_to_le32(res->id);
ff70199
 
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 }
ff70199
 
ff70199
 static int vmw_gb_context_init(struct vmw_private *dev_priv,
ff70199
@@ -220,7 +220,7 @@ static int vmw_context_init(struct vmw_private *dev_priv,
ff70199
 	cmd->body.cid = cpu_to_le32(res->id);
ff70199
 
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
-	(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+	vmw_fifo_resource_inc(dev_priv);
ff70199
 	vmw_resource_activate(res, vmw_hw_context_destroy);
ff70199
 	return 0;
ff70199
 
ff70199
@@ -281,7 +281,7 @@ static int vmw_gb_context_create(struct vmw_resource *res)
ff70199
 	cmd->header.size = sizeof(cmd->body);
ff70199
 	cmd->body.cid = res->id;
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
-	(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+	vmw_fifo_resource_inc(dev_priv);
ff70199
 
ff70199
 	return 0;
ff70199
 
ff70199
@@ -414,7 +414,7 @@ static int vmw_gb_context_destroy(struct vmw_resource *res)
ff70199
 	if (dev_priv->query_cid == res->id)
ff70199
 		dev_priv->query_cid_valid = false;
ff70199
 	vmw_resource_release_id(res);
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 
ff70199
 	return 0;
ff70199
 }
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
ff70199
index 620bb5cf617c..a4766acd0ea2 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
ff70199
@@ -339,24 +339,47 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
ff70199
 	return ret;
ff70199
 }
ff70199
 
ff70199
-static int vmw_request_device(struct vmw_private *dev_priv)
ff70199
+/**
ff70199
+ * vmw_request_device_late - Perform late device setup
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private.
ff70199
+ *
ff70199
+ * This function performs setup of otables and enables large command
ff70199
+ * buffer submission. These tasks are split out to a separate function
ff70199
+ * because it reverts vmw_release_device_early and is intended to be used
ff70199
+ * by an error path in the hibernation code.
ff70199
+ */
ff70199
+static int vmw_request_device_late(struct vmw_private *dev_priv)
ff70199
 {
ff70199
 	int ret;
ff70199
 
ff70199
-	ret = vmw_fifo_init(dev_priv, &dev_priv->fifo);
ff70199
-	if (unlikely(ret != 0)) {
ff70199
-		DRM_ERROR("Unable to initialize FIFO.\n");
ff70199
-		return ret;
ff70199
-	}
ff70199
-	vmw_fence_fifo_up(dev_priv->fman);
ff70199
 	if (dev_priv->has_mob) {
ff70199
 		ret = vmw_otables_setup(dev_priv);
ff70199
 		if (unlikely(ret != 0)) {
ff70199
 			DRM_ERROR("Unable to initialize "
ff70199
 				  "guest Memory OBjects.\n");
ff70199
-			goto out_no_mob;
ff70199
+			return ret;
ff70199
 		}
ff70199
 	}
ff70199
+
ff70199
+	return 0;
ff70199
+}
ff70199
+
ff70199
+static int vmw_request_device(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	int ret;
ff70199
+
ff70199
+	ret = vmw_fifo_init(dev_priv, &dev_priv->fifo);
ff70199
+	if (unlikely(ret != 0)) {
ff70199
+		DRM_ERROR("Unable to initialize FIFO.\n");
ff70199
+		return ret;
ff70199
+	}
ff70199
+	vmw_fence_fifo_up(dev_priv->fman);
ff70199
+
ff70199
+	ret = vmw_request_device_late(dev_priv);
ff70199
+	if (ret)
ff70199
+		goto out_no_mob;
ff70199
+
ff70199
 	ret = vmw_dummy_query_bo_create(dev_priv);
ff70199
 	if (unlikely(ret != 0))
ff70199
 		goto out_no_query_bo;
ff70199
@@ -364,15 +387,25 @@ static int vmw_request_device(struct vmw_private *dev_priv)
ff70199
 	return 0;
ff70199
 
ff70199
 out_no_query_bo:
ff70199
-	if (dev_priv->has_mob)
ff70199
+	if (dev_priv->has_mob) {
ff70199
+		(void) ttm_bo_evict_mm(&dev_priv->bdev, VMW_PL_MOB);
ff70199
 		vmw_otables_takedown(dev_priv);
ff70199
+	}
ff70199
 out_no_mob:
ff70199
 	vmw_fence_fifo_down(dev_priv->fman);
ff70199
 	vmw_fifo_release(dev_priv, &dev_priv->fifo);
ff70199
 	return ret;
ff70199
 }
ff70199
 
ff70199
-static void vmw_release_device(struct vmw_private *dev_priv)
ff70199
+/**
ff70199
+ * vmw_release_device_early - Early part of fifo takedown.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ *
ff70199
+ * This is the first part of command submission takedown, to be called before
ff70199
+ * buffer management is taken down.
ff70199
+ */
ff70199
+static void vmw_release_device_early(struct vmw_private *dev_priv)
ff70199
 {
ff70199
 	/*
ff70199
 	 * Previous destructions should've released
ff70199
@@ -382,64 +415,24 @@ static void vmw_release_device(struct vmw_private *dev_priv)
ff70199
 	BUG_ON(dev_priv->pinned_bo != NULL);
ff70199
 
ff70199
 	ttm_bo_unref(&dev_priv->dummy_query_bo);
ff70199
-	if (dev_priv->has_mob)
ff70199
+	if (dev_priv->has_mob) {
ff70199
+		ttm_bo_evict_mm(&dev_priv->bdev, VMW_PL_MOB);
ff70199
 		vmw_otables_takedown(dev_priv);
ff70199
-	vmw_fence_fifo_down(dev_priv->fman);
ff70199
-	vmw_fifo_release(dev_priv, &dev_priv->fifo);
ff70199
-}
ff70199
-
ff70199
-
ff70199
-/**
ff70199
- * Increase the 3d resource refcount.
ff70199
- * If the count was prevously zero, initialize the fifo, switching to svga
ff70199
- * mode. Note that the master holds a ref as well, and may request an
ff70199
- * explicit switch to svga mode if fb is not running, using @unhide_svga.
ff70199
- */
ff70199
-int vmw_3d_resource_inc(struct vmw_private *dev_priv,
ff70199
-			bool unhide_svga)
ff70199
-{
ff70199
-	int ret = 0;
ff70199
-
ff70199
-	mutex_lock(&dev_priv->release_mutex);
ff70199
-	if (unlikely(dev_priv->num_3d_resources++ == 0)) {
ff70199
-		ret = vmw_request_device(dev_priv);
ff70199
-		if (unlikely(ret != 0))
ff70199
-			--dev_priv->num_3d_resources;
ff70199
-	} else if (unhide_svga) {
ff70199
-		vmw_write(dev_priv, SVGA_REG_ENABLE,
ff70199
-			  vmw_read(dev_priv, SVGA_REG_ENABLE) &
ff70199
-			  ~SVGA_REG_ENABLE_HIDE);
ff70199
 	}
ff70199
-
ff70199
-	mutex_unlock(&dev_priv->release_mutex);
ff70199
-	return ret;
ff70199
 }
ff70199
 
ff70199
 /**
ff70199
- * Decrease the 3d resource refcount.
ff70199
- * If the count reaches zero, disable the fifo, switching to vga mode.
ff70199
- * Note that the master holds a refcount as well, and may request an
ff70199
- * explicit switch to vga mode when it releases its refcount to account
ff70199
- * for the situation of an X server vt switch to VGA with 3d resources
ff70199
- * active.
ff70199
+ * vmw_release_device_late - Late part of fifo takedown.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ *
ff70199
+ * This is the last part of the command submission takedown, to be called when
ff70199
+ * command submission is no longer needed. It may wait on pending fences.
ff70199
  */
ff70199
-void vmw_3d_resource_dec(struct vmw_private *dev_priv,
ff70199
-			 bool hide_svga)
ff70199
+static void vmw_release_device_late(struct vmw_private *dev_priv)
ff70199
 {
ff70199
-	int32_t n3d;
ff70199
-
ff70199
-	mutex_lock(&dev_priv->release_mutex);
ff70199
-	if (unlikely(--dev_priv->num_3d_resources == 0))
ff70199
-		vmw_release_device(dev_priv);
ff70199
-	else if (hide_svga)
ff70199
-		vmw_write(dev_priv, SVGA_REG_ENABLE,
ff70199
-			  vmw_read(dev_priv, SVGA_REG_ENABLE) |
ff70199
-			  SVGA_REG_ENABLE_HIDE);
ff70199
-
ff70199
-	n3d = (int32_t) dev_priv->num_3d_resources;
ff70199
-	mutex_unlock(&dev_priv->release_mutex);
ff70199
-
ff70199
-	BUG_ON(n3d < 0);
ff70199
+	vmw_fence_fifo_down(dev_priv->fman);
ff70199
+	vmw_fifo_release(dev_priv, &dev_priv->fifo);
ff70199
 }
ff70199
 
ff70199
 /**
ff70199
@@ -603,6 +596,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
ff70199
 	spin_lock_init(&dev_priv->hw_lock);
ff70199
 	spin_lock_init(&dev_priv->waiter_lock);
ff70199
 	spin_lock_init(&dev_priv->cap_lock);
ff70199
+	spin_lock_init(&dev_priv->svga_lock);
ff70199
 
ff70199
 	for (i = vmw_res_context; i < vmw_res_max; ++i) {
ff70199
 		idr_init(&dev_priv->res_idr[i]);
ff70199
@@ -714,17 +708,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
ff70199
 	dev_priv->active_master = &dev_priv->fbdev_master;
ff70199
 
ff70199
 
ff70199
-	ret = ttm_bo_device_init(&dev_priv->bdev,
ff70199
-				 dev_priv->bo_global_ref.ref.object,
ff70199
-				 &vmw_bo_driver,
ff70199
-				 dev->anon_inode->i_mapping,
ff70199
-				 VMWGFX_FILE_PAGE_OFFSET,
ff70199
-				 false);
ff70199
-	if (unlikely(ret != 0)) {
ff70199
-		DRM_ERROR("Failed initializing TTM buffer object driver.\n");
ff70199
-		goto out_err1;
ff70199
-	}
ff70199
-
ff70199
 	dev_priv->mmio_mtrr = arch_phys_wc_add(dev_priv->mmio_start,
ff70199
 					       dev_priv->mmio_size);
ff70199
 
ff70199
@@ -787,13 +770,28 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
ff70199
 		goto out_no_fman;
ff70199
 	}
ff70199
 
ff70199
+	ret = ttm_bo_device_init(&dev_priv->bdev,
ff70199
+				 dev_priv->bo_global_ref.ref.object,
ff70199
+				 &vmw_bo_driver,
ff70199
+				 dev->anon_inode->i_mapping,
ff70199
+				 VMWGFX_FILE_PAGE_OFFSET,
ff70199
+				 false);
ff70199
+	if (unlikely(ret != 0)) {
ff70199
+		DRM_ERROR("Failed initializing TTM buffer object driver.\n");
ff70199
+		goto out_no_bdev;
ff70199
+	}
ff70199
 
ff70199
+	/*
ff70199
+	 * Enable VRAM, but initially don't use it until SVGA is enabled and
ff70199
+	 * unhidden.
ff70199
+	 */
ff70199
 	ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM,
ff70199
 			     (dev_priv->vram_size >> PAGE_SHIFT));
ff70199
 	if (unlikely(ret != 0)) {
ff70199
 		DRM_ERROR("Failed initializing memory manager for VRAM.\n");
ff70199
 		goto out_no_vram;
ff70199
 	}
ff70199
+	dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
ff70199
 
ff70199
 	dev_priv->has_gmr = true;
ff70199
 	if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) ||
ff70199
@@ -814,18 +812,18 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
ff70199
 		}
ff70199
 	}
ff70199
 
ff70199
-	vmw_kms_save_vga(dev_priv);
ff70199
-
ff70199
-	/* Start kms and overlay systems, needs fifo. */
ff70199
 	ret = vmw_kms_init(dev_priv);
ff70199
 	if (unlikely(ret != 0))
ff70199
 		goto out_no_kms;
ff70199
 	vmw_overlay_init(dev_priv);
ff70199
 
ff70199
+	ret = vmw_request_device(dev_priv);
ff70199
+	if (ret)
ff70199
+		goto out_no_fifo;
ff70199
+
ff70199
 	if (dev_priv->enable_fb) {
ff70199
-		ret = vmw_3d_resource_inc(dev_priv, true);
ff70199
-		if (unlikely(ret != 0))
ff70199
-			goto out_no_fifo;
ff70199
+		vmw_fifo_resource_inc(dev_priv);
ff70199
+		vmw_svga_enable(dev_priv);
ff70199
 		vmw_fb_init(dev_priv);
ff70199
 	}
ff70199
 
ff70199
@@ -838,13 +836,14 @@ out_no_fifo:
ff70199
 	vmw_overlay_close(dev_priv);
ff70199
 	vmw_kms_close(dev_priv);
ff70199
 out_no_kms:
ff70199
-	vmw_kms_restore_vga(dev_priv);
ff70199
 	if (dev_priv->has_mob)
ff70199
 		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
ff70199
 	if (dev_priv->has_gmr)
ff70199
 		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
ff70199
 	(void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
ff70199
 out_no_vram:
ff70199
+	(void)ttm_bo_device_release(&dev_priv->bdev);
ff70199
+out_no_bdev:
ff70199
 	vmw_fence_manager_takedown(dev_priv->fman);
ff70199
 out_no_fman:
ff70199
 	if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
ff70199
@@ -860,8 +859,6 @@ out_err4:
ff70199
 	iounmap(dev_priv->mmio_virt);
ff70199
 out_err3:
ff70199
 	arch_phys_wc_del(dev_priv->mmio_mtrr);
ff70199
-	(void)ttm_bo_device_release(&dev_priv->bdev);
ff70199
-out_err1:
ff70199
 	vmw_ttm_global_release(dev_priv);
ff70199
 out_err0:
ff70199
 	for (i = vmw_res_context; i < vmw_res_max; ++i)
ff70199
@@ -883,18 +880,22 @@ static int vmw_driver_unload(struct drm_device *dev)
ff70199
 	vfree(dev_priv->ctx.cmd_bounce);
ff70199
 	if (dev_priv->enable_fb) {
ff70199
 		vmw_fb_close(dev_priv);
ff70199
-		vmw_kms_restore_vga(dev_priv);
ff70199
-		vmw_3d_resource_dec(dev_priv, false);
ff70199
+		vmw_fifo_resource_dec(dev_priv);
ff70199
+		vmw_svga_disable(dev_priv);
ff70199
 	}
ff70199
+
ff70199
 	vmw_kms_close(dev_priv);
ff70199
 	vmw_overlay_close(dev_priv);
ff70199
 
ff70199
-	if (dev_priv->has_mob)
ff70199
-		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
ff70199
 	if (dev_priv->has_gmr)
ff70199
 		(void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
ff70199
 	(void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
ff70199
 
ff70199
+	vmw_release_device_early(dev_priv);
ff70199
+	if (dev_priv->has_mob)
ff70199
+		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
ff70199
+	(void) ttm_bo_device_release(&dev_priv->bdev);
ff70199
+	vmw_release_device_late(dev_priv);
ff70199
 	vmw_fence_manager_takedown(dev_priv->fman);
ff70199
 	if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
ff70199
 		drm_irq_uninstall(dev_priv->dev);
ff70199
@@ -1148,27 +1149,13 @@ static int vmw_master_set(struct drm_device *dev,
ff70199
 	struct vmw_master *vmaster = vmw_master(file_priv->master);
ff70199
 	int ret = 0;
ff70199
 
ff70199
-	if (!dev_priv->enable_fb) {
ff70199
-		ret = vmw_3d_resource_inc(dev_priv, true);
ff70199
-		if (unlikely(ret != 0))
ff70199
-			return ret;
ff70199
-		vmw_kms_save_vga(dev_priv);
ff70199
-		vmw_write(dev_priv, SVGA_REG_TRACES, 0);
ff70199
-	}
ff70199
-
ff70199
 	if (active) {
ff70199
 		BUG_ON(active != &dev_priv->fbdev_master);
ff70199
 		ret = ttm_vt_lock(&active->lock, false, vmw_fp->tfile);
ff70199
 		if (unlikely(ret != 0))
ff70199
-			goto out_no_active_lock;
ff70199
+			return ret;
ff70199
 
ff70199
 		ttm_lock_set_kill(&active->lock, true, SIGTERM);
ff70199
-		ret = ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM);
ff70199
-		if (unlikely(ret != 0)) {
ff70199
-			DRM_ERROR("Unable to clean VRAM on "
ff70199
-				  "master drop.\n");
ff70199
-		}
ff70199
-
ff70199
 		dev_priv->active_master = NULL;
ff70199
 	}
ff70199
 
ff70199
@@ -1182,14 +1169,6 @@ static int vmw_master_set(struct drm_device *dev,
ff70199
 	dev_priv->active_master = vmaster;
ff70199
 
ff70199
 	return 0;
ff70199
-
ff70199
-out_no_active_lock:
ff70199
-	if (!dev_priv->enable_fb) {
ff70199
-		vmw_kms_restore_vga(dev_priv);
ff70199
-		vmw_3d_resource_dec(dev_priv, true);
ff70199
-		vmw_write(dev_priv, SVGA_REG_TRACES, 1);
ff70199
-	}
ff70199
-	return ret;
ff70199
 }
ff70199
 
ff70199
 static void vmw_master_drop(struct drm_device *dev,
ff70199
@@ -1214,16 +1193,9 @@ static void vmw_master_drop(struct drm_device *dev,
ff70199
 	}
ff70199
 
ff70199
 	ttm_lock_set_kill(&vmaster->lock, false, SIGTERM);
ff70199
-	vmw_execbuf_release_pinned_bo(dev_priv);
ff70199
 
ff70199
-	if (!dev_priv->enable_fb) {
ff70199
-		ret = ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM);
ff70199
-		if (unlikely(ret != 0))
ff70199
-			DRM_ERROR("Unable to clean VRAM on master drop.\n");
ff70199
-		vmw_kms_restore_vga(dev_priv);
ff70199
-		vmw_3d_resource_dec(dev_priv, true);
ff70199
-		vmw_write(dev_priv, SVGA_REG_TRACES, 1);
ff70199
-	}
ff70199
+	if (!dev_priv->enable_fb)
ff70199
+		vmw_svga_disable(dev_priv);
ff70199
 
ff70199
 	dev_priv->active_master = &dev_priv->fbdev_master;
ff70199
 	ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
ff70199
@@ -1233,6 +1205,74 @@ static void vmw_master_drop(struct drm_device *dev,
ff70199
 		vmw_fb_on(dev_priv);
ff70199
 }
ff70199
 
ff70199
+/**
ff70199
+ * __vmw_svga_enable - Enable SVGA mode, FIFO and use of VRAM.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ * Needs the reservation sem to be held in non-exclusive mode.
ff70199
+ */
ff70199
+void __vmw_svga_enable(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	spin_lock(&dev_priv->svga_lock);
ff70199
+	if (!dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
ff70199
+		vmw_write(dev_priv, SVGA_REG_ENABLE, SVGA_REG_ENABLE);
ff70199
+		dev_priv->bdev.man[TTM_PL_VRAM].use_type = true;
ff70199
+	}
ff70199
+	spin_unlock(&dev_priv->svga_lock);
ff70199
+}
ff70199
+
ff70199
+/**
ff70199
+ * vmw_svga_enable - Enable SVGA mode, FIFO and use of VRAM.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ */
ff70199
+void vmw_svga_enable(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	ttm_read_lock(&dev_priv->reservation_sem, false);
ff70199
+	__vmw_svga_enable(dev_priv);
ff70199
+	ttm_read_unlock(&dev_priv->reservation_sem);
ff70199
+}
ff70199
+
ff70199
+/**
ff70199
+ * __vmw_svga_disable - Disable SVGA mode and use of VRAM.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ * Needs the reservation sem to be held in exclusive mode.
ff70199
+ * Will not empty VRAM. VRAM must be emptied by caller.
ff70199
+ */
ff70199
+void __vmw_svga_disable(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	spin_lock(&dev_priv->svga_lock);
ff70199
+	if (dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
ff70199
+		dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
ff70199
+		vmw_write(dev_priv, SVGA_REG_ENABLE,
ff70199
+			  SVGA_REG_ENABLE_ENABLE_HIDE);
ff70199
+	}
ff70199
+	spin_unlock(&dev_priv->svga_lock);
ff70199
+}
ff70199
+
ff70199
+/**
ff70199
+ * vmw_svga_disable - Disable SVGA_MODE, and use of VRAM. Keep the fifo
ff70199
+ * running.
ff70199
+ *
ff70199
+ * @dev_priv: Pointer to device private struct.
ff70199
+ * Will empty VRAM.
ff70199
+ */
ff70199
+void vmw_svga_disable(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	ttm_write_lock(&dev_priv->reservation_sem, false);
ff70199
+	spin_lock(&dev_priv->svga_lock);
ff70199
+	if (dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
ff70199
+		dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
ff70199
+		vmw_write(dev_priv, SVGA_REG_ENABLE,
ff70199
+			  SVGA_REG_ENABLE_ENABLE_HIDE);
ff70199
+		spin_unlock(&dev_priv->svga_lock);
ff70199
+		if (ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM))
ff70199
+			DRM_ERROR("Failed evicting VRAM buffers.\n");
ff70199
+	} else
ff70199
+		spin_unlock(&dev_priv->svga_lock);
ff70199
+	ttm_write_unlock(&dev_priv->reservation_sem);
ff70199
+}
ff70199
 
ff70199
 static void vmw_remove(struct pci_dev *pdev)
ff70199
 {
ff70199
@@ -1250,21 +1290,21 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
ff70199
 
ff70199
 	switch (val) {
ff70199
 	case PM_HIBERNATION_PREPARE:
ff70199
-	case PM_SUSPEND_PREPARE:
ff70199
 		ttm_suspend_lock(&dev_priv->reservation_sem);
ff70199
 
ff70199
-		/**
ff70199
+		/*
ff70199
 		 * This empties VRAM and unbinds all GMR bindings.
ff70199
 		 * Buffer contents is moved to swappable memory.
ff70199
 		 */
ff70199
 		vmw_execbuf_release_pinned_bo(dev_priv);
ff70199
 		vmw_resource_evict_all(dev_priv);
ff70199
+		vmw_release_device_early(dev_priv);
ff70199
 		ttm_bo_swapout_all(&dev_priv->bdev);
ff70199
-
ff70199
+		vmw_fence_fifo_down(dev_priv->fman);
ff70199
 		break;
ff70199
 	case PM_POST_HIBERNATION:
ff70199
-	case PM_POST_SUSPEND:
ff70199
 	case PM_POST_RESTORE:
ff70199
+		vmw_fence_fifo_up(dev_priv->fman);
ff70199
 		ttm_suspend_unlock(&dev_priv->reservation_sem);
ff70199
 
ff70199
 		break;
ff70199
@@ -1276,20 +1316,13 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
ff70199
 	return 0;
ff70199
 }
ff70199
 
ff70199
-/**
ff70199
- * These might not be needed with the virtual SVGA device.
ff70199
- */
ff70199
-
ff70199
 static int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
ff70199
 {
ff70199
 	struct drm_device *dev = pci_get_drvdata(pdev);
ff70199
 	struct vmw_private *dev_priv = vmw_priv(dev);
ff70199
 
ff70199
-	if (dev_priv->num_3d_resources != 0) {
ff70199
-		DRM_INFO("Can't suspend or hibernate "
ff70199
-			 "while 3D resources are active.\n");
ff70199
+	if (dev_priv->refuse_hibernation)
ff70199
 		return -EBUSY;
ff70199
-	}
ff70199
 
ff70199
 	pci_save_state(pdev);
ff70199
 	pci_disable_device(pdev);
ff70199
@@ -1321,56 +1354,62 @@ static int vmw_pm_resume(struct device *kdev)
ff70199
 	return vmw_pci_resume(pdev);
ff70199
 }
ff70199
 
ff70199
-static int vmw_pm_prepare(struct device *kdev)
ff70199
+static int vmw_pm_freeze(struct device *kdev)
ff70199
 {
ff70199
 	struct pci_dev *pdev = to_pci_dev(kdev);
ff70199
 	struct drm_device *dev = pci_get_drvdata(pdev);
ff70199
 	struct vmw_private *dev_priv = vmw_priv(dev);
ff70199
 
ff70199
-	/**
ff70199
-	 * Release 3d reference held by fbdev and potentially
ff70199
-	 * stop fifo.
ff70199
-	 */
ff70199
 	dev_priv->suspended = true;
ff70199
 	if (dev_priv->enable_fb)
ff70199
-			vmw_3d_resource_dec(dev_priv, true);
ff70199
-
ff70199
-	if (dev_priv->num_3d_resources != 0) {
ff70199
-
ff70199
-		DRM_INFO("Can't suspend or hibernate "
ff70199
-			 "while 3D resources are active.\n");
ff70199
+		vmw_fifo_resource_dec(dev_priv);
ff70199
 
ff70199
+	if (atomic_read(&dev_priv->num_fifo_resources) != 0) {
ff70199
+		DRM_ERROR("Can't hibernate while 3D resources are active.\n");
ff70199
 		if (dev_priv->enable_fb)
ff70199
-			vmw_3d_resource_inc(dev_priv, true);
ff70199
+			vmw_fifo_resource_inc(dev_priv);
ff70199
+		WARN_ON(vmw_request_device_late(dev_priv));
ff70199
 		dev_priv->suspended = false;
ff70199
 		return -EBUSY;
ff70199
 	}
ff70199
 
ff70199
+	if (dev_priv->enable_fb)
ff70199
+		__vmw_svga_disable(dev_priv);
ff70199
+	
ff70199
+	vmw_release_device_late(dev_priv);
ff70199
+
ff70199
 	return 0;
ff70199
 }
ff70199
 
ff70199
-static void vmw_pm_complete(struct device *kdev)
ff70199
+static int vmw_pm_restore(struct device *kdev)
ff70199
 {
ff70199
 	struct pci_dev *pdev = to_pci_dev(kdev);
ff70199
 	struct drm_device *dev = pci_get_drvdata(pdev);
ff70199
 	struct vmw_private *dev_priv = vmw_priv(dev);
ff70199
+	int ret;
ff70199
 
ff70199
 	vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2);
ff70199
 	(void) vmw_read(dev_priv, SVGA_REG_ID);
ff70199
 
ff70199
-	/**
ff70199
-	 * Reclaim 3d reference held by fbdev and potentially
ff70199
-	 * start fifo.
ff70199
-	 */
ff70199
 	if (dev_priv->enable_fb)
ff70199
-			vmw_3d_resource_inc(dev_priv, false);
ff70199
+		vmw_fifo_resource_inc(dev_priv);
ff70199
+
ff70199
+	ret = vmw_request_device(dev_priv);
ff70199
+	if (ret)
ff70199
+		return ret;
ff70199
+
ff70199
+	if (dev_priv->enable_fb)
ff70199
+		__vmw_svga_enable(dev_priv);
ff70199
 
ff70199
 	dev_priv->suspended = false;
ff70199
+
ff70199
+	return 0;
ff70199
 }
ff70199
 
ff70199
 static const struct dev_pm_ops vmw_pm_ops = {
ff70199
-	.prepare = vmw_pm_prepare,
ff70199
-	.complete = vmw_pm_complete,
ff70199
+	.freeze = vmw_pm_freeze,
ff70199
+	.thaw = vmw_pm_restore,
ff70199
+	.restore = vmw_pm_restore,
ff70199
 	.suspend = vmw_pm_suspend,
ff70199
 	.resume = vmw_pm_resume,
ff70199
 };
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
ff70199
index d26a6daa9719..a5f221eaf076 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
ff70199
@@ -484,6 +484,7 @@ struct vmw_private {
ff70199
 
ff70199
 	bool stealth;
ff70199
 	bool enable_fb;
ff70199
+	spinlock_t svga_lock;
ff70199
 
ff70199
 	/**
ff70199
 	 * Master management.
ff70199
@@ -493,9 +494,10 @@ struct vmw_private {
ff70199
 	struct vmw_master fbdev_master;
ff70199
 	struct notifier_block pm_nb;
ff70199
 	bool suspended;
ff70199
+	bool refuse_hibernation;
ff70199
 
ff70199
 	struct mutex release_mutex;
ff70199
-	uint32_t num_3d_resources;
ff70199
+	atomic_t num_fifo_resources;
ff70199
 
ff70199
 	/*
ff70199
 	 * Replace this with an rwsem as soon as we have down_xx_interruptible()
ff70199
@@ -587,8 +589,9 @@ static inline uint32_t vmw_read(struct vmw_private *dev_priv,
ff70199
 	return val;
ff70199
 }
ff70199
 
ff70199
-int vmw_3d_resource_inc(struct vmw_private *dev_priv, bool unhide_svga);
ff70199
-void vmw_3d_resource_dec(struct vmw_private *dev_priv, bool hide_svga);
ff70199
+extern void vmw_svga_enable(struct vmw_private *dev_priv);
ff70199
+extern void vmw_svga_disable(struct vmw_private *dev_priv);
ff70199
+
ff70199
 
ff70199
 /**
ff70199
  * GMR utilities - vmwgfx_gmr.c
ff70199
@@ -1116,4 +1119,14 @@ static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
ff70199
 {
ff70199
 	return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
ff70199
 }
ff70199
+
ff70199
+static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	atomic_inc(&dev_priv->num_fifo_resources);
ff70199
+}
ff70199
+
ff70199
+static inline void vmw_fifo_resource_dec(struct vmw_private *dev_priv)
ff70199
+{
ff70199
+	atomic_dec(&dev_priv->num_fifo_resources);
ff70199
+}
ff70199
 #endif
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
ff70199
index 0a474f391fad..0e062613a7db 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
ff70199
@@ -596,7 +596,10 @@ int vmw_fb_off(struct vmw_private *vmw_priv)
ff70199
 
ff70199
 	info = vmw_priv->fb_info;
ff70199
 	par = info->par;
ff70199
+	if (!par->bo_ptr)
ff70199
+		return 0;
ff70199
 
ff70199
+	vmw_kms_save_vga(vmw_priv);
ff70199
 	spin_lock_irqsave(&par->dirty.lock, flags);
ff70199
 	par->dirty.active = false;
ff70199
 	spin_unlock_irqrestore(&par->dirty.lock, flags);
ff70199
@@ -648,6 +651,7 @@ int vmw_fb_on(struct vmw_private *vmw_priv)
ff70199
 	spin_lock_irqsave(&par->dirty.lock, flags);
ff70199
 	par->dirty.active = true;
ff70199
 	spin_unlock_irqrestore(&par->dirty.lock, flags);
ff70199
+	vmw_kms_restore_vga(vmw_priv);
ff70199
 
ff70199
 err_no_buffer:
ff70199
 	vmw_fb_set_par(info);
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
ff70199
index 39f2b03888e7..cd5d9f3fe0e0 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
ff70199
@@ -98,7 +98,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
ff70199
 	__le32 __iomem *fifo_mem = dev_priv->mmio_virt;
ff70199
 	uint32_t max;
ff70199
 	uint32_t min;
ff70199
-	uint32_t dummy;
ff70199
 
ff70199
 	fifo->static_buffer_size = VMWGFX_FIFO_STATIC_SIZE;
ff70199
 	fifo->static_buffer = vmalloc(fifo->static_buffer_size);
ff70199
@@ -112,10 +111,6 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
ff70199
 	mutex_init(&fifo->fifo_mutex);
ff70199
 	init_rwsem(&fifo->rwsem);
ff70199
 
ff70199
-	/*
ff70199
-	 * Allow mapping the first page read-only to user-space.
ff70199
-	 */
ff70199
-
ff70199
 	DRM_INFO("width %d\n", vmw_read(dev_priv, SVGA_REG_WIDTH));
ff70199
 	DRM_INFO("height %d\n", vmw_read(dev_priv, SVGA_REG_HEIGHT));
ff70199
 	DRM_INFO("bpp %d\n", vmw_read(dev_priv, SVGA_REG_BITS_PER_PIXEL));
ff70199
@@ -123,7 +118,9 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
ff70199
 	dev_priv->enable_state = vmw_read(dev_priv, SVGA_REG_ENABLE);
ff70199
 	dev_priv->config_done_state = vmw_read(dev_priv, SVGA_REG_CONFIG_DONE);
ff70199
 	dev_priv->traces_state = vmw_read(dev_priv, SVGA_REG_TRACES);
ff70199
-	vmw_write(dev_priv, SVGA_REG_ENABLE, 1);
ff70199
+
ff70199
+	vmw_write(dev_priv, SVGA_REG_ENABLE, SVGA_REG_ENABLE_ENABLE_HIDE);
ff70199
+	vmw_write(dev_priv, SVGA_REG_TRACES, 0);
ff70199
 
ff70199
 	min = 4;
ff70199
 	if (dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO)
ff70199
@@ -155,7 +152,8 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
ff70199
 	atomic_set(&dev_priv->marker_seq, dev_priv->last_read_seqno);
ff70199
 	iowrite32(dev_priv->last_read_seqno, fifo_mem + SVGA_FIFO_FENCE);
ff70199
 	vmw_marker_queue_init(&fifo->marker_queue);
ff70199
-	return vmw_fifo_send_fence(dev_priv, &dummy);
ff70199
+
ff70199
+	return 0;
ff70199
 }
ff70199
 
ff70199
 void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason)
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
ff70199
index 5c289f748ab4..53579f278b63 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
ff70199
@@ -280,6 +280,7 @@ static int vmw_ldu_crtc_set_config(struct drm_mode_set *set)
ff70199
 	}
ff70199
 
ff70199
 	vmw_fb_off(dev_priv);
ff70199
+	vmw_svga_enable(dev_priv);
ff70199
 
ff70199
 	crtc->primary->fb = fb;
ff70199
 	encoder->crtc = crtc;
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
ff70199
index 04a64b8cd3cd..f06d60f41fa7 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
ff70199
@@ -574,7 +574,7 @@ void vmw_mob_unbind(struct vmw_private *dev_priv,
ff70199
 		vmw_fence_single_bo(bo, NULL);
ff70199
 		ttm_bo_unreserve(bo);
ff70199
 	}
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 }
ff70199
 
ff70199
 /*
ff70199
@@ -627,7 +627,7 @@ int vmw_mob_bind(struct vmw_private *dev_priv,
ff70199
 		mob->pt_level += VMW_MOBFMT_PTDEPTH_1 - SVGA3D_MOBFMT_PTDEPTH_1;
ff70199
 	}
ff70199
 
ff70199
-	(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+	vmw_fifo_resource_inc(dev_priv);
ff70199
 
ff70199
 	cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
ff70199
 	if (unlikely(cmd == NULL)) {
ff70199
@@ -648,7 +648,7 @@ int vmw_mob_bind(struct vmw_private *dev_priv,
ff70199
 	return 0;
ff70199
 
ff70199
 out_no_cmd_space:
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 	if (pt_set_up)
ff70199
 		ttm_bo_unref(&mob->pt_bo);
ff70199
 
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
ff70199
index 7dc591d04d9a..9e8eb364a6ac 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
ff70199
@@ -332,6 +332,7 @@ static int vmw_sou_crtc_set_config(struct drm_mode_set *set)
ff70199
 	}
ff70199
 
ff70199
 	vmw_fb_off(dev_priv);
ff70199
+	vmw_svga_enable(dev_priv);
ff70199
 
ff70199
 	if (mode->hdisplay != crtc->mode.hdisplay ||
ff70199
 	    mode->vdisplay != crtc->mode.vdisplay) {
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
ff70199
index 6a4584a43aa6..6110a433ebfe 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
ff70199
@@ -165,7 +165,7 @@ static int vmw_gb_shader_create(struct vmw_resource *res)
ff70199
 	cmd->body.type = shader->type;
ff70199
 	cmd->body.sizeInBytes = shader->size;
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
-	(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+	vmw_fifo_resource_inc(dev_priv);
ff70199
 
ff70199
 	return 0;
ff70199
 
ff70199
@@ -275,7 +275,7 @@ static int vmw_gb_shader_destroy(struct vmw_resource *res)
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
 	mutex_unlock(&dev_priv->binding_mutex);
ff70199
 	vmw_resource_release_id(res);
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 
ff70199
 	return 0;
ff70199
 }
ff70199
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
ff70199
index 4ecdbf3e59da..4d0c98edeb6a 100644
ff70199
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
ff70199
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
ff70199
@@ -340,7 +340,7 @@ static void vmw_hw_surface_destroy(struct vmw_resource *res)
ff70199
 		dev_priv->used_memory_size -= res->backup_size;
ff70199
 		mutex_unlock(&dev_priv->cmdbuf_mutex);
ff70199
 	}
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 }
ff70199
 
ff70199
 /**
ff70199
@@ -576,14 +576,14 @@ static int vmw_surface_init(struct vmw_private *dev_priv,
ff70199
 
ff70199
 	BUG_ON(res_free == NULL);
ff70199
 	if (!dev_priv->has_mob)
ff70199
-		(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+		vmw_fifo_resource_inc(dev_priv);
ff70199
 	ret = vmw_resource_init(dev_priv, res, true, res_free,
ff70199
 				(dev_priv->has_mob) ? &vmw_gb_surface_func :
ff70199
 				&vmw_legacy_surface_func);
ff70199
 
ff70199
 	if (unlikely(ret != 0)) {
ff70199
 		if (!dev_priv->has_mob)
ff70199
-			vmw_3d_resource_dec(dev_priv, false);
ff70199
+			vmw_fifo_resource_dec(dev_priv);
ff70199
 		res_free(res);
ff70199
 		return ret;
ff70199
 	}
ff70199
@@ -1028,7 +1028,7 @@ static int vmw_gb_surface_create(struct vmw_resource *res)
ff70199
 	if (likely(res->id != -1))
ff70199
 		return 0;
ff70199
 
ff70199
-	(void) vmw_3d_resource_inc(dev_priv, false);
ff70199
+	vmw_fifo_resource_inc(dev_priv);
ff70199
 	ret = vmw_resource_alloc_id(res);
ff70199
 	if (unlikely(ret != 0)) {
ff70199
 		DRM_ERROR("Failed to allocate a surface id.\n");
ff70199
@@ -1068,7 +1068,7 @@ static int vmw_gb_surface_create(struct vmw_resource *res)
ff70199
 out_no_fifo:
ff70199
 	vmw_resource_release_id(res);
ff70199
 out_no_id:
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 	return ret;
ff70199
 }
ff70199
 
ff70199
@@ -1213,7 +1213,7 @@ static int vmw_gb_surface_destroy(struct vmw_resource *res)
ff70199
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
ff70199
 	mutex_unlock(&dev_priv->binding_mutex);
ff70199
 	vmw_resource_release_id(res);
ff70199
-	vmw_3d_resource_dec(dev_priv, false);
ff70199
+	vmw_fifo_resource_dec(dev_priv);
ff70199
 
ff70199
 	return 0;
ff70199
 }
ff70199
-- 
ff70199
2.4.3
ff70199