Skip to content

Commit 78d0a27

Browse files
Jie1zhangalexdeucher
authored andcommitted
drm/amdgpu: Add user queue instance count in HW IP info
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 <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Jesse Zhang <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 55d42f6 commit 78d0a27

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
399399
uint32_t ib_size_alignment = 0;
400400
enum amd_ip_block_type type;
401401
unsigned int num_rings = 0;
402+
uint32_t num_hqds = 0;
402403
unsigned int i, j;
403404

404405
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,
411412
if (adev->gfx.gfx_ring[i].sched.ready &&
412413
!adev->gfx.gfx_ring[i].no_user_submission)
413414
++num_rings;
415+
416+
if (!adev->gfx.disable_uq) {
417+
for (i = 0; i < AMDGPU_MES_MAX_GFX_PIPES; i++)
418+
num_hqds += hweight32(adev->mes.gfx_hqd_mask[i]);
419+
}
420+
414421
ib_start_alignment = 32;
415422
ib_size_alignment = 32;
416423
break;
@@ -420,6 +427,12 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
420427
if (adev->gfx.compute_ring[i].sched.ready &&
421428
!adev->gfx.compute_ring[i].no_user_submission)
422429
++num_rings;
430+
431+
if (!adev->sdma.disable_uq) {
432+
for (i = 0; i < AMDGPU_MES_MAX_COMPUTE_PIPES; i++)
433+
num_hqds += hweight32(adev->mes.compute_hqd_mask[i]);
434+
}
435+
423436
ib_start_alignment = 32;
424437
ib_size_alignment = 32;
425438
break;
@@ -429,6 +442,12 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
429442
if (adev->sdma.instance[i].ring.sched.ready &&
430443
!adev->sdma.instance[i].ring.no_user_submission)
431444
++num_rings;
445+
446+
if (!adev->gfx.disable_uq) {
447+
for (i = 0; i < AMDGPU_MES_MAX_SDMA_PIPES; i++)
448+
num_hqds += hweight32(adev->mes.sdma_hqd_mask[i]);
449+
}
450+
432451
ib_start_alignment = 256;
433452
ib_size_alignment = 4;
434453
break;
@@ -570,6 +589,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
570589
}
571590
result->capabilities_flags = 0;
572591
result->available_rings = (1 << num_rings) - 1;
592+
result->userq_num_hqds = num_hqds;
573593
result->ib_start_alignment = ib_start_alignment;
574594
result->ib_size_alignment = ib_size_alignment;
575595
return 0;

include/uapi/drm/amdgpu_drm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,6 +1493,8 @@ struct drm_amdgpu_info_hw_ip {
14931493
__u32 available_rings;
14941494
/** version info: bits 23:16 major, 15:8 minor, 7:0 revision */
14951495
__u32 ip_discovery_version;
1496+
/* Userq available hqds */
1497+
__u32 userq_num_hqds;
14961498
};
14971499

14981500
/* GFX metadata BO sizes and alignment info (in bytes) */

0 commit comments

Comments
 (0)