If the user bypasses i915 and accesses mmio directly, that easily
confuses our automatic mmio debugging (any error we then detect is
likely to be as a result of the user). Since we expect userspace to open
debugfs/i915_forcewake_user if i915.ko is loaded and they want mmio
access, that makes the opportune time to disable our debugging for
duration of the bypass.

References: https://bugs.freedesktop.org/show_bug.cgi?id=102543
Signed-off-by: Chris Wilson <[email protected]>
Cc: Mika Kuoppala <[email protected]>
---
 drivers/gpu/drm/i915/i915_debugfs.c | 32 ++++++++++++++++++++++++++++++--
 drivers/gpu/drm/i915/intel_uncore.h |  7 +++++++
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 48572b157222..d63b3c5c2f83 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -4679,7 +4679,21 @@ static int i915_forcewake_open(struct inode *inode, 
struct file *file)
                return 0;
 
        intel_runtime_pm_get(dev_priv);
-       intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
+
+       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);
 
        return 0;
 }
@@ -4691,7 +4705,21 @@ static int i915_forcewake_release(struct inode *inode, 
struct file *file)
        if (INTEL_GEN(dev_priv) < 6)
                return 0;
 
-       intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+       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,
+                                "Unclaimed mmio occurred during user acess\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_runtime_pm_put(dev_priv);
 
        return 0;
diff --git a/drivers/gpu/drm/i915/intel_uncore.h 
b/drivers/gpu/drm/i915/intel_uncore.h
index 5f90278da461..1acf24c6e9ce 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -102,6 +102,13 @@ struct intel_uncore {
                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;
 };
 
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to