aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@linux.intel.com>2016-06-07 10:19:10 -0400
committerMika Kuoppala <mika.kuoppala@intel.com>2016-07-15 08:51:26 -0400
commita725e1dc4e16a34e3de79b0a6db2ef608fecae4c (patch)
treedba8b659caacea9bea4e1bbf0d79ba38f95a3dbc /drivers/gpu
parent7b9005cd45f34f5c87fd2e28f4e56b348af4ddc5 (diff)
drm/i915/kbl: Add WaForGAMHang
Add this workaround for A0 and B0 revisions References: HSD#2226935 Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1465309159-30531-19-git-send-email-mika.kuoppala@intel.com (cherry picked from commit 0b2d0934edceff9905b1202d0e7e91f1b6228485) Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index cf18eace6690..3138d2fa6ea5 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1689,9 +1689,10 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
1689 struct intel_ringbuffer *ringbuf = request->ringbuf; 1689 struct intel_ringbuffer *ringbuf = request->ringbuf;
1690 struct intel_engine_cs *engine = ringbuf->engine; 1690 struct intel_engine_cs *engine = ringbuf->engine;
1691 u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES; 1691 u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
1692 bool vf_flush_wa = false; 1692 bool vf_flush_wa = false, dc_flush_wa = false;
1693 u32 flags = 0; 1693 u32 flags = 0;
1694 int ret; 1694 int ret;
1695 int len;
1695 1696
1696 flags |= PIPE_CONTROL_CS_STALL; 1697 flags |= PIPE_CONTROL_CS_STALL;
1697 1698
@@ -1718,9 +1719,21 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
1718 */ 1719 */
1719 if (IS_GEN9(engine->dev)) 1720 if (IS_GEN9(engine->dev))
1720 vf_flush_wa = true; 1721 vf_flush_wa = true;
1722
1723 /* WaForGAMHang:kbl */
1724 if (IS_KBL_REVID(request->i915, 0, KBL_REVID_B0))
1725 dc_flush_wa = true;
1721 } 1726 }
1722 1727
1723 ret = intel_ring_begin(request, vf_flush_wa ? 12 : 6); 1728 len = 6;
1729
1730 if (vf_flush_wa)
1731 len += 6;
1732
1733 if (dc_flush_wa)
1734 len += 12;
1735
1736 ret = intel_ring_begin(request, len);
1724 if (ret) 1737 if (ret)
1725 return ret; 1738 return ret;
1726 1739
@@ -1733,12 +1746,31 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
1733 intel_logical_ring_emit(ringbuf, 0); 1746 intel_logical_ring_emit(ringbuf, 0);
1734 } 1747 }
1735 1748
1749 if (dc_flush_wa) {
1750 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
1751 intel_logical_ring_emit(ringbuf, PIPE_CONTROL_DC_FLUSH_ENABLE);
1752 intel_logical_ring_emit(ringbuf, 0);
1753 intel_logical_ring_emit(ringbuf, 0);
1754 intel_logical_ring_emit(ringbuf, 0);
1755 intel_logical_ring_emit(ringbuf, 0);
1756 }
1757
1736 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6)); 1758 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
1737 intel_logical_ring_emit(ringbuf, flags); 1759 intel_logical_ring_emit(ringbuf, flags);
1738 intel_logical_ring_emit(ringbuf, scratch_addr); 1760 intel_logical_ring_emit(ringbuf, scratch_addr);
1739 intel_logical_ring_emit(ringbuf, 0); 1761 intel_logical_ring_emit(ringbuf, 0);
1740 intel_logical_ring_emit(ringbuf, 0); 1762 intel_logical_ring_emit(ringbuf, 0);
1741 intel_logical_ring_emit(ringbuf, 0); 1763 intel_logical_ring_emit(ringbuf, 0);
1764
1765 if (dc_flush_wa) {
1766 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
1767 intel_logical_ring_emit(ringbuf, PIPE_CONTROL_CS_STALL);
1768 intel_logical_ring_emit(ringbuf, 0);
1769 intel_logical_ring_emit(ringbuf, 0);
1770 intel_logical_ring_emit(ringbuf, 0);
1771 intel_logical_ring_emit(ringbuf, 0);
1772 }
1773
1742 intel_logical_ring_advance(ringbuf); 1774 intel_logical_ring_advance(ringbuf);
1743 1775
1744 return 0; 1776 return 0;