On 2026-09-30 10:43, Sunil Khatri wrote:
Move the duplicated VMID-mask-above-first_kfd_vmid computation out of
amdgpu_mes.c and amdgpu_amdkfd.c into a shared helper, called once
from amdgpu_vmid_mgr_init() to set vm_manager.vmid_uq_mask_gfxhub/mmhub.
MES and KFD now just read those fields instead of each computing them.
Signed-off-by: Sunil Khatri <[email protected]>
Acked-by: Felix Kuehling <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 4 +---
drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 18 ++++++++++++++++++
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 7 -------
3 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index afcfb92fb9f5f..c59a8f99ecdf6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -178,9 +178,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
if (adev->kfd.dev) {
struct kgd2kfd_shared_resources gpu_resources = {
- .compute_vmid_bitmap =
- ((1 << AMDGPU_NUM_VMID) - 1) -
- ((1 << adev->vm_manager.first_kfd_vmid) - 1),
+ .compute_vmid_bitmap =
adev->vm_manager.vmid_uq_mask_gfxhub,
.num_pipe_per_mec = adev->gfx.mec.num_pipe_per_mec,
.num_queue_per_pipe = adev->gfx.mec.num_queue_per_pipe,
.gpuvm_size = min(adev->vm_manager.max_pfn
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
index f8bda01f3bca2..c4c1b2d1e3cd6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
@@ -646,6 +646,22 @@ void amdgpu_vmid_mgr_set_vmid_mask(struct amdgpu_device
*adev,
}
}
+/**
+ * amdgpu_vmid_uq_mask_init - init the user queue VMID masks
+ *
+ * @adev: amdgpu_device pointer
+ *
+ * Sets vmid_uq_mask_gfxhub/mmhub to the pool of VMIDs at or above
+ * first_kfd_vmid, shared by KFD and MES user queues.
+ */
+static void amdgpu_vmid_uq_mask_init(struct amdgpu_device *adev)
+{
+ adev->vm_manager.vmid_uq_mask_gfxhub =
+ ((1U << AMDGPU_NUM_VMID) - 1) &
+ ~((1U << adev->vm_manager.first_kfd_vmid) - 1);
+ adev->vm_manager.vmid_uq_mask_mmhub = 0xFF00;
+}
+
/**
* amdgpu_vmid_mgr_init - init the VMID manager
*
@@ -657,6 +673,8 @@ void amdgpu_vmid_mgr_init(struct amdgpu_device *adev)
{
unsigned i, j;
+ amdgpu_vmid_uq_mask_init(adev);
+
for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
struct amdgpu_vmid_mgr *id_mgr =
&adev->vm_manager.id_mgr[i];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
index d1e956cf8e5b8..8d813c68450bf 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
@@ -111,7 +111,6 @@ static void
amdgpu_mes_userq_notify_unmap_work_handler(struct work_struct *work)
int amdgpu_mes_init(struct amdgpu_device *adev)
{
int i, r, num_pipes, num_queues = 0;
- u32 total_vmid_mask, reserved_vmid_mask;
int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1;
u32 gfx_hqd_mask = amdgpu_mes_get_hqd_mask(adev->gfx.me.num_pipe_per_me,
adev->gfx.me.num_queue_per_pipe,
@@ -134,12 +133,6 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
atomic_set(&adev->mes.userq_hw_queue_count, 0);
INIT_DELAYED_WORK(&adev->mes.userq_notify_unmap_work,
amdgpu_mes_userq_notify_unmap_work_handler);
- total_vmid_mask = (u32)((1UL << 16) - 1);
- reserved_vmid_mask = (u32)((1UL << adev->vm_manager.first_kfd_vmid) -
1);
-
- adev->vm_manager.vmid_uq_mask_mmhub = 0xFF00;
- adev->vm_manager.vmid_uq_mask_gfxhub = total_vmid_mask &
~reserved_vmid_mask;
-
num_pipes = adev->gfx.me.num_pipe_per_me * adev->gfx.me.num_me;
if (num_pipes > AMDGPU_MES_MAX_GFX_PIPES)
dev_warn(adev->dev, "more gfx pipes than supported by MES! (%d vs
%d)\n",