diff options
author | Mika Kuoppala <mika.kuoppala@linux.intel.com> | 2016-06-07 10:19:10 -0400 |
---|---|---|
committer | Mika Kuoppala <mika.kuoppala@intel.com> | 2016-07-15 08:51:26 -0400 |
commit | a725e1dc4e16a34e3de79b0a6db2ef608fecae4c (patch) | |
tree | dba8b659caacea9bea4e1bbf0d79ba38f95a3dbc /drivers/gpu | |
parent | 7b9005cd45f34f5c87fd2e28f4e56b348af4ddc5 (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.c | 36 |
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; |