aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_lrc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lrc.c')
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 6a978ce80244..5c6080fd0968 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -841,11 +841,11 @@ static int logical_ring_prepare(struct drm_i915_gem_request *req, int bytes)
841 if (unlikely(total_bytes > remain_usable)) { 841 if (unlikely(total_bytes > remain_usable)) {
842 /* 842 /*
843 * The base request will fit but the reserved space 843 * The base request will fit but the reserved space
844 * falls off the end. So only need to to wait for the 844 * falls off the end. So don't need an immediate wrap
845 * reserved size after flushing out the remainder. 845 * and only need to effectively wait for the reserved
846 * size space from the start of ringbuffer.
846 */ 847 */
847 wait_bytes = remain_actual + ringbuf->reserved_size; 848 wait_bytes = remain_actual + ringbuf->reserved_size;
848 need_wrap = true;
849 } else if (total_bytes > ringbuf->space) { 849 } else if (total_bytes > ringbuf->space) {
850 /* No wrapping required, just waiting. */ 850 /* No wrapping required, just waiting. */
851 wait_bytes = total_bytes; 851 wait_bytes = total_bytes;
@@ -1913,15 +1913,18 @@ static int gen8_emit_request_render(struct drm_i915_gem_request *request)
1913 struct intel_ringbuffer *ringbuf = request->ringbuf; 1913 struct intel_ringbuffer *ringbuf = request->ringbuf;
1914 int ret; 1914 int ret;
1915 1915
1916 ret = intel_logical_ring_begin(request, 6 + WA_TAIL_DWORDS); 1916 ret = intel_logical_ring_begin(request, 8 + WA_TAIL_DWORDS);
1917 if (ret) 1917 if (ret)
1918 return ret; 1918 return ret;
1919 1919
1920 /* We're using qword write, seqno should be aligned to 8 bytes. */
1921 BUILD_BUG_ON(I915_GEM_HWS_INDEX & 1);
1922
1920 /* w/a for post sync ops following a GPGPU operation we 1923 /* w/a for post sync ops following a GPGPU operation we
1921 * need a prior CS_STALL, which is emitted by the flush 1924 * need a prior CS_STALL, which is emitted by the flush
1922 * following the batch. 1925 * following the batch.
1923 */ 1926 */
1924 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(5)); 1927 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
1925 intel_logical_ring_emit(ringbuf, 1928 intel_logical_ring_emit(ringbuf,
1926 (PIPE_CONTROL_GLOBAL_GTT_IVB | 1929 (PIPE_CONTROL_GLOBAL_GTT_IVB |
1927 PIPE_CONTROL_CS_STALL | 1930 PIPE_CONTROL_CS_STALL |
@@ -1929,7 +1932,10 @@ static int gen8_emit_request_render(struct drm_i915_gem_request *request)
1929 intel_logical_ring_emit(ringbuf, hws_seqno_address(request->ring)); 1932 intel_logical_ring_emit(ringbuf, hws_seqno_address(request->ring));
1930 intel_logical_ring_emit(ringbuf, 0); 1933 intel_logical_ring_emit(ringbuf, 0);
1931 intel_logical_ring_emit(ringbuf, i915_gem_request_get_seqno(request)); 1934 intel_logical_ring_emit(ringbuf, i915_gem_request_get_seqno(request));
1935 /* We're thrashing one dword of HWS. */
1936 intel_logical_ring_emit(ringbuf, 0);
1932 intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT); 1937 intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT);
1938 intel_logical_ring_emit(ringbuf, MI_NOOP);
1933 return intel_logical_ring_advance_and_submit(request); 1939 return intel_logical_ring_advance_and_submit(request);
1934} 1940}
1935 1941