On the A+A VF, VRAM is accessed through the system memory path, so SVM
range PTEs that point at VRAM need AMDGPU_PTE_SYSTEM set, matching what
the graphics paths already do.

v2:
- Use (sriov_vf || passthrough) and amdgpu_virt_vram_is_spm() for
  SVM VRAM PTE_SYSTEM.

v3:
- Rely on amdgpu_virt_vram_is_spm() without redundant VF/passthrough
  checks.

Signed-off-by: Zhigang Luo <[email protected]>
Signed-off-by: Fangsheng Huang <[email protected]>
Signed-off-by: YuBiao Wang <[email protected]>
Reviewed-by: Philip Yang <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index c521ec07bf3c..b3edb47dc2d4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -1374,7 +1374,13 @@ svm_range_get_pte_flags(struct kfd_node *node, struct 
amdgpu_vm *vm,
                mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
 
        pte_flags = AMDGPU_PTE_VALID;
-       pte_flags |= (domain == SVM_RANGE_VRAM_DOMAIN) ? 0 : AMDGPU_PTE_SYSTEM;
+       /* SPM-backed VRAM is accessed through the system memory path and
+        * requires the SYSTEM bit.
+        */
+       if (amdgpu_virt_vram_is_spm(node->adev))
+               pte_flags |= AMDGPU_PTE_SYSTEM;
+       else
+               pte_flags |= (domain == SVM_RANGE_VRAM_DOMAIN) ? 0 : 
AMDGPU_PTE_SYSTEM;
        pte_flags |= snoop ? AMDGPU_PTE_SNOOPED : 0;
        if (gc_ip_version >= IP_VERSION(12, 0, 0))
                pte_flags |= AMDGPU_PTE_IS_PTE;
-- 
2.43.0

Reply via email to