From 9520beedf76d86319dbe4fe0f58d3bbb5bc36462 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 6 Feb 2014 09:38:11 +0000 Subject: [PATCH] drm/i915: Frob FORCEWAKE around RCS flips When in doubt, tell the GPU not to go to sleep. References: https://bugs.freedesktop.org/show_bug.cgi?id=74053 --- drivers/gpu/drm/i915/i915_reg.h | 1 + drivers/gpu/drm/i915/intel_display.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 19cef5616c9d..bca0a596dccc 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -4863,6 +4863,7 @@ #define FORCEWAKE_MT 0xa188 /* multi-threaded */ #define FORCEWAKE_KERNEL 0x1 #define FORCEWAKE_USER 0x2 +#define FORCEWAKE_RING 0x4 #define FORCEWAKE_MT_ACK 0x130040 #define ECOBUS 0xa180 #define FORCEWAKE_MT_ENABLE (1<<5) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 5b7ce3f09681..ad18f0f60023 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -8593,7 +8593,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev, len = 4; if (ring->id == RCS) - len += 6; + len += 12; ret = intel_ring_begin(ring, len); if (ret) @@ -8610,6 +8610,9 @@ static int intel_gen7_queue_flip(struct drm_device *dev, */ if (ring->id == RCS) { intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(ring, FORCEWAKE_MT); + intel_ring_emit(ring, _MASKED_BIT_ENABLE(FORCEWAKE_RING)); + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); intel_ring_emit(ring, DERRMR); intel_ring_emit(ring, ~(DERRMR_PIPEA_PRI_FLIP_DONE | DERRMR_PIPEB_PRI_FLIP_DONE | @@ -8623,6 +8626,13 @@ static int intel_gen7_queue_flip(struct drm_device *dev, intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit); intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); intel_ring_emit(ring, i915_gem_obj_ggtt_offset(obj) + intel_crtc->dspaddr_offset); + + if (ring->id == RCS) { + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(ring, FORCEWAKE_MT); + intel_ring_emit(ring, _MASKED_BIT_DISABLE(FORCEWAKE_RING)); + } + intel_ring_emit(ring, (MI_NOOP)); intel_mark_page_flip_active(intel_crtc); -- 1.9.rc1