aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-10-22 05:55:58 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-10-30 01:55:12 -0400
commitd52832986aa52ea18940e817d5d04c081c2f42f3 (patch)
treeb2b61608e7b2a27643dffff7e2eb5794d7b992e9 /drivers/gpu/drm/amd
parent8120b61fdf3d3aa31d6b7e4a4f633bec1d2edd38 (diff)
drm/amdgpu: use common fences for VMID management v2
v2: add missing NULL check. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c27
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c4
4 files changed, 21 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 6d9c929e6d51..371994c4645f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -970,7 +970,7 @@ struct amdgpu_vm_id {
970 /* last flushed PD/PT update */ 970 /* last flushed PD/PT update */
971 struct fence *flushed_updates; 971 struct fence *flushed_updates;
972 /* last use of vmid */ 972 /* last use of vmid */
973 struct amdgpu_fence *last_id_use; 973 struct fence *last_id_use;
974}; 974};
975 975
976struct amdgpu_vm { 976struct amdgpu_vm {
@@ -1003,7 +1003,7 @@ struct amdgpu_vm {
1003}; 1003};
1004 1004
1005struct amdgpu_vm_manager { 1005struct amdgpu_vm_manager {
1006 struct amdgpu_fence *active[AMDGPU_NUM_VM]; 1006 struct fence *active[AMDGPU_NUM_VM];
1007 uint32_t max_pfn; 1007 uint32_t max_pfn;
1008 /* number of VMIDs */ 1008 /* number of VMIDs */
1009 unsigned nvm; 1009 unsigned nvm;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 06e207fd007b..a12c726f7781 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -135,7 +135,7 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev,
135int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, 135int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
136 struct amdgpu_sync *sync) 136 struct amdgpu_sync *sync)
137{ 137{
138 struct amdgpu_fence *best[AMDGPU_MAX_RINGS] = {}; 138 struct fence *best[AMDGPU_MAX_RINGS] = {};
139 struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx]; 139 struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx];
140 struct amdgpu_device *adev = ring->adev; 140 struct amdgpu_device *adev = ring->adev;
141 141
@@ -154,7 +154,8 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
154 154
155 /* skip over VMID 0, since it is the system VM */ 155 /* skip over VMID 0, since it is the system VM */
156 for (i = 1; i < adev->vm_manager.nvm; ++i) { 156 for (i = 1; i < adev->vm_manager.nvm; ++i) {
157 struct amdgpu_fence *fence = adev->vm_manager.active[i]; 157 struct fence *fence = adev->vm_manager.active[i];
158 struct amdgpu_ring *fring;
158 159
159 if (fence == NULL) { 160 if (fence == NULL) {
160 /* found a free one */ 161 /* found a free one */
@@ -163,21 +164,23 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
163 return 0; 164 return 0;
164 } 165 }
165 166
166 if (amdgpu_fence_is_earlier(fence, best[fence->ring->idx])) { 167 fring = amdgpu_ring_from_fence(fence);
167 best[fence->ring->idx] = fence; 168 if (best[fring->idx] == NULL ||
168 choices[fence->ring == ring ? 0 : 1] = i; 169 fence_is_later(best[fring->idx], fence)) {
170 best[fring->idx] = fence;
171 choices[fring == ring ? 0 : 1] = i;
169 } 172 }
170 } 173 }
171 174
172 for (i = 0; i < 2; ++i) { 175 for (i = 0; i < 2; ++i) {
173 if (choices[i]) { 176 if (choices[i]) {
174 struct amdgpu_fence *fence; 177 struct fence *fence;
175 178
176 fence = adev->vm_manager.active[choices[i]]; 179 fence = adev->vm_manager.active[choices[i]];
177 vm_id->id = choices[i]; 180 vm_id->id = choices[i];
178 181
179 trace_amdgpu_vm_grab_id(choices[i], ring->idx); 182 trace_amdgpu_vm_grab_id(choices[i], ring->idx);
180 return amdgpu_sync_fence(ring->adev, sync, &fence->base); 183 return amdgpu_sync_fence(ring->adev, sync, fence);
181 } 184 }
182 } 185 }
183 186
@@ -246,11 +249,11 @@ void amdgpu_vm_fence(struct amdgpu_device *adev,
246 unsigned ridx = fence->ring->idx; 249 unsigned ridx = fence->ring->idx;
247 unsigned vm_id = vm->ids[ridx].id; 250 unsigned vm_id = vm->ids[ridx].id;
248 251
249 amdgpu_fence_unref(&adev->vm_manager.active[vm_id]); 252 fence_put(adev->vm_manager.active[vm_id]);
250 adev->vm_manager.active[vm_id] = amdgpu_fence_ref(fence); 253 adev->vm_manager.active[vm_id] = fence_get(&fence->base);
251 254
252 amdgpu_fence_unref(&vm->ids[ridx].last_id_use); 255 fence_put(vm->ids[ridx].last_id_use);
253 vm->ids[ridx].last_id_use = amdgpu_fence_ref(fence); 256 vm->ids[ridx].last_id_use = fence_get(&fence->base);
254} 257}
255 258
256/** 259/**
@@ -1311,7 +1314,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1311 1314
1312 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 1315 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
1313 fence_put(vm->ids[i].flushed_updates); 1316 fence_put(vm->ids[i].flushed_updates);
1314 amdgpu_fence_unref(&vm->ids[i].last_id_use); 1317 fence_put(vm->ids[i].last_id_use);
1315 } 1318 }
1316 1319
1317 mutex_destroy(&vm->mutex); 1320 mutex_destroy(&vm->mutex);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 488348272c4d..85bbcdc73fff 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -965,7 +965,7 @@ static int gmc_v7_0_sw_fini(void *handle)
965 965
966 if (adev->vm_manager.enabled) { 966 if (adev->vm_manager.enabled) {
967 for (i = 0; i < AMDGPU_NUM_VM; ++i) 967 for (i = 0; i < AMDGPU_NUM_VM; ++i)
968 amdgpu_fence_unref(&adev->vm_manager.active[i]); 968 fence_put(adev->vm_manager.active[i]);
969 gmc_v7_0_vm_fini(adev); 969 gmc_v7_0_vm_fini(adev);
970 adev->vm_manager.enabled = false; 970 adev->vm_manager.enabled = false;
971 } 971 }
@@ -1015,7 +1015,7 @@ static int gmc_v7_0_suspend(void *handle)
1015 1015
1016 if (adev->vm_manager.enabled) { 1016 if (adev->vm_manager.enabled) {
1017 for (i = 0; i < AMDGPU_NUM_VM; ++i) 1017 for (i = 0; i < AMDGPU_NUM_VM; ++i)
1018 amdgpu_fence_unref(&adev->vm_manager.active[i]); 1018 fence_put(adev->vm_manager.active[i]);
1019 gmc_v7_0_vm_fini(adev); 1019 gmc_v7_0_vm_fini(adev);
1020 adev->vm_manager.enabled = false; 1020 adev->vm_manager.enabled = false;
1021 } 1021 }
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 72e977b1685d..1bcc4e74e3b4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -984,7 +984,7 @@ static int gmc_v8_0_sw_fini(void *handle)
984 984
985 if (adev->vm_manager.enabled) { 985 if (adev->vm_manager.enabled) {
986 for (i = 0; i < AMDGPU_NUM_VM; ++i) 986 for (i = 0; i < AMDGPU_NUM_VM; ++i)
987 amdgpu_fence_unref(&adev->vm_manager.active[i]); 987 fence_put(adev->vm_manager.active[i]);
988 gmc_v8_0_vm_fini(adev); 988 gmc_v8_0_vm_fini(adev);
989 adev->vm_manager.enabled = false; 989 adev->vm_manager.enabled = false;
990 } 990 }
@@ -1036,7 +1036,7 @@ static int gmc_v8_0_suspend(void *handle)
1036 1036
1037 if (adev->vm_manager.enabled) { 1037 if (adev->vm_manager.enabled) {
1038 for (i = 0; i < AMDGPU_NUM_VM; ++i) 1038 for (i = 0; i < AMDGPU_NUM_VM; ++i)
1039 amdgpu_fence_unref(&adev->vm_manager.active[i]); 1039 fence_put(adev->vm_manager.active[i]);
1040 gmc_v8_0_vm_fini(adev); 1040 gmc_v8_0_vm_fini(adev);
1041 adev->vm_manager.enabled = false; 1041 adev->vm_manager.enabled = false;
1042 } 1042 }