aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index 7056925eb386..5448cf27654e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -216,8 +216,10 @@ static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring)
216 * Checks the current fence value and calculates the last 216 * Checks the current fence value and calculates the last
217 * signalled fence value. Wakes the fence queue if the 217 * signalled fence value. Wakes the fence queue if the
218 * sequence number has increased. 218 * sequence number has increased.
219 *
220 * Returns true if fence was processed
219 */ 221 */
220void amdgpu_fence_process(struct amdgpu_ring *ring) 222bool amdgpu_fence_process(struct amdgpu_ring *ring)
221{ 223{
222 struct amdgpu_fence_driver *drv = &ring->fence_drv; 224 struct amdgpu_fence_driver *drv = &ring->fence_drv;
223 uint32_t seq, last_seq; 225 uint32_t seq, last_seq;
@@ -229,11 +231,12 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
229 231
230 } while (atomic_cmpxchg(&drv->last_seq, last_seq, seq) != last_seq); 232 } while (atomic_cmpxchg(&drv->last_seq, last_seq, seq) != last_seq);
231 233
232 if (seq != ring->fence_drv.sync_seq) 234 if (del_timer(&ring->fence_drv.fallback_timer) &&
235 seq != ring->fence_drv.sync_seq)
233 amdgpu_fence_schedule_fallback(ring); 236 amdgpu_fence_schedule_fallback(ring);
234 237
235 if (unlikely(seq == last_seq)) 238 if (unlikely(seq == last_seq))
236 return; 239 return false;
237 240
238 last_seq &= drv->num_fences_mask; 241 last_seq &= drv->num_fences_mask;
239 seq &= drv->num_fences_mask; 242 seq &= drv->num_fences_mask;
@@ -260,6 +263,8 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
260 263
261 dma_fence_put(fence); 264 dma_fence_put(fence);
262 } while (last_seq != seq); 265 } while (last_seq != seq);
266
267 return true;
263} 268}
264 269
265/** 270/**
@@ -274,7 +279,8 @@ static void amdgpu_fence_fallback(struct timer_list *t)
274 struct amdgpu_ring *ring = from_timer(ring, t, 279 struct amdgpu_ring *ring = from_timer(ring, t,
275 fence_drv.fallback_timer); 280 fence_drv.fallback_timer);
276 281
277 amdgpu_fence_process(ring); 282 if (amdgpu_fence_process(ring))
283 DRM_WARN("Fence fallback timer expired on ring %s\n", ring->name);
278} 284}
279 285
280/** 286/**
@@ -701,7 +707,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
701 struct amdgpu_device *adev = dev->dev_private; 707 struct amdgpu_device *adev = dev->dev_private;
702 708
703 seq_printf(m, "gpu recover\n"); 709 seq_printf(m, "gpu recover\n");
704 amdgpu_device_gpu_recover(adev, NULL, true); 710 amdgpu_device_gpu_recover(adev, NULL);
705 711
706 return 0; 712 return 0;
707} 713}