aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-09-21 09:51:06 -0400
committerJani Nikula <jani.nikula@intel.com>2016-10-10 09:06:35 -0400
commitac75694125f12f3ce92c30584b49533ed710da8e (patch)
treef4567b4018c86685b1f4652016bc334debe6c1b9
parent11dec6a2940c8c8b0791aecdab87f9c9b1371d11 (diff)
drm/i915: Restore current RPS state after reset
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>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c9
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c7
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c6
3 files changed, 13 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 7f4e8adec8a8..8ae5853ea3c6 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1786,15 +1786,6 @@ void i915_reset(struct drm_i915_private *dev_priv)
1786 goto error; 1786 goto error;
1787 } 1787 }
1788 1788
1789 /*
1790 * rps/rc6 re-init is necessary to restore state lost after the
1791 * reset and the re-install of gt irqs. Skip for ironlake per
1792 * previous concerns that it doesn't respond well to some forms
1793 * of re-init after reset.
1794 */
1795 intel_sanitize_gt_powersave(dev_priv);
1796 intel_autoenable_gt_powersave(dev_priv);
1797
1798wakeup: 1789wakeup:
1799 wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS); 1790 wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS);
1800 return; 1791 return;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 2c8106758922..eb1ca8886bb9 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2631,6 +2631,13 @@ void i915_gem_reset(struct drm_i915_private *dev_priv)
2631 mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0); 2631 mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
2632 2632
2633 i915_gem_restore_fences(&dev_priv->drm); 2633 i915_gem_restore_fences(&dev_priv->drm);
2634
2635 if (dev_priv->gt.awake) {
2636 intel_sanitize_gt_powersave(dev_priv);
2637 intel_enable_gt_powersave(dev_priv);
2638 if (INTEL_GEN(dev_priv) >= 6)
2639 gen6_rps_busy(dev_priv);
2640 }
2634} 2641}
2635 2642
2636static void nop_submit_request(struct drm_i915_gem_request *request) 2643static void nop_submit_request(struct drm_i915_gem_request *request)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index c128fdbd24e4..13fae1c9dcc8 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -350,6 +350,9 @@ void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)
350 350
351void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv) 351void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv)
352{ 352{
353 if (READ_ONCE(dev_priv->rps.interrupts_enabled))
354 return;
355
353 spin_lock_irq(&dev_priv->irq_lock); 356 spin_lock_irq(&dev_priv->irq_lock);
354 WARN_ON_ONCE(dev_priv->rps.pm_iir); 357 WARN_ON_ONCE(dev_priv->rps.pm_iir);
355 WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); 358 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)
368 371
369void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv) 372void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
370{ 373{
374 if (!READ_ONCE(dev_priv->rps.interrupts_enabled))
375 return;
376
371 spin_lock_irq(&dev_priv->irq_lock); 377 spin_lock_irq(&dev_priv->irq_lock);
372 dev_priv->rps.interrupts_enabled = false; 378 dev_priv->rps.interrupts_enabled = false;
373 379