drm/i915: Restore current RPS state after reset
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 21 Sep 2016 13:51:06 +0000 (14:51 +0100)
committerJani Nikula <jani.nikula@intel.com>
Mon, 10 Oct 2016 13:06:35 +0000 (16:06 +0300)
Following commit 821ed7df6e2a ("drm/i915: Update reset path to fix
incomplete requests") we no longer mark the context as lost on reset as
we keep the requests (and contexts) alive. However, RPS remains reset
and we need to restore the current state to match the in-flight
requests.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97824
Fixes: 821ed7df6e2a ("drm/i915: Update reset path to fix incomplete requests")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Arun Siluvery <arun.siluvery@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160921135108.29574-1-chris@chris-wilson.co.uk
(cherry picked from commit f2a91d1a6f5960c08f1ca60bd076f4dc020c50c6)
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_irq.c

index 7f4e8adec8a81bd5c21f5ac491090ab899abadb3..8ae5853ea3c6f9f9f01923c577b4fa170b0cb91f 100644 (file)
@@ -1786,15 +1786,6 @@ void i915_reset(struct drm_i915_private *dev_priv)
                goto error;
        }
 
-       /*
-        * rps/rc6 re-init is necessary to restore state lost after the
-        * reset and the re-install of gt irqs. Skip for ironlake per
-        * previous concerns that it doesn't respond well to some forms
-        * of re-init after reset.
-        */
-       intel_sanitize_gt_powersave(dev_priv);
-       intel_autoenable_gt_powersave(dev_priv);
-
 wakeup:
        wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS);
        return;
index 2c81067589225a89762a4129fac7eeee0abebed9..eb1ca8886bb9646209b317bde92ba74e397202bf 100644 (file)
@@ -2631,6 +2631,13 @@ void i915_gem_reset(struct drm_i915_private *dev_priv)
        mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
 
        i915_gem_restore_fences(&dev_priv->drm);
+
+       if (dev_priv->gt.awake) {
+               intel_sanitize_gt_powersave(dev_priv);
+               intel_enable_gt_powersave(dev_priv);
+               if (INTEL_GEN(dev_priv) >= 6)
+                       gen6_rps_busy(dev_priv);
+       }
 }
 
 static void nop_submit_request(struct drm_i915_gem_request *request)
index c128fdbd24e4f045d6d11c6bfe7e7799f1dc9136..13fae1c9dcc8d253563a4512f8b5a8291db89002 100644 (file)
@@ -350,6 +350,9 @@ void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)
 
 void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv)
 {
+       if (READ_ONCE(dev_priv->rps.interrupts_enabled))
+               return;
+
        spin_lock_irq(&dev_priv->irq_lock);
        WARN_ON_ONCE(dev_priv->rps.pm_iir);
        WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events);
@@ -368,6 +371,9 @@ u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask)
 
 void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
 {
+       if (!READ_ONCE(dev_priv->rps.interrupts_enabled))
+               return;
+
        spin_lock_irq(&dev_priv->irq_lock);
        dev_priv->rps.interrupts_enabled = false;