[Mesa-dev] [PATCH 1/3] r600g: fix CP DMA hazard with index buffer fetches

Alex Deucher alexdeucher at gmail.com
Fri May 27 19:49:31 UTC 2016


On Fri, May 27, 2016 at 3:44 PM, Marek Olšák <maraeo at gmail.com> wrote:
> On Fri, May 27, 2016 at 9:03 PM, Alex Deucher <alexdeucher at gmail.com> wrote:
>> On Fri, May 27, 2016 at 2:18 PM, Marek Olšák <maraeo at gmail.com> wrote:
>>> From: Marek Olšák <marek.olsak at amd.com>
>>>
>>> R600-R700 used a bad workaround. Now only R600 has to use it.
>>> ---
>>>  src/gallium/drivers/r600/evergreen_hw_context.c | 13 +++++++++++--
>>>  src/gallium/drivers/r600/evergreend.h           |  1 +
>>>  src/gallium/drivers/r600/r600_blit.c            |  6 ------
>>>  src/gallium/drivers/r600/r600_hw_context.c      | 25 ++++++++++++++++++++-----
>>>  src/gallium/drivers/r600/r600d.h                |  1 +
>>>  5 files changed, 33 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/r600/evergreen_hw_context.c b/src/gallium/drivers/r600/evergreen_hw_context.c
>>> index f456696..14877ae 100644
>>> --- a/src/gallium/drivers/r600/evergreen_hw_context.c
>>> +++ b/src/gallium/drivers/r600/evergreen_hw_context.c
>>> @@ -117,7 +117,7 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx,
>>>                 unsigned byte_count = MIN2(size, CP_DMA_MAX_BYTE_COUNT);
>>>                 unsigned reloc;
>>>
>>> -               r600_need_cs_space(rctx, 10 + (rctx->b.flags ? R600_MAX_FLUSH_CS_DWORDS : 0), FALSE);
>>> +               r600_need_cs_space(rctx, 2 + 10 + (rctx->b.flags ? R600_MAX_FLUSH_CS_DWORDS : 0), FALSE);
>>>
>>>                 /* Flush the caches for the first copy only. */
>>>                 if (rctx->b.flags) {
>>> @@ -148,9 +148,18 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx,
>>>                 offset += byte_count;
>>>         }
>>>
>>> +       /* CP DMA is executed in ME, but index buffers are read by PFP.
>>> +        * This ensures that ME (CP DMA) is idle before PFP starts fetching
>>> +        * indices. If we wanted to execute CP DMA in PFP, this packet
>>> +        * should precede it.
>>> +        */
>>> +       if (coher == R600_COHERENCY_SHADER) {
>>> +               radeon_emit(cs, PKT3(PKT3_PFP_SYNC_ME, 0, 0));
>>> +               radeon_emit(cs, 0);
>>> +       }
>>
>> Did you test this on 7xx?  I don't think this works on 7xx despite
>
> No yet.
>
>> what the documentation says.  See this kernel commit:
>> http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b6c2b4faf90230ef9cf1a81f36cbccda4a606c59
>> I think this packet only works on evergreen and newer.
>
> It should work on R700 according to my docs. The only explanation why
> it hangs is that our CP firmware is too old.

IIRC, I looked for new 7xx firmware and there wasn't any.  When
support for the packet was added in the evergreen timeframe, I suspect
it was never validated on 7xx to avoid revalidating/breaking the
existing catalyst 6xx/7xx drivers.

Alex

>
> Marek


More information about the mesa-dev mailing list