[PATCH 05/10] drm/amdgpu: reset hw jobs when gpu reset
Chunming Zhou
David1.Zhou at amd.com
Thu Jun 30 07:09:02 UTC 2016
Change-Id: If673e1708b6207d70a26f64067dc1b0b24e868e7
Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 47 +++++++++++++-----------------
1 file changed, 20 insertions(+), 27 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 5c4691c..60b6dd0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1951,8 +1951,10 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
continue;
kthread_park(ring->sched.thread);
+ amd_sched_hw_job_reset(&ring->sched);
}
-
+ /* after all hw jobs are reset, hw fence is meanless, so force_completion */
+ amdgpu_fence_driver_force_completion(adev);
/* block TTM */
resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
/* store modesetting */
@@ -1994,33 +1996,24 @@ retry:
}
/* restore scratch */
amdgpu_atombios_scratch_regs_restore(adev);
- if (0) {
- for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
- struct amdgpu_ring *ring = adev->rings[i];
- if (!ring)
- continue;
- kthread_unpark(ring->sched.thread);
- amdgpu_ring_restore(ring, ring_sizes[i], ring_data[i]);
- ring_sizes[i] = 0;
- ring_data[i] = NULL;
- }
- r = amdgpu_ib_ring_tests(adev);
- if (r) {
- dev_err(adev->dev, "ib ring test failed (%d).\n", r);
- if (saved) {
- saved = false;
- r = amdgpu_suspend(adev);
- goto retry;
- }
- }
- } else {
- amdgpu_fence_driver_force_completion(adev);
- for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
- if (adev->rings[i]) {
- kthread_unpark(adev->rings[i]->sched.thread);
- kfree(ring_data[i]);
- }
+ for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
+ struct amdgpu_ring *ring = adev->rings[i];
+ if (!ring)
+ continue;
+ amdgpu_ring_restore(ring, ring_sizes[i], ring_data[i]);
+ kthread_unpark(ring->sched.thread);
+ ring_sizes[i] = 0;
+ ring_data[i] = NULL;
+ }
+
+ r = amdgpu_ib_ring_tests(adev);
+ if (r) {
+ dev_err(adev->dev, "ib ring test failed (%d).\n", r);
+ if (saved) {
+ saved = false;
+ r = amdgpu_suspend(adev);
+ goto retry;
}
}
--
1.9.1
More information about the amd-gfx
mailing list