The SPM (Streaming Performance Monitor) path needs a VMID that is
isolated from other GPU contexts. Introduce vm_manager.spm_vmid to let
a GFXHUB dedicate a VMID to SPM.

When spm_vmid is set, exclude it from both the kernel-queue pool and
vmid_uq_mask_gfxhub, so neither the round-robin kernel-queue allocator
nor MES/Userqueues ever maps another context onto it.

Assisted-by: Claude:claude-sonnet-5
Signed-off-by: Sunil Khatri <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 46 ++++++++++++++++---------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  2 ++
 2 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
index 392a18b1f2b4b..ed1efde29a9a5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
@@ -638,26 +638,45 @@ void amdgpu_vmid_reset_all(struct amdgpu_device *adev)
  * @vmid_kq_mask_gfxhub: kernel-queue VMID pool mask for GFXHUB
  * @vmid_kq_mask_mmhub: kernel-queue VMID pool mask for MMHUB
  *
- * Sets both hubs' kernel-queue VMID pools (tracked least-recently-used
- * via id_mgr[].ids_lru), and both hubs' KFD/MES user-queue masks.
- * vmid_uq_mask_gfxhub is set to the
- * complement of @vmid_kq_mask_gfxhub, since unlike MMHUB's it is always a
- * clean partition of the full VMID range; vmid_uq_mask_mmhub is the
- * fixed pool set here instead, since MMHUB's kq and uq pools are
- * allowed to overlap. A VMID dedicated to a single fixed purpose on
- * MMHUB (npa_vmid) is excluded from both MMHUB pools; it is the
- * caller's responsibility to have already set npa_vmid.
+ * Sets both GFXHUB and MMHUB kernel-queue VMID pools
+ * via id_mgr[].ids_lru, and KFD/MES user-queue masks too.
  */
 void amdgpu_vmid_mgr_set_vmid_mask(struct amdgpu_device *adev,
                                   unsigned long vmid_kq_mask_gfxhub,
                                   unsigned long vmid_kq_mask_mmhub)
 {
+       unsigned long uq_mask_gfxhub, uq_mask_mmhub;
        unsigned int i;
 
        BUILD_BUG_ON(AMDGPU_NUM_VMID > BITS_PER_LONG);
 
-       if (adev->vm_manager.npa_vmid)
+       /*
+        * Derive the uq masks from the kq masks as given, then carve each
+        * hub's dedicated out-of-pool VMID out of both of that hub's pools.
+        */
+       uq_mask_gfxhub = GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~vmid_kq_mask_gfxhub;
+       uq_mask_mmhub = 0xFF00;
+
+       /*
+        * SPM uses a dedicated vmid that is reserved from gfxhub.
+        * Unmask the reserved vmids from both user and kernel queues
+        */
+       if (adev->vm_manager.spm_vmid) {
+               vmid_kq_mask_gfxhub &= ~BIT(adev->vm_manager.spm_vmid);
+               uq_mask_gfxhub &= ~BIT(adev->vm_manager.spm_vmid);
+       }
+
+       /*
+        * NPA uses a dedicated vmid that is reserved from mmhub.
+        * Unmask the reserved VMIDs from both user and kernel queues
+        */
+       if (adev->vm_manager.npa_vmid) {
                vmid_kq_mask_mmhub &= ~BIT(adev->vm_manager.npa_vmid);
+               uq_mask_mmhub &= ~BIT(adev->vm_manager.npa_vmid);
+       }
+
+       adev->vm_manager.vmid_uq_mask_gfxhub = uq_mask_gfxhub;
+       adev->vm_manager.vmid_uq_mask_mmhub = uq_mask_mmhub;
 
        for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
                bool is_mmhub = AMDGPU_IS_MMHUB0(i) || AMDGPU_IS_MMHUB1(i);
@@ -666,13 +685,6 @@ void amdgpu_vmid_mgr_set_vmid_mask(struct amdgpu_device 
*adev,
                            is_mmhub ? &vmid_kq_mask_mmhub : 
&vmid_kq_mask_gfxhub,
                            AMDGPU_NUM_VMID);
        }
-
-       adev->vm_manager.vmid_uq_mask_gfxhub =
-               GENMASK(AMDGPU_NUM_VMID - 1, 1) & ~vmid_kq_mask_gfxhub;
-
-       adev->vm_manager.vmid_uq_mask_mmhub = 0xFF00;
-       if (adev->vm_manager.npa_vmid)
-               adev->vm_manager.vmid_uq_mask_mmhub &= 
~BIT(adev->vm_manager.npa_vmid);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index d99e42ca308ef..ddcdc7256ef07 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -411,7 +411,9 @@ struct amdgpu_vm_manager {
 
        /* Global registration of recent page fault information */
        struct amdgpu_vm_fault_info             fault_info;
+       /* VMIDs dedicated to a single fixed purpose, 0 if unused */
        unsigned int                            npa_vmid;
+       unsigned int                            spm_vmid;
 
        /* VMID masks for GFXHUB and MMHUB */
        uint32_t                                vmid_uq_mask_gfxhub;
-- 
2.34.1

Reply via email to