[PATCH 1/2] drm/i915/selftest: add test to verify get/put fw domains

Daniele Ceraolo Spurio daniele.ceraolospurio at intel.com
Tue Mar 19 01:21:37 UTC 2019


Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
---
 drivers/gpu/drm/i915/selftests/intel_uncore.c | 57 +++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/i915/selftests/intel_uncore.c b/drivers/gpu/drm/i915/selftests/intel_uncore.c
index 81d9d31042a9..fb7a43e64f75 100644
--- a/drivers/gpu/drm/i915/selftests/intel_uncore.c
+++ b/drivers/gpu/drm/i915/selftests/intel_uncore.c
@@ -119,6 +119,58 @@ int intel_uncore_mock_selftests(void)
 	return 0;
 }
 
+static int intel_uncore_check_forcewake_ops(struct drm_i915_private *dev_priv)
+{
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+	intel_wakeref_t wakeref;
+	int err = 0;
+
+	if (!dev_priv->gt_pm.rc6.enabled)
+		return 0;
+
+	wakeref = intel_runtime_pm_get(dev_priv);
+
+	for_each_engine(engine, dev_priv, id) {
+		/* we've submitted work, so RING_START should be != 0 */
+		i915_reg_t reg = RING_START(engine->mmio_base);
+		enum forcewake_domains fw_domains;
+		u32 val;
+
+		fw_domains = intel_uncore_forcewake_for_reg(dev_priv, reg,
+							    FW_REG_READ);
+
+		if (!fw_domains)
+			continue;
+
+		intel_uncore_forcewake_get(dev_priv, fw_domains);
+		val = I915_READ_FW(reg);
+		intel_uncore_forcewake_put(dev_priv, fw_domains);
+
+		if (!val) {
+			pr_err("reg 0x%x was zero while fw was held!\n",
+				i915_mmio_reg_offset(reg));
+			err = -EINVAL;
+			goto out_rpm;
+		}
+
+		/* wait for FW to be released */
+		usleep_range(2000, 3000);
+
+		if (_wait_for(I915_READ_FW(reg) == 0, 10000, 100, 1000)) {
+			pr_err("fw_domains 0x%x still up after 10ms!\n",
+				fw_domains);
+			err = -ETIMEDOUT;
+			goto out_rpm;
+		}
+	}
+
+out_rpm:
+	intel_runtime_pm_put(dev_priv, wakeref);
+	return err;
+}
+
+
 static int intel_uncore_check_forcewake_domains(struct drm_i915_private *dev_priv)
 {
 #define FW_RANGE 0x40000
@@ -188,6 +240,11 @@ int intel_uncore_live_selftests(struct drm_i915_private *i915)
 	if (err)
 		return err;
 
+	/* check we can acquire and release forcewake correcly for all engines */
+	err = intel_uncore_check_forcewake_ops(i915);
+	if (err)
+		return err;
+
 	err = intel_uncore_check_forcewake_domains(i915);
 	if (err)
 		return err;
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list