diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 068aeaff7183..4921de15b451 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | |||
@@ -65,8 +65,14 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, struct fence *f) | |||
65 | 65 | ||
66 | if (a_fence) | 66 | if (a_fence) |
67 | return a_fence->ring->adev == adev; | 67 | return a_fence->ring->adev == adev; |
68 | if (s_fence) | 68 | |
69 | return (struct amdgpu_device *)s_fence->scheduler->priv == adev; | 69 | if (s_fence) { |
70 | struct amdgpu_ring *ring; | ||
71 | |||
72 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
73 | return ring->adev == adev; | ||
74 | } | ||
75 | |||
70 | return false; | 76 | return false; |
71 | } | 77 | } |
72 | 78 | ||
@@ -251,6 +257,20 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync) | |||
251 | fence_put(e->fence); | 257 | fence_put(e->fence); |
252 | kfree(e); | 258 | kfree(e); |
253 | } | 259 | } |
260 | |||
261 | if (amdgpu_enable_semaphores) | ||
262 | return 0; | ||
263 | |||
264 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { | ||
265 | struct amdgpu_fence *fence = sync->sync_to[i]; | ||
266 | if (!fence) | ||
267 | continue; | ||
268 | |||
269 | r = fence_wait(&fence->base, false); | ||
270 | if (r) | ||
271 | return r; | ||
272 | } | ||
273 | |||
254 | return 0; | 274 | return 0; |
255 | } | 275 | } |
256 | 276 | ||
@@ -285,7 +305,8 @@ int amdgpu_sync_rings(struct amdgpu_sync *sync, | |||
285 | return -EINVAL; | 305 | return -EINVAL; |
286 | } | 306 | } |
287 | 307 | ||
288 | if (amdgpu_enable_scheduler || (count >= AMDGPU_NUM_SYNCS)) { | 308 | if (amdgpu_enable_scheduler || !amdgpu_enable_semaphores || |
309 | (count >= AMDGPU_NUM_SYNCS)) { | ||
289 | /* not enough room, wait manually */ | 310 | /* not enough room, wait manually */ |
290 | r = fence_wait(&fence->base, false); | 311 | r = fence_wait(&fence->base, false); |
291 | if (r) | 312 | if (r) |