struct intel_uncore_forcewake_domain *fw_domain;
        unsigned int tmp;
 
+       seq_printf(m, "user.bypass_count = %u\n",
+                  i915->uncore.user_forcewake.count);
+
        for_each_fw_domain(fw_domain, i915, tmp)
                seq_printf(m, "%s.wake_count = %u\n",
                           intel_uncore_forcewake_domain_to_str(fw_domain->id),
 
 static int i915_forcewake_open(struct inode *inode, struct file *file)
 {
-       struct drm_i915_private *dev_priv = inode->i_private;
+       struct drm_i915_private *i915 = inode->i_private;
 
-       if (INTEL_GEN(dev_priv) < 6)
+       if (INTEL_GEN(i915) < 6)
                return 0;
 
-       intel_runtime_pm_get(dev_priv);
-       intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
+       intel_runtime_pm_get(i915);
+       intel_uncore_forcewake_user_get(i915);
 
        return 0;
 }
 
 static int i915_forcewake_release(struct inode *inode, struct file *file)
 {
-       struct drm_i915_private *dev_priv = inode->i_private;
+       struct drm_i915_private *i915 = inode->i_private;
 
-       if (INTEL_GEN(dev_priv) < 6)
+       if (INTEL_GEN(i915) < 6)
                return 0;
 
-       intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
-       intel_runtime_pm_put(dev_priv);
+       intel_uncore_forcewake_user_put(i915);
+       intel_runtime_pm_put(i915);
 
        return 0;
 }
 
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
+/**
+ * intel_uncore_forcewake_user_get - claim forcewake on behalf of userspace
+ * @dev_priv: i915 device instance
+ *
+ * This function is a wrapper around intel_uncore_forcewake_get() to acquire
+ * the GT powerwell and in the process disable our debugging for the
+ * duration of userspace's bypass.
+ */
+void intel_uncore_forcewake_user_get(struct drm_i915_private *dev_priv)
+{
+       spin_lock_irq(&dev_priv->uncore.lock);
+       if (!dev_priv->uncore.user_forcewake.count++) {
+               intel_uncore_forcewake_get__locked(dev_priv, FORCEWAKE_ALL);
+
+               /* Save and disable mmio debugging for the user bypass */
+               dev_priv->uncore.user_forcewake.saved_mmio_check =
+                       dev_priv->uncore.unclaimed_mmio_check;
+               dev_priv->uncore.user_forcewake.saved_mmio_debug =
+                       i915.mmio_debug;
+
+               dev_priv->uncore.unclaimed_mmio_check = 0;
+               i915.mmio_debug = 0;
+       }
+       spin_unlock_irq(&dev_priv->uncore.lock);
+}
+
+/**
+ * intel_uncore_forcewake_user_put - release forcewake on behalf of userspace
+ * @dev_priv: i915 device instance
+ *
+ * This function complements intel_uncore_forcewake_user_get() and releases
+ * the GT powerwell taken on behalf of the userspace bypass.
+ */
+void intel_uncore_forcewake_user_put(struct drm_i915_private *dev_priv)
+{
+       spin_lock_irq(&dev_priv->uncore.lock);
+       if (!--dev_priv->uncore.user_forcewake.count) {
+               if (intel_uncore_unclaimed_mmio(dev_priv))
+                       dev_info(dev_priv->drm.dev,
+                                "Invalid mmio detected during user access\n");
+
+               dev_priv->uncore.unclaimed_mmio_check =
+                       dev_priv->uncore.user_forcewake.saved_mmio_check;
+               i915.mmio_debug =
+                       dev_priv->uncore.user_forcewake.saved_mmio_debug;
+
+               intel_uncore_forcewake_put__locked(dev_priv, FORCEWAKE_ALL);
+       }
+       spin_unlock_irq(&dev_priv->uncore.lock);
+}
+
 /**
  * intel_uncore_forcewake_get__locked - grab forcewake domain references
  * @dev_priv: i915 device instance
 
                i915_reg_t reg_ack;
        } fw_domain[FW_DOMAIN_ID_COUNT];
 
+       struct {
+               unsigned int count;
+
+               int saved_mmio_check;
+               int saved_mmio_debug;
+       } user_forcewake;
+
        int unclaimed_mmio_check;
 };
 
 void intel_uncore_forcewake_put__locked(struct drm_i915_private *dev_priv,
                                        enum forcewake_domains domains);
 
+void intel_uncore_forcewake_user_get(struct drm_i915_private *dev_priv);
+void intel_uncore_forcewake_user_put(struct drm_i915_private *dev_priv);
+
 int intel_wait_for_register(struct drm_i915_private *dev_priv,
                            i915_reg_t reg,
                            u32 mask,