[Intel-gfx] [PATCH] drm/i915: specify the address of the semaphore register for comparison

Ben Widawsky ben at bwidawsk.net
Wed Sep 21 16:25:03 CEST 2011


On Wed, 21 Sep 2011 12:42:22 +0100
Chris Wilson <chris at chris-wilson.co.uk> wrote:

> In addition to telling the GPU that we are comparing with a named MMIO
> register, we also apparently have to tell the GPU the address of that
> register.
> 
> The lack of giving the GPU the duplicate information it seems to
> desire leads to such fun confusion as:
> 
> Blitter command stream:
>   seqno: 0x00001c6c
> Render command stream:
>   seqno: 0x00001c7a
> 
> Active batch on BLT (seqno 1c6e):
>   0x03b55000:      0x30222221: UNKNOWN
>   0x03b55004:      0xffb7b4b1:    UNKNOWN
>   0x03b55008:      0xffb7b4b1:    UNKNOWN
>   0x03b5500c:      0xffb7b4b1:    UNKNOWN
>   0x03b55010:      0xffb7b4b1:    UNKNOWN
>   0x03b55014:      0xffb7b4b1:    UNKNOWN
>   0x03b55018:      0xffb7b4b1:    UNKNOWN
>   0x03b5501c:      0xffb7b4b1:    UNKNOWN
>   0x03b55020:      0xffb7b4b1:    UNKNOWN
>   0x03b55024:      0xffb7b4b1:    UNKNOWN
>   0x03b55028:      0xffb7b4b1:    UNKNOWN
>   0x03b5502c:      0xffb7b4b1:    UNKNOWN
>   ... [an antialiased rgba box]
> 
> Render ringbuffer:
>   ...
>   0x00007e70:      0x0b160001: MI_SEMAPHORE_MBOX
>   0x00007e74:      0x00001c6e:    dword 1
>   0x00007e78:      0x00000000:    dword 2
>   0x00007e7c:      0x00000000: MI_NOOP
>   0x00007e80:      0x18800180: MI_BATCH_BUFFER_START
>   0x00007e84:      0x03b5b000:    dword 1
>   0x00007e88:      0x02000004: MI_FLUSH
>   0x00007e8c:      0x00000000: MI_NOOP
>   0x00007e90:      0x0b240001: MI_SEMAPHORE_MBOX
>   0x00007e94:      0x00001c70:    dword 1
>   0x00007e98:      0x00022040:    dword 2
>   0x00007e9c:      0x0b240001: MI_SEMAPHORE_MBOX
>   0x00007ea0:      0x00001c70:    dword 1
>   0x00007ea4:      0x00012044:    dword 2
>   0x00007ea8:      0x10800001: MI_STORE_DATA_INDEX
>   0x00007eac:      0x00000080:    dword 1
>   0x00007eb0:      0x00001c70:    dword 2
>   0x00007eb4:      0x01000000: MI_USER_INTERRUPT
>   0x00007eb8:      0x02000000: MI_FLUSH
>   ... [wait on results of batch 1cde from BLT, then execute 1c70 on
> RENDER]
> 
> As the RENDER ring has already completed batch 1c7a before the BLT
> began processing 1c6e, it is obvious then that the GPU did not heed
> the semaphore wait instruction. Adding the symmetric register address
> from the signal instruction to the compare instruction prevents the
> hang and also prevents visual corruption whilst running KDE.
> 
> Reported-by: Andrew Lutomirski <luto at mit.edu>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Andrew Lutomirski <luto at mit.edu>
> ---
>  drivers/gpu/drm/i915/intel_ringbuffer.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c
> b/drivers/gpu/drm/i915/intel_ringbuffer.c index 5fa3d99..6b9790e
> 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -359,7 +359,8 @@ intel_ring_sync(struct intel_ring_buffer *ring,
>  			intel_ring_sync_index(ring, to) << 17 |
>  			MI_SEMAPHORE_COMPARE);
>  	intel_ring_emit(ring, seqno);
> -	intel_ring_emit(ring, 0);
> +	intel_ring_emit(ring,
> +			RING_SYNC_0(to->mmio_base) +
> 4*intel_ring_sync_index(ring,to)); intel_ring_emit(ring, MI_NOOP);
>  	intel_ring_advance(ring);
>  

I'm sort of afraid this is just papering over the issue, ie. the mmio
access is just adding delay that happens to make it work. I think we
should follow up with devs on this one.

Ben



More information about the Intel-gfx mailing list