[PATCH 1/2] drm/amdgpu: Add user queue instance count reporting for gfx12

Zhang, Jesse(Jie) Jesse.Zhang at amd.com
Tue Jun 24 09:17:56 UTC 2025


[AMD Official Use Only - AMD Internal Distribution Only]

-----Original Message-----
From: Alex Deucher <alexdeucher at gmail.com>
Sent: Monday, June 23, 2025 11:51 PM
To: Zhang, Jesse(Jie) <Jesse.Zhang at amd.com>
Cc: amd-gfx at lists.freedesktop.org; Deucher, Alexander <Alexander.Deucher at amd.com>; Koenig, Christian <Christian.Koenig at amd.com>
Subject: Re: [PATCH 1/2] drm/amdgpu: Add user queue instance count reporting for gfx12

On Mon, Jun 23, 2025 at 5:13 AM Jesse Zhang <jesse.zhang at amd.com> wrote:
>
> This change exposes the number of available user queue instances
> through the HW IP info query interface. The information helps user
> mode drivers properly allocate and manage queue resources.
>
> Key changes:
> 1. Added userq_gfx_instances and userq_compute_instances fields
>    to amdgpu_gfx structure
> 2. Initialized the values during GFX IP early init for v12
>    (only when user queues are not disabled via disable_uq) 3. Exposed
> the values through drm_amdgpu_info_hw_ip structure
>    via amdgpu_hw_ip_info()
>
> The values represent:
> - userq_gfx_instances: Number of GFX ring instances available
> - userq_compute_instances: Number of compute ring instances available
>
> Signed-off-by: Jesse Zhang <Jesse.Zhang at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 4 ++++
> drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c  | 5 +++++
>  include/uapi/drm/amdgpu_drm.h           | 2 ++
>  4 files changed, 13 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> index 08f268dab8f5..63a7f0e0db5b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> @@ -452,6 +452,8 @@ struct amdgpu_gfx {
>         unsigned                        num_gfx_rings;
>         struct amdgpu_ring              compute_ring[AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES];
>         unsigned                        num_compute_rings;
> +       unsigned                        userq_gfx_instances;
> +       unsigned                        userq_compute_instances;
>         struct amdgpu_irq_src           eop_irq;
>         struct amdgpu_irq_src           priv_reg_irq;
>         struct amdgpu_irq_src           priv_inst_irq;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 195ed81d39ff..ff05c82a3dff 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -411,6 +411,8 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
>                         if (adev->gfx.gfx_ring[i].sched.ready &&
>                             !adev->gfx.gfx_ring[i].no_user_submission)
>                                 ++num_rings;
> +
> +               result->userq_num_instance =
> + adev->gfx.userq_gfx_instances;
>                 ib_start_alignment = 32;
>                 ib_size_alignment = 32;
>                 break;
> @@ -420,6 +422,8 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
>                         if (adev->gfx.compute_ring[i].sched.ready &&
>                             !adev->gfx.compute_ring[i].no_user_submission)
>                                 ++num_rings;
> +
> +               result->userq_num_instance =
> + adev->gfx.userq_compute_instances;
>                 ib_start_alignment = 32;
>                 ib_size_alignment = 32;
>                 break;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> index 1234c8d64e20..482490783a0a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
> @@ -3852,6 +3852,11 @@ static int gfx_v12_0_early_init(struct amdgpu_ip_block *ip_block)
>                                                   AMDGPU_MAX_COMPUTE_RINGS);
>         }
>
> +       if (!adev->gfx.disable_uq) {
> +               adev->gfx.userq_gfx_instances = GFX12_NUM_GFX_RINGS;
> +               adev->gfx.userq_compute_instances =
> + AMDGPU_MAX_COMPUTE_RINGS;

These are kernel queue values.  If you want to expose something like this, it should be something like the number of HQD slots available for user queues for each queue type.  That said, what's the use case for this?  Applications don't know what other applications are doing.

It is used to unify kfdtest and IGT tests.
Userspace needs to get the number of instance of each type and then perform concurrent tests, just like KFDQMTest.AllCpQueues.

Thanks
Jesse

Alex

> +       }
> +
>         gfx_v12_0_set_kiq_pm4_funcs(adev);
>         gfx_v12_0_set_ring_funcs(adev);
>         gfx_v12_0_set_irq_funcs(adev); diff --git
> a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index
> 45c4fa13499c..8082270a7ceb 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -1493,6 +1493,8 @@ struct drm_amdgpu_info_hw_ip {
>         __u32  available_rings;
>         /** version info: bits 23:16 major, 15:8 minor, 7:0 revision */
>         __u32  ip_discovery_version;
> +       /* Userq available instance */
> +       __u32  userq_num_instance;
>  };
>
>  /* GFX metadata BO sizes and alignment info (in bytes) */
> --
> 2.34.1
>


More information about the amd-gfx mailing list