[PATCH 2/2] drm/amdgpu: handle AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID on gfx10

Marek Olšák maraeo at gmail.com
Fri Jun 28 20:35:23 UTC 2019


Thanks. I'll push both patches with emit_ib_size updated for this patch.

Marek

On Thu, Jun 27, 2019 at 3:50 AM zhoucm1 <zhoucm1 at amd.com> wrote:

> any reason for not care .emit_ib_size in this one?
>
> -David
>
>
> On 2019年06月27日 06:35, Marek Olšák wrote:
> > From: Marek Olšák <marek.olsak at amd.com>
> >
> > Signed-off-by: Marek Olšák <marek.olsak at amd.com>
> > ---
> >   drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 17 +++++++++++++++++
> >   1 file changed, 17 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> > index 6baaa65a1daa..5b807a19bbbf 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> > @@ -4257,20 +4257,36 @@ static void gfx_v10_0_ring_emit_ib_gfx(struct
> amdgpu_ring *ring,
> >   }
> >
> >   static void gfx_v10_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
> >                                          struct amdgpu_job *job,
> >                                          struct amdgpu_ib *ib,
> >                                          uint32_t flags)
> >   {
> >       unsigned vmid = AMDGPU_JOB_GET_VMID(job);
> >       u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
> >
> > +     /* Currently, there is a high possibility to get wave ID mismatch
> > +      * between ME and GDS, leading to a hw deadlock, because ME
> generates
> > +      * different wave IDs than the GDS expects. This situation happens
> > +      * randomly when at least 5 compute pipes use GDS ordered append.
> > +      * The wave IDs generated by ME are also wrong after
> suspend/resume.
> > +      * Those are probably bugs somewhere else in the kernel driver.
> > +      *
> > +      * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME
> and
> > +      * GDS to 0 for this ring (me/pipe).
> > +      */
> > +     if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) {
> > +             amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG,
> 1));
> > +             amdgpu_ring_write(ring, mmGDS_COMPUTE_MAX_WAVE_ID);
> > +             amdgpu_ring_write(ring,
> ring->adev->gds.gds_compute_max_wave_id);
> > +     }
> > +
> >       amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
> >       BUG_ON(ib->gpu_addr & 0x3); /* Dword align */
> >       amdgpu_ring_write(ring,
> >   #ifdef __BIG_ENDIAN
> >                               (2 << 0) |
> >   #endif
> >                               lower_32_bits(ib->gpu_addr));
> >       amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
> >       amdgpu_ring_write(ring, control);
> >   }
> > @@ -5103,20 +5119,21 @@ static void gfx_v10_0_set_rlc_funcs(struct
> amdgpu_device *adev)
> >       }
> >   }
> >
> >   static void gfx_v10_0_set_gds_init(struct amdgpu_device *adev)
> >   {
> >       /* init asic gds info */
> >       switch (adev->asic_type) {
> >       case CHIP_NAVI10:
> >       default:
> >               adev->gds.gds_size = 0x10000;
> > +             adev->gds.gds_compute_max_wave_id = 0x4ff;
> >               adev->gds.vgt_gs_max_wave_id = 0x3ff;
> >               break;
> >       }
> >
> >       adev->gds.gws_size = 64;
> >       adev->gds.oa_size = 16;
> >   }
> >
> >   static void gfx_v10_0_set_user_wgp_inactive_bitmap_per_sh(struct
> amdgpu_device *adev,
> >                                                         u32 bitmap)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20190628/4d54471d/attachment-0001.html>


More information about the amd-gfx mailing list