drm/amdgpu: recovery hw jobs when gpu reset V3
authorChunming Zhou <David1.Zhou@amd.com>
Thu, 30 Jun 2016 05:56:02 +0000 (13:56 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 7 Jul 2016 19:06:17 +0000 (15:06 -0400)
V3: directly use pd_addr.

Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index 21e02df63730651a88b4ff3a3fa33102f6e1bb24..5ec4ea060bd045b5264661cd71861c9a4ec8e239 100644 (file)
@@ -1946,6 +1946,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);
@@ -1990,8 +1991,9 @@ retry:
                        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]);
+                       kfree(ring_data[i]);
                        ring_sizes[i] = 0;
                        ring_data[i] = NULL;
                }
index 60fc9a508c0b926c4ab3822cbf3df6931f1218dd..2f8496d48c94d9d8a632795c7cca78b5517fd16d 100644 (file)
@@ -385,7 +385,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job)
            amdgpu_vm_ring_has_compute_vm_bug(ring)))
                amdgpu_ring_emit_pipeline_sync(ring);
 
-       if (ring->funcs->emit_vm_flush && job->vm_needs_flush) {
+       if (ring->funcs->emit_vm_flush && (job->vm_needs_flush ||
+           amdgpu_vm_is_gpu_reset(adev, id))) {
                struct fence *fence;
 
                trace_amdgpu_vm_flush(job->vm_pd_addr, ring->idx, job->vm_id);