aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2014-08-04 06:51:38 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-09-03 05:04:40 -0400
commitc5ad011d7d256ecbe173324029e992817194d2b0 (patch)
tree519859a3838ea190428749a99cfa5b2fd12d3b84 /drivers
parent1012205182fb9470a1bd1620872103a09f566225 (diff)
drm/i915: FBC flush nuke for BDW
According to spec FBC on BDW and HSW are identical without any gaps. So let's copy the nuke and let FBC really start compressing stuff. Without this patch we can verify with false color that nothing is being compressed. With the nuke in place and false color it is possible to see false color debugs. Unfortunatelly on some rings like BCS on BDW we have to avoid Bits 22:18 on LRIs due to a high risk of hung. So, when using Blt ring for frontbuffer rend cache would never been cleaned and FBC would stop compressing buffer. One alternative is to cache clean on software frontbuffer tracking. v2: Fix rebase conflict. v3: Do not clean cache on BCS ring. Instead use sw frontbuffer tracking. Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_display.c3
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c10
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c9
4 files changed, 22 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 5957db463e27..f13f30d65172 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2772,6 +2772,7 @@ extern void intel_modeset_setup_hw_state(struct drm_device *dev,
2772extern void i915_redisable_vga(struct drm_device *dev); 2772extern void i915_redisable_vga(struct drm_device *dev);
2773extern void i915_redisable_vga_power_on(struct drm_device *dev); 2773extern void i915_redisable_vga_power_on(struct drm_device *dev);
2774extern bool intel_fbc_enabled(struct drm_device *dev); 2774extern bool intel_fbc_enabled(struct drm_device *dev);
2775extern void gen8_fbc_sw_flush(struct drm_device *dev, u32 value);
2775extern void intel_disable_fbc(struct drm_device *dev); 2776extern void intel_disable_fbc(struct drm_device *dev);
2776extern bool ironlake_set_drps(struct drm_device *dev, u8 val); 2777extern bool ironlake_set_drps(struct drm_device *dev, u8 val);
2777extern void intel_init_pch_refclk(struct drm_device *dev); 2778extern void intel_init_pch_refclk(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 794aa5e611eb..cbd159163722 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -9082,6 +9082,9 @@ void intel_frontbuffer_flush(struct drm_device *dev,
9082 intel_mark_fb_busy(dev, frontbuffer_bits, NULL); 9082 intel_mark_fb_busy(dev, frontbuffer_bits, NULL);
9083 9083
9084 intel_edp_psr_flush(dev, frontbuffer_bits); 9084 intel_edp_psr_flush(dev, frontbuffer_bits);
9085
9086 if (IS_GEN8(dev))
9087 gen8_fbc_sw_flush(dev, FBC_REND_CACHE_CLEAN);
9085} 9088}
9086 9089
9087/** 9090/**
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2253f878adf4..b9edfd426a19 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -345,6 +345,16 @@ bool intel_fbc_enabled(struct drm_device *dev)
345 return dev_priv->display.fbc_enabled(dev); 345 return dev_priv->display.fbc_enabled(dev);
346} 346}
347 347
348void gen8_fbc_sw_flush(struct drm_device *dev, u32 value)
349{
350 struct drm_i915_private *dev_priv = dev->dev_private;
351
352 if (!IS_GEN8(dev))
353 return;
354
355 I915_WRITE(MSG_FBC_REND_STATE, value);
356}
357
348static void intel_fbc_work_fn(struct work_struct *__work) 358static void intel_fbc_work_fn(struct work_struct *__work)
349{ 359{
350 struct intel_fbc_work *work = 360 struct intel_fbc_work *work =
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 4fb1ec95ec08..de7654623acc 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -444,7 +444,14 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
444 return ret; 444 return ret;
445 } 445 }
446 446
447 return gen8_emit_pipe_control(ring, flags, scratch_addr); 447 ret = gen8_emit_pipe_control(ring, flags, scratch_addr);
448 if (ret)
449 return ret;
450
451 if (!invalidate_domains && flush_domains)
452 return gen7_ring_fbc_flush(ring, FBC_REND_NUKE);
453
454 return 0;
448} 455}
449 456
450static void ring_write_tail(struct intel_engine_cs *ring, 457static void ring_write_tail(struct intel_engine_cs *ring,