diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2011-03-19 21:14:28 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-05-10 16:56:41 -0400 |
commit | 4a246cfc3c337ecb800d508ee5ed906534edb25c (patch) | |
tree | 3430259d8dc22c6b80904d98dbdba39d23e6a831 | |
parent | 96f298aa9c9fc9b7c8a2ebaf8c195d178f570e09 (diff) |
drm/i915: fix rc6 initialization on Ironlake
There is a race condition between setting PWRCTXA and executing
MI_SET_CONTEXT. PWRCTXA must not be set until a valid context has been
written (or else the GPU could possible go into rc6, and return to an
invalid context).
Reported-and-Tested-by: Gu Rui <chaos.proton@gmail.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=28582
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index b6f593a6d970..463f75330282 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7325,6 +7325,19 @@ void ironlake_enable_rc6(struct drm_device *dev) | |||
7325 | OUT_RING(MI_FLUSH); | 7325 | OUT_RING(MI_FLUSH); |
7326 | ADVANCE_LP_RING(); | 7326 | ADVANCE_LP_RING(); |
7327 | 7327 | ||
7328 | /* | ||
7329 | * Wait for the command parser to advance past MI_SET_CONTEXT. The HW | ||
7330 | * does an implicit flush, combined with MI_FLUSH above, it should be | ||
7331 | * safe to assume that renderctx is valid | ||
7332 | */ | ||
7333 | ret = intel_wait_ring_idle(LP_RING(dev_priv)); | ||
7334 | if (ret) { | ||
7335 | DRM_ERROR("failed to enable ironlake power power savings\n"); | ||
7336 | ironlake_teardown_rc6(dev); | ||
7337 | mutex_unlock(&dev->struct_mutex); | ||
7338 | return; | ||
7339 | } | ||
7340 | |||
7328 | I915_WRITE(PWRCTXA, dev_priv->pwrctx->gtt_offset | PWRCTX_EN); | 7341 | I915_WRITE(PWRCTXA, dev_priv->pwrctx->gtt_offset | PWRCTX_EN); |
7329 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); | 7342 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); |
7330 | mutex_unlock(&dev->struct_mutex); | 7343 | mutex_unlock(&dev->struct_mutex); |