[Intel-gfx] [PATCH 06/10] drm/i915: Extract "emit write" part of emit breadcrumb functions
Chris Wilson
chris at chris-wilson.co.uk
Thu Oct 5 09:47:59 UTC 2017
Quoting Michał Winiarski (2017-10-05 10:20:01)
> Let's separate the "emit" part from touching any internal structures,
> this way we can have a generic "emit coherent GGTT write" function.
> We would like to reuse this functionality for emitting HWSP write, to
> confirm that preempt-to-idle has finished.
>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com
> Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
> ---
> drivers/gpu/drm/i915/intel_lrc.c | 21 +++++-------------
> drivers/gpu/drm/i915/intel_ringbuffer.h | 38 +++++++++++++++++++++++++++++++++
> 2 files changed, 43 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 12956f2ba699..e6bbdc5dd01b 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -1766,10 +1766,8 @@ static void gen8_emit_breadcrumb(struct drm_i915_gem_request *request, u32 *cs)
> /* w/a: bit 5 needs to be zero for MI_FLUSH_DW address. */
> BUILD_BUG_ON(I915_GEM_HWS_INDEX_ADDR & (1 << 5));
>
> - *cs++ = (MI_FLUSH_DW + 1) | MI_FLUSH_DW_OP_STOREDW;
> - *cs++ = intel_hws_seqno_address(request->engine) | MI_FLUSH_DW_USE_GTT;
> - *cs++ = 0;
> - *cs++ = request->global_seqno;
> + cs = gen8_emit_ggtt_write(intel_hws_seqno_address(request->engine),
> + request->global_seqno, cs);
> *cs++ = MI_USER_INTERRUPT;
> *cs++ = MI_NOOP;
> request->tail = intel_ring_offset(request, cs);
> @@ -1785,18 +1783,9 @@ static void gen8_emit_breadcrumb_render(struct drm_i915_gem_request *request,
> /* We're using qword write, seqno should be aligned to 8 bytes. */
> BUILD_BUG_ON(I915_GEM_HWS_INDEX & 1);
>
> - /* w/a for post sync ops following a GPGPU operation we
> - * need a prior CS_STALL, which is emitted by the flush
> - * following the batch.
> - */
> - *cs++ = GFX_OP_PIPE_CONTROL(6);
> - *cs++ = PIPE_CONTROL_GLOBAL_GTT_IVB | PIPE_CONTROL_CS_STALL |
> - PIPE_CONTROL_QW_WRITE;
> - *cs++ = intel_hws_seqno_address(request->engine);
> - *cs++ = 0;
> - *cs++ = request->global_seqno;
> - /* We're thrashing one dword of HWS. */
> - *cs++ = 0;
> + cs = gen8_emit_ggtt_write_render(
> + intel_hws_seqno_address(request->engine),
> + request->global_seqno, cs);
Would this be less problematic if we s/render/rcs/ ?
> *cs++ = MI_USER_INTERRUPT;
> *cs++ = MI_NOOP;
> request->tail = intel_ring_offset(request, cs);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 0fedda17488c..e9650552d3c2 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -831,6 +831,44 @@ static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset)
> return batch + 6;
> }
>
> +static inline u32 *
> +gen8_emit_ggtt_write_render(u32 gtt_offset, u32 value, u32 *cs)
I prefer cs to the be first param. I just checked we did
emit_pipe_control in that fashion as well...
In principle,
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris
More information about the Intel-gfx
mailing list