diff options
author | Christian König <christian.koenig@amd.com> | 2018-08-21 05:11:36 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-08-27 16:10:07 -0400 |
commit | 7876fa4f55fda4a57348832f4a668279ed2b2fc4 (patch) | |
tree | 3a2c8d39c5a86fff4f5f71906b26c4aa69be7a6c /drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |
parent | 07e6d3f03b5ff7b93af37932ee0f4b775812274f (diff) |
drm/amdgpu: add ring soft recovery v4
Instead of hammering hard on the GPU try a soft recovery first.
v2: reorder code a bit
v3: increase timeout to 10ms, increment GPU reset counter
v4: squash in compile fix (Christian)
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 5dfd26be1eec..b70e85ec147d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |||
@@ -383,6 +383,31 @@ void amdgpu_ring_emit_reg_write_reg_wait_helper(struct amdgpu_ring *ring, | |||
383 | amdgpu_ring_emit_reg_wait(ring, reg1, mask, mask); | 383 | amdgpu_ring_emit_reg_wait(ring, reg1, mask, mask); |
384 | } | 384 | } |
385 | 385 | ||
386 | /** | ||
387 | * amdgpu_ring_soft_recovery - try to soft recover a ring lockup | ||
388 | * | ||
389 | * @ring: ring to try the recovery on | ||
390 | * @vmid: VMID we try to get going again | ||
391 | * @fence: timedout fence | ||
392 | * | ||
393 | * Tries to get a ring proceeding again when it is stuck. | ||
394 | */ | ||
395 | bool amdgpu_ring_soft_recovery(struct amdgpu_ring *ring, unsigned int vmid, | ||
396 | struct dma_fence *fence) | ||
397 | { | ||
398 | ktime_t deadline = ktime_add_us(ktime_get(), 10000); | ||
399 | |||
400 | if (!ring->funcs->soft_recovery) | ||
401 | return false; | ||
402 | |||
403 | atomic_inc(&ring->adev->gpu_reset_counter); | ||
404 | while (!dma_fence_is_signaled(fence) && | ||
405 | ktime_to_ns(ktime_sub(deadline, ktime_get())) > 0) | ||
406 | ring->funcs->soft_recovery(ring, vmid); | ||
407 | |||
408 | return dma_fence_is_signaled(fence); | ||
409 | } | ||
410 | |||
386 | /* | 411 | /* |
387 | * Debugfs info | 412 | * Debugfs info |
388 | */ | 413 | */ |