[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