diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2019-01-25 05:05:20 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2019-01-25 06:19:39 -0500 |
commit | e1a73a54a96e80dc6009e73c9209e4f81ae22285 (patch) | |
tree | cadd51eb146190119e6fcd60916b77a2accc96a3 /drivers/gpu/drm/i915/intel_ringbuffer.c | |
parent | 8e525cb4a622148fbe30134ee3a1a34ad839a43a (diff) |
drm/i915: Measure the required reserved size for request emission
Instead of tediously and fragilely counting up the number of dwords
required to emit the breadcrumb to seal a request, fake a request and
measure it automatically once during engine setup.
The downside is that this requires a fair amount of mocking to create a
proper breadcrumb. Still, should be less error prone in future as the
breadcrumb size fluctuates!
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190125100520.20163-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index e39e483d8d16..107c4934e2fa 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -299,7 +299,7 @@ gen6_render_ring_flush(struct i915_request *rq, u32 mode) | |||
299 | return 0; | 299 | return 0; |
300 | } | 300 | } |
301 | 301 | ||
302 | static void gen6_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 302 | static u32 *gen6_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
303 | { | 303 | { |
304 | /* First we do the gen6_emit_post_sync_nonzero_flush w/a */ | 304 | /* First we do the gen6_emit_post_sync_nonzero_flush w/a */ |
305 | *cs++ = GFX_OP_PIPE_CONTROL(4); | 305 | *cs++ = GFX_OP_PIPE_CONTROL(4); |
@@ -327,6 +327,8 @@ static void gen6_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
327 | 327 | ||
328 | rq->tail = intel_ring_offset(rq, cs); | 328 | rq->tail = intel_ring_offset(rq, cs); |
329 | assert_ring_tail_valid(rq->ring, rq->tail); | 329 | assert_ring_tail_valid(rq->ring, rq->tail); |
330 | |||
331 | return cs; | ||
330 | } | 332 | } |
331 | static const int gen6_rcs_emit_breadcrumb_sz = 14; | 333 | static const int gen6_rcs_emit_breadcrumb_sz = 14; |
332 | 334 | ||
@@ -409,7 +411,7 @@ gen7_render_ring_flush(struct i915_request *rq, u32 mode) | |||
409 | return 0; | 411 | return 0; |
410 | } | 412 | } |
411 | 413 | ||
412 | static void gen7_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 414 | static u32 *gen7_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
413 | { | 415 | { |
414 | *cs++ = GFX_OP_PIPE_CONTROL(4); | 416 | *cs++ = GFX_OP_PIPE_CONTROL(4); |
415 | *cs++ = (PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH | | 417 | *cs++ = (PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH | |
@@ -427,10 +429,12 @@ static void gen7_rcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
427 | 429 | ||
428 | rq->tail = intel_ring_offset(rq, cs); | 430 | rq->tail = intel_ring_offset(rq, cs); |
429 | assert_ring_tail_valid(rq->ring, rq->tail); | 431 | assert_ring_tail_valid(rq->ring, rq->tail); |
432 | |||
433 | return cs; | ||
430 | } | 434 | } |
431 | static const int gen7_rcs_emit_breadcrumb_sz = 6; | 435 | static const int gen7_rcs_emit_breadcrumb_sz = 6; |
432 | 436 | ||
433 | static void gen6_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 437 | static u32 *gen6_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
434 | { | 438 | { |
435 | *cs++ = MI_FLUSH_DW | MI_FLUSH_DW_OP_STOREDW; | 439 | *cs++ = MI_FLUSH_DW | MI_FLUSH_DW_OP_STOREDW; |
436 | *cs++ = intel_hws_seqno_address(rq->engine) | MI_FLUSH_DW_USE_GTT; | 440 | *cs++ = intel_hws_seqno_address(rq->engine) | MI_FLUSH_DW_USE_GTT; |
@@ -439,11 +443,13 @@ static void gen6_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
439 | 443 | ||
440 | rq->tail = intel_ring_offset(rq, cs); | 444 | rq->tail = intel_ring_offset(rq, cs); |
441 | assert_ring_tail_valid(rq->ring, rq->tail); | 445 | assert_ring_tail_valid(rq->ring, rq->tail); |
446 | |||
447 | return cs; | ||
442 | } | 448 | } |
443 | static const int gen6_xcs_emit_breadcrumb_sz = 4; | 449 | static const int gen6_xcs_emit_breadcrumb_sz = 4; |
444 | 450 | ||
445 | #define GEN7_XCS_WA 32 | 451 | #define GEN7_XCS_WA 32 |
446 | static void gen7_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 452 | static u32 *gen7_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
447 | { | 453 | { |
448 | int i; | 454 | int i; |
449 | 455 | ||
@@ -466,6 +472,8 @@ static void gen7_xcs_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
466 | 472 | ||
467 | rq->tail = intel_ring_offset(rq, cs); | 473 | rq->tail = intel_ring_offset(rq, cs); |
468 | assert_ring_tail_valid(rq->ring, rq->tail); | 474 | assert_ring_tail_valid(rq->ring, rq->tail); |
475 | |||
476 | return cs; | ||
469 | } | 477 | } |
470 | static const int gen7_xcs_emit_breadcrumb_sz = 8 + GEN7_XCS_WA * 3; | 478 | static const int gen7_xcs_emit_breadcrumb_sz = 8 + GEN7_XCS_WA * 3; |
471 | #undef GEN7_XCS_WA | 479 | #undef GEN7_XCS_WA |
@@ -861,7 +869,7 @@ static void i9xx_submit_request(struct i915_request *request) | |||
861 | intel_ring_set_tail(request->ring, request->tail)); | 869 | intel_ring_set_tail(request->ring, request->tail)); |
862 | } | 870 | } |
863 | 871 | ||
864 | static void i9xx_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 872 | static u32 *i9xx_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
865 | { | 873 | { |
866 | *cs++ = MI_FLUSH; | 874 | *cs++ = MI_FLUSH; |
867 | 875 | ||
@@ -874,11 +882,13 @@ static void i9xx_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
874 | 882 | ||
875 | rq->tail = intel_ring_offset(rq, cs); | 883 | rq->tail = intel_ring_offset(rq, cs); |
876 | assert_ring_tail_valid(rq->ring, rq->tail); | 884 | assert_ring_tail_valid(rq->ring, rq->tail); |
885 | |||
886 | return cs; | ||
877 | } | 887 | } |
878 | static const int i9xx_emit_breadcrumb_sz = 6; | 888 | static const int i9xx_emit_breadcrumb_sz = 6; |
879 | 889 | ||
880 | #define GEN5_WA_STORES 8 /* must be at least 1! */ | 890 | #define GEN5_WA_STORES 8 /* must be at least 1! */ |
881 | static void gen5_emit_breadcrumb(struct i915_request *rq, u32 *cs) | 891 | static u32 *gen5_emit_breadcrumb(struct i915_request *rq, u32 *cs) |
882 | { | 892 | { |
883 | int i; | 893 | int i; |
884 | 894 | ||
@@ -895,6 +905,8 @@ static void gen5_emit_breadcrumb(struct i915_request *rq, u32 *cs) | |||
895 | 905 | ||
896 | rq->tail = intel_ring_offset(rq, cs); | 906 | rq->tail = intel_ring_offset(rq, cs); |
897 | assert_ring_tail_valid(rq->ring, rq->tail); | 907 | assert_ring_tail_valid(rq->ring, rq->tail); |
908 | |||
909 | return cs; | ||
898 | } | 910 | } |
899 | static const int gen5_emit_breadcrumb_sz = GEN5_WA_STORES * 3 + 2; | 911 | static const int gen5_emit_breadcrumb_sz = GEN5_WA_STORES * 3 + 2; |
900 | #undef GEN5_WA_STORES | 912 | #undef GEN5_WA_STORES |