Merge tag 'amd-drm-next-5.13-2021-03-23' of https://gitlab.freedesktop.org/agd5f...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_amdkfd_gpuvm.c
index 9f6b299cbf74449715c4e3563c9e7fb32c47ee84..e93850f2f3b11c400eea93b0b5da27259681a15e 100644 (file)
@@ -31,6 +31,7 @@
 #include "amdgpu_amdkfd.h"
 #include "amdgpu_dma_buf.h"
 #include <uapi/linux/kfd_ioctl.h>
+#include "amdgpu_xgmi.h"
 
 /* BO flag to indicate a KFD userptr BO */
 #define AMDGPU_AMDKFD_USERPTR_BO (1ULL << 63)
@@ -96,7 +97,7 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
        uint64_t mem;
 
        si_meminfo(&si);
-       mem = si.totalram - si.totalhigh;
+       mem = si.freeram - si.freehigh;
        mem *= si.mem_unit;
 
        spin_lock_init(&kfd_mem_limit.mem_limit_lock);
@@ -412,7 +413,10 @@ static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)
 {
        struct amdgpu_device *bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev);
        bool coherent = mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_COHERENT;
+       bool uncached = mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED;
        uint32_t mapping_flags;
+       uint64_t pte_flags;
+       bool snoop = false;
 
        mapping_flags = AMDGPU_VM_PAGE_READABLE;
        if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE)
@@ -433,12 +437,41 @@ static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)
                                AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
                }
                break;
+       case CHIP_ALDEBARAN:
+               if (coherent && uncached) {
+                       if (adev->gmc.xgmi.connected_to_cpu ||
+                               !(mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM))
+                               snoop = true;
+                       mapping_flags |= AMDGPU_VM_MTYPE_UC;
+               } else if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {
+                       if (bo_adev == adev) {
+                               mapping_flags |= AMDGPU_VM_MTYPE_RW;
+                               if (adev->gmc.xgmi.connected_to_cpu)
+                                       snoop = true;
+                       } else {
+                               mapping_flags |= AMDGPU_VM_MTYPE_NC;
+                               if (amdgpu_xgmi_same_hive(adev, bo_adev))
+                                       snoop = true;
+                       }
+               } else {
+                       snoop = true;
+                       if (adev->gmc.xgmi.connected_to_cpu)
+                               /* system memory uses NC on A+A */
+                               mapping_flags |= AMDGPU_VM_MTYPE_NC;
+                       else
+                               mapping_flags |= coherent ?
+                                       AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
+               }
+               break;
        default:
                mapping_flags |= coherent ?
                        AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
        }
 
-       return amdgpu_gem_va_map_flags(adev, mapping_flags);
+       pte_flags = amdgpu_gem_va_map_flags(adev, mapping_flags);
+       pte_flags |= snoop ? AMDGPU_PTE_SNOOPED : 0;
+
+       return pte_flags;
 }
 
 /* add_bo_to_vm - Add a BO to a VM