aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
authorshaoyunl <shaoyun.liu@amd.com>2019-02-21 16:30:25 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-03-19 16:36:48 -0400
commit9b638f9751308ae3ae8f28e0c6e9decffd97f5f9 (patch)
treef64c4de40d4e49ea3f11ba79dbc3e65bd514c2fa /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
parenta690aa0f459eba3e768257a655c82b24d14dcc88 (diff)
drm/amdgpu: XGMI pstate switch initial support
Driver vote low to high pstate switch whenever there is an outstanding XGMI mapping request. Driver vote high to low pstate when all the outstanding XGMI mapping is terminated. Signed-off-by: shaoyunl <shaoyun.liu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 67d638fef1fb..52db19e88ab5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -34,6 +34,7 @@
34#include "amdgpu_trace.h" 34#include "amdgpu_trace.h"
35#include "amdgpu_amdkfd.h" 35#include "amdgpu_amdkfd.h"
36#include "amdgpu_gmc.h" 36#include "amdgpu_gmc.h"
37#include "amdgpu_xgmi.h"
37 38
38/** 39/**
39 * DOC: GPUVM 40 * DOC: GPUVM
@@ -2013,8 +2014,9 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
2013 struct ttm_mem_reg *mem; 2014 struct ttm_mem_reg *mem;
2014 struct drm_mm_node *nodes; 2015 struct drm_mm_node *nodes;
2015 struct dma_fence *exclusive, **last_update; 2016 struct dma_fence *exclusive, **last_update;
2016 uint64_t flags;
2017 struct amdgpu_device *bo_adev = adev; 2017 struct amdgpu_device *bo_adev = adev;
2018 bool is_xgmi = false;
2019 uint64_t flags;
2018 int r; 2020 int r;
2019 2021
2020 if (clear || !bo) { 2022 if (clear || !bo) {
@@ -2036,6 +2038,10 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
2036 if (bo) { 2038 if (bo) {
2037 flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem); 2039 flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem);
2038 bo_adev = amdgpu_ttm_adev(bo->tbo.bdev); 2040 bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);
2041 if (adev != bo_adev &&
2042 adev->gmc.xgmi.hive_id &&
2043 adev->gmc.xgmi.hive_id == bo_adev->gmc.xgmi.hive_id)
2044 is_xgmi = true;
2039 } else { 2045 } else {
2040 flags = 0x0; 2046 flags = 0x0;
2041 } 2047 }
@@ -2054,6 +2060,19 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
2054 } 2060 }
2055 2061
2056 list_for_each_entry(mapping, &bo_va->invalids, list) { 2062 list_for_each_entry(mapping, &bo_va->invalids, list) {
2063 if (mapping->is_xgmi != is_xgmi) {
2064 if (is_xgmi) {
2065 /* Adding an XGMI mapping to the PT */
2066 if (atomic_inc_return(&adev->xgmi_map_counter) == 1)
2067 amdgpu_xgmi_set_pstate(adev, 1);
2068 } else {
2069 /* Removing an XGMI mapping from the PT */
2070 if (atomic_dec_return(&adev->xgmi_map_counter) == 0)
2071 amdgpu_xgmi_set_pstate(adev, 0);
2072 }
2073 mapping->is_xgmi = is_xgmi;
2074 }
2075
2057 r = amdgpu_vm_bo_split_mapping(adev, exclusive, pages_addr, vm, 2076 r = amdgpu_vm_bo_split_mapping(adev, exclusive, pages_addr, vm,
2058 mapping, flags, bo_adev, nodes, 2077 mapping, flags, bo_adev, nodes,
2059 last_update); 2078 last_update);
@@ -2271,6 +2290,13 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
2271 r = amdgpu_vm_bo_update_mapping(adev, NULL, NULL, vm, 2290 r = amdgpu_vm_bo_update_mapping(adev, NULL, NULL, vm,
2272 mapping->start, mapping->last, 2291 mapping->start, mapping->last,
2273 init_pte_value, 0, &f); 2292 init_pte_value, 0, &f);
2293
2294 if (mapping->is_xgmi) {
2295 /* Removing an XGMI mapping from the PT */
2296 if (atomic_dec_return(&adev->xgmi_map_counter) == 0)
2297 amdgpu_xgmi_set_pstate(adev, 0);
2298 }
2299
2274 amdgpu_vm_free_mapping(adev, vm, mapping, f); 2300 amdgpu_vm_free_mapping(adev, vm, mapping, f);
2275 if (r) { 2301 if (r) {
2276 dma_fence_put(f); 2302 dma_fence_put(f);
@@ -2467,6 +2493,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
2467 mapping->last = eaddr; 2493 mapping->last = eaddr;
2468 mapping->offset = offset; 2494 mapping->offset = offset;
2469 mapping->flags = flags; 2495 mapping->flags = flags;
2496 mapping->is_xgmi = false;
2470 2497
2471 amdgpu_vm_bo_insert_map(adev, bo_va, mapping); 2498 amdgpu_vm_bo_insert_map(adev, bo_va, mapping);
2472 2499