diff mbox

[4/4] drm/i915: Check unclaimed access per forcewake domain get/put

Message ID 1449673301-6449-4-git-send-email-mika.kuoppala@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mika Kuoppala Dec. 9, 2015, 3:01 p.m. UTC
We do unclaimed register access check in non mmio_debug mode
once per write. This adds probability of finding the exact
sequence where we did the bad access, but also adds burden
to each write.

As we have mmio_debug available for more fine grained analysis,
give up some accuracy for the benefit of performance in normal case.
Do this by doing the unclaimed reg check only once when forcewake
domains are get.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Paulo Zanoni <przanoni@gmail.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/intel_uncore.c | 39 ++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

Comments

Chris Wilson Dec. 9, 2015, 3:48 p.m. UTC | #1
On Wed, Dec 09, 2015 at 05:01:41PM +0200, Mika Kuoppala wrote:
> We do unclaimed register access check in non mmio_debug mode
> once per write. This adds probability of finding the exact
> sequence where we did the bad access, but also adds burden
> to each write.
> 
> As we have mmio_debug available for more fine grained analysis,
> give up some accuracy for the benefit of performance in normal case.
> Do this by doing the unclaimed reg check only once when forcewake
> domains are get.

Still far too often in the normal case.
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 96b04c7..30e5e08 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -351,6 +351,22 @@  unclaimed_reg_access(struct drm_i915_private *dev_priv)
 	return true;
 }
 
+static void
+unclaimed_access_detect_oneshot(struct drm_i915_private *dev_priv)
+{
+	static bool mmio_debug_once = true;
+
+	if (i915.mmio_debug || !mmio_debug_once)
+		return;
+
+	if (unclaimed_reg_access(dev_priv)) {
+		DRM_DEBUG("Unclaimed register detected, "
+			  "enabling oneshot unclaimed register reporting. "
+			  "Please use i915.mmio_debug=N for more information.\n");
+		i915.mmio_debug = mmio_debug_once--;
+	}
+}
+
 static void __intel_uncore_early_sanitize(struct drm_device *dev,
 					  bool restore_forcewake)
 {
@@ -403,8 +419,10 @@  static void __intel_uncore_forcewake_get(struct drm_i915_private *dev_priv,
 			fw_domains &= ~(1 << id);
 	}
 
-	if (fw_domains)
+	if (fw_domains) {
 		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
+		unclaimed_access_detect_oneshot(dev_priv);
+	}
 }
 
 /**
@@ -625,22 +643,6 @@  hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv,
 	}
 }
 
-static void
-hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
-{
-	static bool mmio_debug_once = true;
-
-	if (i915.mmio_debug || !mmio_debug_once)
-		return;
-
-	if (unclaimed_reg_access(dev_priv)) {
-		DRM_DEBUG("Unclaimed register detected, "
-			  "enabling oneshot unclaimed register reporting. "
-			  "Please use i915.mmio_debug=N for more information.\n");
-		i915.mmio_debug = mmio_debug_once--;
-	}
-}
-
 #define GEN2_READ_HEADER(x) \
 	u##x val = 0; \
 	assert_device_not_suspended(dev_priv);
@@ -920,7 +922,6 @@  hsw_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool t
 		gen6_gt_check_fifodbg(dev_priv); \
 	} \
 	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-	hsw_unclaimed_reg_detect(dev_priv); \
 	GEN6_WRITE_FOOTER; \
 }
 
@@ -955,7 +956,6 @@  gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool
 		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
 	__raw_i915_write##x(dev_priv, reg, val); \
 	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-	hsw_unclaimed_reg_detect(dev_priv); \
 	GEN6_WRITE_FOOTER; \
 }
 
@@ -1025,7 +1025,6 @@  gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
 		__force_wake_get(dev_priv, fw_engine); \
 	__raw_i915_write##x(dev_priv, reg, val); \
 	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-	hsw_unclaimed_reg_detect(dev_priv); \
 	GEN6_WRITE_FOOTER; \
 }