]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drm/amdgpu: clean up ring_backup code, no need more
[karo-tx-linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_device.c
index 21e02df63730651a88b4ff3a3fa33102f6e1bb24..29d0055fe50d0005025a836a4d5805b99d37d458 100644 (file)
@@ -1926,11 +1926,6 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
  */
 int amdgpu_gpu_reset(struct amdgpu_device *adev)
 {
-       unsigned ring_sizes[AMDGPU_MAX_RINGS];
-       uint32_t *ring_data[AMDGPU_MAX_RINGS];
-
-       bool saved = false;
-
        int i, r;
        int resched;
 
@@ -1946,6 +1941,7 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
                if (!ring)
                        continue;
                kthread_park(ring->sched.thread);
+               amd_sched_hw_job_reset(&ring->sched);
        }
        /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
        amdgpu_fence_driver_force_completion(adev);
@@ -1954,19 +1950,6 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
        amdgpu_atombios_scratch_regs_save(adev);
        r = amdgpu_suspend(adev);
 
-       for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
-               struct amdgpu_ring *ring = adev->rings[i];
-               if (!ring)
-                       continue;
-
-               ring_sizes[i] = amdgpu_ring_backup(ring, &ring_data[i]);
-               if (ring_sizes[i]) {
-                       saved = true;
-                       dev_info(adev->dev, "Saved %d dwords of commands "
-                                "on ring %d.\n", ring_sizes[i], i);
-               }
-       }
-
 retry:
        /* Disable fb access */
        if (adev->mode_info.num_crtc) {
@@ -1986,31 +1969,25 @@ retry:
        /* restore scratch */
        amdgpu_atombios_scratch_regs_restore(adev);
        if (!r) {
+               r = amdgpu_ib_ring_tests(adev);
+               if (r) {
+                       dev_err(adev->dev, "ib ring test failed (%d).\n", r);
+                       r = amdgpu_suspend(adev);
+                       goto retry;
+               }
+
                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
                        struct amdgpu_ring *ring = adev->rings[i];
                        if (!ring)
                                continue;
+                       amd_sched_job_recovery(&ring->sched);
                        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 {
                dev_err(adev->dev, "asic resume failed (%d).\n", r);
                for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
                        if (adev->rings[i]) {
                                kthread_unpark(adev->rings[i]->sched.thread);
-                               kfree(ring_data[i]);
                        }
                }
        }