diff options
author | Christian König <christian.koenig@amd.com> | 2015-10-22 05:55:58 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-10-30 01:55:12 -0400 |
commit | d52832986aa52ea18940e817d5d04c081c2f42f3 (patch) | |
tree | b2b61608e7b2a27643dffff7e2eb5794d7b992e9 /drivers/gpu/drm/amd | |
parent | 8120b61fdf3d3aa31d6b7e4a4f633bec1d2edd38 (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 4 |
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 | ||
976 | struct amdgpu_vm { | 976 | struct amdgpu_vm { |
@@ -1003,7 +1003,7 @@ struct amdgpu_vm { | |||
1003 | }; | 1003 | }; |
1004 | 1004 | ||
1005 | struct amdgpu_vm_manager { | 1005 | struct 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, | |||
135 | int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | 135 | int 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 | } |