aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-07-21 07:16:24 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-04 04:51:12 -0400
commit9682e399d77f9bc0a5c9230bd1d69a3e75572ef1 (patch)
treee133bc19027590ab734a279e741c0acd37e17c25
parent8bc91b60f77d174f2485e10be8708c2fd7b85bfb (diff)
drm/i915: fix up gt init sequence fallout
commit 181d1b9e31c668259d3798c521672afb8edd355c upstream. The regression fix for gen6+ rps fallout commit 7dcd2677ea912573d9ed4bcd629b0023b2d11505 Author: Konstantin Khlebnikov <khlebnikov@openvz.org> Date: Wed Jul 17 10:22:58 2013 +0400 drm/i915: fix long-standing SNB regression in power consumption after resume unintentionally also changed the init sequence ordering between gt_init and gt_reset - we need to reset BIOS damage like leftover forcewake references before we run our own code. Otherwise we can get nasty dmesg noise like [drm:__gen6_gt_force_wake_mt_get] *ERROR* Timed out waiting for forcewake old ack to clear. again. Since _reset suggests that we first need to have stuff initialized (which isn't the case here) call it sanitze instead. While at it also block out the rps disable introduced by the above commit on ilk: We don't have any knowledge of ilk rps being broken in similar ways. And the disable functions uses the default hw state which is only read out when we're enabling rps. So essentially we've been writing random grabage into that register. Reported-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Konstantin Khlebnikov <khlebnikov@openvz.org> Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Tested-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c5
4 files changed, 7 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index d1ee611d213d..4d61e09bc212 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1608,8 +1608,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1608 intel_detect_pch(dev); 1608 intel_detect_pch(dev);
1609 1609
1610 intel_irq_init(dev); 1610 intel_irq_init(dev);
1611 intel_gt_sanitize(dev);
1611 intel_gt_init(dev); 1612 intel_gt_init(dev);
1612 intel_gt_reset(dev);
1613 1613
1614 /* Try to make sure MCHBAR is enabled before poking at it */ 1614 /* Try to make sure MCHBAR is enabled before poking at it */
1615 intel_setup_mchbar(dev); 1615 intel_setup_mchbar(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 523a633b86f3..bc6cd3117ac3 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -685,7 +685,7 @@ static int i915_drm_thaw(struct drm_device *dev)
685{ 685{
686 int error = 0; 686 int error = 0;
687 687
688 intel_gt_reset(dev); 688 intel_gt_sanitize(dev);
689 689
690 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 690 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
691 mutex_lock(&dev->struct_mutex); 691 mutex_lock(&dev->struct_mutex);
@@ -711,7 +711,7 @@ int i915_resume(struct drm_device *dev)
711 711
712 pci_set_master(dev->pdev); 712 pci_set_master(dev->pdev);
713 713
714 intel_gt_reset(dev); 714 intel_gt_sanitize(dev);
715 715
716 /* 716 /*
717 * Platforms with opregion should have sane BIOS, older ones (gen3 and 717 * Platforms with opregion should have sane BIOS, older ones (gen3 and
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d69f21cf1851..c76244159a1f 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1477,7 +1477,7 @@ void i915_handle_error(struct drm_device *dev, bool wedged);
1477extern void intel_irq_init(struct drm_device *dev); 1477extern void intel_irq_init(struct drm_device *dev);
1478extern void intel_hpd_init(struct drm_device *dev); 1478extern void intel_hpd_init(struct drm_device *dev);
1479extern void intel_gt_init(struct drm_device *dev); 1479extern void intel_gt_init(struct drm_device *dev);
1480extern void intel_gt_reset(struct drm_device *dev); 1480extern void intel_gt_sanitize(struct drm_device *dev);
1481 1481
1482void i915_error_state_free(struct kref *error_ref); 1482void i915_error_state_free(struct kref *error_ref);
1483 1483
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 60d57affc748..81a9e1d7647f 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4486,7 +4486,7 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv)
4486 gen6_gt_check_fifodbg(dev_priv); 4486 gen6_gt_check_fifodbg(dev_priv);
4487} 4487}
4488 4488
4489void intel_gt_reset(struct drm_device *dev) 4489void intel_gt_sanitize(struct drm_device *dev)
4490{ 4490{
4491 struct drm_i915_private *dev_priv = dev->dev_private; 4491 struct drm_i915_private *dev_priv = dev->dev_private;
4492 4492
@@ -4499,7 +4499,8 @@ void intel_gt_reset(struct drm_device *dev)
4499 } 4499 }
4500 4500
4501 /* BIOS often leaves RC6 enabled, but disable it for hw init */ 4501 /* BIOS often leaves RC6 enabled, but disable it for hw init */
4502 intel_disable_gt_powersave(dev); 4502 if (INTEL_INFO(dev)->gen >= 6)
4503 intel_disable_gt_powersave(dev);
4503} 4504}
4504 4505
4505void intel_gt_init(struct drm_device *dev) 4506void intel_gt_init(struct drm_device *dev)