Re: [PATCH 01/10] drm/amdgpu/gfx6: Fixup emit_cntxcntl()

Alex Deucher <[email protected]> Tue, 4 Aug 2026 11:11:47 -0400
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <CADnq5_ObkWpxABbDk4EGho9PySsAq58nt4_ZmNSc2Q7PTxeaZQ@mail.gmail.com>
Applied the series.  Thanks!

Alex

On Mon, Aug 3, 2026 at 11:13=E2=80=AFAM Timur Krist=C3=B3f <timur.kristof@g=
mail.com> wrote:
>
> Set bits on dword 2 like GFX7-8 except load_global_uconfig
> which doesn't exist on GFX6.
>
> Emit VS_PARTIAL_FLUSH before VGT_FLUSH like GFX7-8.
>
> For reference see old PAL which explains the bit fields in
> this register and that load_global_uconfig doesn't exist on GFX6
> and also see gfx_v7_ring_emit_cntxcntl() for the GFX7 code
> which this commit follows.
>
> Fixes: 2cd46ad22383 ("drm/amdgpu: add graphic pipeline implementation for=
 si v8")
> Signed-off-by: Timur Krist=C3=B3f <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 28 ++++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/=
amdgpu/gfx_v6_0.c
> index cd2a14ecdba8..0cbaae73a0bf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
> @@ -1882,11 +1882,13 @@ static int gfx_v6_0_ring_test_ring(struct amdgpu_=
ring *ring)
>         return r;
>  }
>
> -static void gfx_v6_0_ring_emit_vgt_flush(struct amdgpu_ring *ring)
> +static void gfx_v6_0_ring_emit_event_write(struct amdgpu_ring *ring,
> +                                          uint32_t event_type,
> +                                          uint32_t event_index)
>  {
>         amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0));
> -       amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) |
> -               EVENT_INDEX(0));
> +       amdgpu_ring_write(ring, EVENT_TYPE(event_type) |
> +                               EVENT_INDEX(event_index));
>  }
>
>  static void gfx_v6_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
> @@ -2997,10 +2999,22 @@ static uint64_t gfx_v6_0_get_gpu_clock_counter(st=
ruct amdgpu_device *adev)
>
>  static void gfx_v6_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t=
 flags)
>  {
> -       if (flags & AMDGPU_HAVE_CTX_SWITCH)
> -               gfx_v6_0_ring_emit_vgt_flush(ring);
> +       u32 dw2 =3D 0x80000000; /* set load_enable otherwise this package=
 is just NOPs */
> +
> +       if (flags & AMDGPU_HAVE_CTX_SWITCH) {
> +               gfx_v6_0_ring_emit_event_write(ring, VS_PARTIAL_FLUSH, 4)=
;
> +               gfx_v6_0_ring_emit_event_write(ring, VGT_FLUSH, 0);
> +
> +               /* set load_global_config (load_global_uconfig doesn't ex=
ist on GFX6) */
> +               dw2 |=3D 0x1;
> +               /* set load_cs_sh_regs */
> +               dw2 |=3D 0x01000000;
> +               /* set load_per_context_state & load_gfx_sh_regs */
> +               dw2 |=3D 0x10002;
> +       }
> +
>         amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
> -       amdgpu_ring_write(ring, 0x80000000);
> +       amdgpu_ring_write(ring, dw2);
>         amdgpu_ring_write(ring, 0);
>  }
>
> @@ -3527,7 +3541,7 @@ static const struct amdgpu_ring_funcs gfx_v6_0_ring=
_funcs_gfx =3D {
>                 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fe=
nce, vm fence */
>                 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */
>                 SI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + 6 + /* gfx_v6_0_ring_=
emit_vm_flush */
> -               3 + 2 + /* gfx_v6_ring_emit_cntxcntl including vgt flush =
*/
> +               3 + 2 + 2 + /* gfx_v6_ring_emit_cntxcntl including VGT fl=
ush */
>                 5, /* SURFACE_SYNC */
>         .emit_ib_size =3D 6, /* gfx_v6_0_ring_emit_ib */
>         .emit_ib =3D gfx_v6_0_ring_emit_ib,
> --
> 2.55.0
>