When not blitting to scanout, we can save some power by not tracking blits, and more importantly, unnecessarily invalidating lines which we don't care a bout. These instructions are explicitly spelled out in the spec, but it is how I expect it to work. Unfortunately, I do not have power data for this. Cc: Stéphane Marchesin <marcheu@xxxxxxxxxxxx> Signed-off-by: Ben Widawsky <ben@xxxxxxxxxxxx> --- drivers/gpu/drm/i915/intel_ringbuffer.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index ddd7681..56be8cb 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -296,7 +296,8 @@ static int gen6_ring_fbc_flush(struct intel_ring_buffer *ring) _MASKED_BIT_ENABLE(GEN6_BLITTER_FBC_NOTIFY)); intel_ring_advance(ring); - ring->fbc_dirty = false; + /* We'll mark the fbc clean only after the operation has completed so we + * can track when to disable the bit above */ return 0; } @@ -642,11 +643,13 @@ gen6_add_request(struct intel_ring_buffer *ring) struct drm_device *dev = ring->dev; struct drm_i915_private *dev_priv = dev->dev_private; struct intel_ring_buffer *useless; - int i, ret; + int i, ret, extra_dwords = 4; + if (ring->fbc_dirty && ring->id == BCS) + extra_dwords += 4; ret = intel_ring_begin(ring, ((I915_NUM_RINGS-1) * MBOX_UPDATE_DWORDS) + - 4); + extra_dwords); if (ret) return ret; #undef MBOX_UPDATE_DWORDS @@ -661,6 +664,18 @@ gen6_add_request(struct intel_ring_buffer *ring) intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); intel_ring_emit(ring, ring->outstanding_lazy_seqno); intel_ring_emit(ring, MI_USER_INTERRUPT); + + if (ring->fbc_dirty && ring->id == BCS) { + intel_ring_emit(ring, MI_NOOP); + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); + intel_ring_emit(ring, GEN6_BLITTER_ECOSKPD); + intel_ring_emit(ring, + _MASKED_BIT_DISABLE(GEN6_BLITTER_FBC_NOTIFY)); + __intel_ring_advance(ring); + + ring->fbc_dirty = false; + } + __intel_ring_advance(ring); return 0; -- 1.8.4.2 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx