提交 3123fcaf 编写于 作者: D Daniel Vetter

drm/i915: catch forcewake reference underruns

Without this the new drv_suspend/forcewake subtest I've created
doesn't result in immediately visible failures.

Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 ae89f44d
...@@ -280,12 +280,17 @@ void vlv_force_wake_put(struct drm_i915_private *dev_priv, ...@@ -280,12 +280,17 @@ void vlv_force_wake_put(struct drm_i915_private *dev_priv,
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
if (fw_engine & FORCEWAKE_RENDER && if (fw_engine & FORCEWAKE_RENDER) {
--dev_priv->uncore.fw_rendercount != 0) WARN_ON(!dev_priv->uncore.fw_rendercount);
fw_engine &= ~FORCEWAKE_RENDER; if (--dev_priv->uncore.fw_rendercount != 0)
if (fw_engine & FORCEWAKE_MEDIA && fw_engine &= ~FORCEWAKE_RENDER;
--dev_priv->uncore.fw_mediacount != 0) }
fw_engine &= ~FORCEWAKE_MEDIA;
if (fw_engine & FORCEWAKE_MEDIA) {
WARN_ON(!dev_priv->uncore.fw_mediacount);
if (--dev_priv->uncore.fw_mediacount != 0)
fw_engine &= ~FORCEWAKE_MEDIA;
}
if (fw_engine) if (fw_engine)
dev_priv->uncore.funcs.force_wake_put(dev_priv, fw_engine); dev_priv->uncore.funcs.force_wake_put(dev_priv, fw_engine);
...@@ -301,6 +306,8 @@ static void gen6_force_wake_timer(unsigned long arg) ...@@ -301,6 +306,8 @@ static void gen6_force_wake_timer(unsigned long arg)
assert_device_not_suspended(dev_priv); assert_device_not_suspended(dev_priv);
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
WARN_ON(!dev_priv->uncore.forcewake_count);
if (--dev_priv->uncore.forcewake_count == 0) if (--dev_priv->uncore.forcewake_count == 0)
dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL); dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL);
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
...@@ -452,6 +459,8 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine) ...@@ -452,6 +459,8 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
WARN_ON(!dev_priv->uncore.forcewake_count);
if (--dev_priv->uncore.forcewake_count == 0) { if (--dev_priv->uncore.forcewake_count == 0) {
dev_priv->uncore.forcewake_count++; dev_priv->uncore.forcewake_count++;
delayed = true; delayed = true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册