]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Add user queue instance count in HW IP info
authorJesse Zhang <jesse.zhang@amd.com>
Wed, 25 Jun 2025 07:29:45 +0000 (15:29 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 16 Jul 2025 20:17:35 +0000 (16:17 -0400)
This change exposes the number of available user queue instances
for each hardware IP type (GFX, COMPUTE, SDMA) through the
drm_amdgpu_info_hw_ip interface.

Key changes:
1. Added userq_num_instance field to drm_amdgpu_info_hw_ip structure
2. Implemented counting of available HQD slots using:
   - mes.gfx_hqd_mask for GFX queues
   - mes.compute_hqd_mask for COMPUTE queues
   - mes.sdma_hqd_mask for SDMA queues
3. Only counts available instances when user queues are enabled
   (!disable_uq)

v2: using the adev->mes.gfx_hqd_mask[]/compute_hqd_mask[]/sdma_hqd_mask[] masks
  to determine the number of queue slots available for each engine type (Alex)
v3: rename userq_num_instance to userq_num_hqds (Alex)

Suggested-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
include/uapi/drm/amdgpu_drm.h

index c78eea14c70ab75541580e04162fc33fe473c733..3d4185a1d938eed02d162cbc58d4567c1adb922d 100644 (file)
@@ -399,6 +399,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
        uint32_t ib_size_alignment = 0;
        enum amd_ip_block_type type;
        unsigned int num_rings = 0;
+       uint32_t num_hqds = 0;
        unsigned int i, j;
 
        if (info->query_hw_ip.ip_instance >= AMDGPU_HW_IP_INSTANCE_MAX_COUNT)
@@ -411,6 +412,12 @@ 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;
+
+               if (!adev->gfx.disable_uq) {
+                       for (i = 0; i < AMDGPU_MES_MAX_GFX_PIPES; i++)
+                               num_hqds += hweight32(adev->mes.gfx_hqd_mask[i]);
+               }
+
                ib_start_alignment = 32;
                ib_size_alignment = 32;
                break;
@@ -420,6 +427,12 @@ 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;
+
+               if (!adev->sdma.disable_uq) {
+                       for (i = 0; i < AMDGPU_MES_MAX_COMPUTE_PIPES; i++)
+                               num_hqds += hweight32(adev->mes.compute_hqd_mask[i]);
+               }
+
                ib_start_alignment = 32;
                ib_size_alignment = 32;
                break;
@@ -429,6 +442,12 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
                        if (adev->sdma.instance[i].ring.sched.ready &&
                            !adev->sdma.instance[i].ring.no_user_submission)
                                ++num_rings;
+
+               if (!adev->gfx.disable_uq) {
+                       for (i = 0; i < AMDGPU_MES_MAX_SDMA_PIPES; i++)
+                               num_hqds += hweight32(adev->mes.sdma_hqd_mask[i]);
+               }
+
                ib_start_alignment = 256;
                ib_size_alignment = 4;
                break;
@@ -570,6 +589,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
        }
        result->capabilities_flags = 0;
        result->available_rings = (1 << num_rings) - 1;
+       result->userq_num_hqds = num_hqds;
        result->ib_start_alignment = ib_start_alignment;
        result->ib_size_alignment = ib_size_alignment;
        return 0;
index 45c4fa13499c908288ea15cde7822a6e9b94b5c4..66c4a03ac9f9415165e126dd82142d6f79866c7e 100644 (file)
@@ -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 hqds */
+       __u32  userq_num_hqds;
 };
 
 /* GFX metadata BO sizes and alignment info (in bytes) */