2014-12-08 16:27 GMT-02:00 Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>: > From: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > > Calling intel_runtime_pm_put() is illegal from a soft-irq context, so > revert the crude hack > > commit aa0b3b5bb8768c1a6a6788869d9c7015eae7e80c > Author: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx> > Date: Tue Apr 1 14:55:07 2014 -0300 > > drm/i915: don't schedule force_wake_timer at gen6_read > > and apply the single line corrective instead. > > References: https://bugs.freedesktop.org/show_bug.cgi?id=80913 > Cc: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx> > Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> This patch adds tons and tons of new WARNs when running igt/tests/pm_rpm on BDW, including: WARNING: CPU: 1 PID: 228 at drivers/gpu/drm/i915/intel_uncore.c:623 assert_force_wake_inactive+0x36/0x40 [i915]() WARN_ON(dev_priv->uncore.forcewake_count > 0) > --- > drivers/gpu/drm/i915/i915_drv.c | 1 + > drivers/gpu/drm/i915/intel_uncore.c | 18 ++++++------------ > 2 files changed, 7 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c > index 71be3c9..706b122 100644 > --- a/drivers/gpu/drm/i915/i915_drv.c > +++ b/drivers/gpu/drm/i915/i915_drv.c > @@ -1402,6 +1402,7 @@ static int intel_runtime_suspend(struct device *device) > } > > del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); > + intel_uncore_forcewake_reset(dev, false); > dev_priv->pm.suspended = true; > > /* > diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c > index 46de8d7..38ac389 100644 > --- a/drivers/gpu/drm/i915/intel_uncore.c > +++ b/drivers/gpu/drm/i915/intel_uncore.c > @@ -449,8 +449,6 @@ static void gen6_force_wake_timer(unsigned long arg) > if (--dev_priv->uncore.forcewake_count == 0) > dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL); > spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); > - > - intel_runtime_pm_put(dev_priv); > } > > void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore) > @@ -586,7 +584,6 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine) > void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine) > { > unsigned long irqflags; > - bool delayed = false; > > if (!dev_priv->uncore.funcs.force_wake_put) > return; > @@ -603,21 +600,19 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine) > goto out; > } > > - > spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); > WARN_ON(!dev_priv->uncore.forcewake_count); > > if (--dev_priv->uncore.forcewake_count == 0) { > dev_priv->uncore.forcewake_count++; > - delayed = true; > mod_timer_pinned(&dev_priv->uncore.force_wake_timer, > jiffies + 1); > } > + > spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); > > out: > - if (!delayed) > - intel_runtime_pm_put(dev_priv); > + intel_runtime_pm_put(dev_priv); > } > > void assert_force_wake_inactive(struct drm_i915_private *dev_priv) > @@ -777,12 +772,11 @@ gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ > NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ > dev_priv->uncore.funcs.force_wake_get(dev_priv, \ > FORCEWAKE_ALL); \ > - val = __raw_i915_read##x(dev_priv, reg); \ > - dev_priv->uncore.funcs.force_wake_put(dev_priv, \ > - FORCEWAKE_ALL); \ > - } else { \ > - val = __raw_i915_read##x(dev_priv, reg); \ > + dev_priv->uncore.forcewake_count++; \ > + mod_timer_pinned(&dev_priv->uncore.force_wake_timer, \ > + jiffies + 1); \ > } \ > + val = __raw_i915_read##x(dev_priv, reg); \ > hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ > REG_READ_FOOTER; \ > } > -- > 1.9.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Paulo Zanoni _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx