diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-11-16 10:00:09 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-11-17 14:39:51 -0500 |
commit | ef46e0d247da0a7a408573aa15870e231bbd4af2 (patch) | |
tree | 68e106d24f35f527260420bad57cc623dd28573b /drivers/gpu | |
parent | 29c78f609e661e663a239a37923adb1d61f6386c (diff) |
drm/i915: restore the early forcewake cleanup
Some BIOS just leak the forcewak bits, which we clean up.
Unfortunately this has been broken in
commit 521198a2e7095c8c7daa8d7d3a76a110c346be6f
Author: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Date: Fri Aug 23 16:52:30 2013 +0300
drm/i915: sanitize forcewake registers on reset
To make this work both for resets and for BIOS takeover just add the
forcewake clearing call back to intel_uncore_early_sanitize.
We need to clear the forcewake in early sanitize so that the forcewak
dance in intel_uncore_init (to figure out whether we have mt or legacy
forcewake on ivb) works. That cleanup fits in nicely with the general
topic of early_sanitize to prepare for the very first mmio ops.
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reported-by: Jörg Otte <jrg.otte@gmail.com>
Cc: Jörg Otte <jrg.otte@gmail.com>
References: https://lkml.org/lkml/2013/11/16/40
Cc: stable@vger.kernel.org (for 3.12 only)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index f9883ceff946..0b02078a0b84 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c | |||
@@ -217,6 +217,19 @@ static void gen6_force_wake_work(struct work_struct *work) | |||
217 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); | 217 | spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); |
218 | } | 218 | } |
219 | 219 | ||
220 | static void intel_uncore_forcewake_reset(struct drm_device *dev) | ||
221 | { | ||
222 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
223 | |||
224 | if (IS_VALLEYVIEW(dev)) { | ||
225 | vlv_force_wake_reset(dev_priv); | ||
226 | } else if (INTEL_INFO(dev)->gen >= 6) { | ||
227 | __gen6_gt_force_wake_reset(dev_priv); | ||
228 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | ||
229 | __gen6_gt_force_wake_mt_reset(dev_priv); | ||
230 | } | ||
231 | } | ||
232 | |||
220 | void intel_uncore_early_sanitize(struct drm_device *dev) | 233 | void intel_uncore_early_sanitize(struct drm_device *dev) |
221 | { | 234 | { |
222 | struct drm_i915_private *dev_priv = dev->dev_private; | 235 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -234,19 +247,8 @@ void intel_uncore_early_sanitize(struct drm_device *dev) | |||
234 | dev_priv->ellc_size = 128; | 247 | dev_priv->ellc_size = 128; |
235 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); | 248 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); |
236 | } | 249 | } |
237 | } | ||
238 | 250 | ||
239 | static void intel_uncore_forcewake_reset(struct drm_device *dev) | 251 | intel_uncore_forcewake_reset(dev); |
240 | { | ||
241 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
242 | |||
243 | if (IS_VALLEYVIEW(dev)) { | ||
244 | vlv_force_wake_reset(dev_priv); | ||
245 | } else if (INTEL_INFO(dev)->gen >= 6) { | ||
246 | __gen6_gt_force_wake_reset(dev_priv); | ||
247 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | ||
248 | __gen6_gt_force_wake_mt_reset(dev_priv); | ||
249 | } | ||
250 | } | 252 | } |
251 | 253 | ||
252 | void intel_uncore_sanitize(struct drm_device *dev) | 254 | void intel_uncore_sanitize(struct drm_device *dev) |