]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdkfd: Limit per-process xnack support for GFX12.1
authorHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Tue, 9 Dec 2025 18:47:09 +0000 (13:47 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 Apr 2026 14:57:31 +0000 (10:57 -0400)
GFX12.1 doesn't support different processes with different xnack
setting. Hence, xnack changes from its default setting needs driver
reload with noretry module parameter.

However, if driver boots-up with xnack on and process sets xnack off,
this condition is supported. In this case, only driver takes xnack off
path whereas hardware / firmware considers xnack is on.

Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Reviewed-by: Philip.Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12_1.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h

index 9e70a5f8a50b08a5972e1ec2e5414d71ad60b1a0..52598937137823f60e4a5f2d0370b73f9ea7d19c 100644 (file)
@@ -54,6 +54,7 @@ static int update_qpd_v12_1(struct device_queue_manager *dqm,
        struct kfd_process_device *pdd;
        struct amdgpu_device *adev = dqm->dev->adev;
        struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];
+       bool xnack_enabled;
 
        pdd = qpd_to_pdd(qpd);
        qpd->vm_cntx_cntl = hub->vm_cntx_cntl;
@@ -71,16 +72,18 @@ static int update_qpd_v12_1(struct device_queue_manager *dqm,
                qpd->sh_mem_ape1_base = 0;
        }
 
-       if (KFD_SUPPORT_XNACK_PER_PROCESS(dqm->dev)) {
-               if (!pdd->process->xnack_enabled) {
-                       qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT;
-                       qpd->vm_cntx_cntl &=
+       xnack_enabled = KFD_SUPPORT_XNACK_PER_PROCESS(dqm->dev) ?
+                       pdd->process->xnack_enabled :
+                       !pdd->dev->kfd->noretry;
+
+       if (!xnack_enabled) {
+               qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT;
+               qpd->vm_cntx_cntl &=
                        ~(1 << GCVM_CONTEXT0_CNTL__RETRY_PERMISSION_OR_INVALID_PAGE_FAULT__SHIFT);
-               } else {
-                       qpd->sh_mem_config &= ~(1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT);
-                       qpd->vm_cntx_cntl |=
+       } else {
+               qpd->sh_mem_config &= ~(1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT);
+               qpd->vm_cntx_cntl |=
                        (1 << GCVM_CONTEXT0_CNTL__RETRY_PERMISSION_OR_INVALID_PAGE_FAULT__SHIFT);
-               }
        }
 
        qpd->sh_mem_bases = compute_sh_mem_bases_64bit(pdd);
index 6e333bfa17d6273eb8aca36bf58ac3770d779be3..39b06544460c50eb60f177e328c03864a148ff3d 100644 (file)
@@ -215,8 +215,7 @@ enum cache_policy {
        ((KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2)) ||        \
         (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3)) ||        \
         (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4)) ||        \
-        (KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) ||        \
-        (KFD_GC_VERSION(dev) == IP_VERSION(12, 1, 0)))
+        (KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)))
 
 struct kfd_node;