diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 16 |
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 | */ |
| 220 | void amdgpu_fence_process(struct amdgpu_ring *ring) | 222 | bool 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 | } |
