amd/amdgpu: Set MTYPE_UC for access over PCIe
authorAmber Lin <Amber.Lin@amd.com>
Mon, 28 Nov 2022 16:26:02 +0000 (11:26 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:50:54 +0000 (09:50 -0400)
For GFX v9_4_3, set MTYPE_UC for memory access over PCIe.

v4 - add missing indentation pointed out by Felix and add his
reviewed-by tag.
v3 - add missing logic for the svm path.
v2 - add amdgpu_xgmi_same_hive to separate access over xgmi from pcie

Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Amber Lin <Amber.Lin@amd.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_svm.c

index 5d6e025..6daba05 100644 (file)
@@ -1195,16 +1195,29 @@ svm_range_get_pte_flags(struct kfd_node *node,
                //e.g. NPS4. Current approch is only applicable without memory
                //partitions.
                snoop = true;
-               if (uncached)
+               if (uncached) {
                        mapping_flags |= AMDGPU_VM_MTYPE_UC;
-               /* local HBM region close to partition*/
-               else if (bo_node == node)
-                       mapping_flags |= AMDGPU_VM_MTYPE_RW;
-               /* local HBM region far from partition or remote XGMI GPU or
-                * system memory
-                */
-               else
+               } else if (domain == SVM_RANGE_VRAM_DOMAIN) {
+                       /* local HBM region close to partition with a workaround
+                        * for Endpoint systems.
+                        */
+                       if (bo_node == node)
+                               mapping_flags |=
+                                       (node->adev->flags & AMD_IS_APU) ?
+                                       AMDGPU_VM_MTYPE_RW : AMDGPU_VM_MTYPE_NC;
+                       /* local HBM region far from partition or remote XGMI GPU */
+                       else if (svm_nodes_in_same_hive(bo_node, node))
+                               mapping_flags |= AMDGPU_VM_MTYPE_NC;
+                       /* PCIe P2P */
+                       else
+                               mapping_flags |= AMDGPU_VM_MTYPE_UC;
+               /* system memory accessed by the APU */
+               } else if (node->adev->flags & AMD_IS_APU) {
                        mapping_flags |= AMDGPU_VM_MTYPE_NC;
+               /* system memory accessed by the dGPU */
+               } else {
+                       mapping_flags |= AMDGPU_VM_MTYPE_UC;
+               }
                break;
        default:
                mapping_flags |= coherent ?