Re-emit the unprocessed state after resetting the queue. Signed-off-by: Alex Deucher <alexander.deuc...@amd.com> --- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index d50e125fd3e0d..eb0fc48cd7677 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -7216,13 +7216,28 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring, } kiq->pmf->kiq_map_queues(kiq_ring, ring); amdgpu_ring_commit(kiq_ring); - spin_unlock_irqrestore(&kiq->ring_lock, flags); r = amdgpu_ring_test_ring(kiq_ring); + spin_unlock_irqrestore(&kiq->ring_lock, flags); if (r) { DRM_ERROR("fail to remap queue\n"); return r; } - return amdgpu_ring_test_ring(ring); + + if (amdgpu_ring_alloc(ring, 8)) + return -ENOMEM; + amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr, + ring->ring_backup_seq, 0); + amdgpu_ring_commit(ring); + r = amdgpu_ring_test_ring(ring); + if (r) + return r; + if (amdgpu_ring_alloc(ring, ring->ring_backup_entries_to_copy)) + return -ENOMEM; + for (i = 0; i < ring->ring_backup_entries_to_copy; i++) + amdgpu_ring_write(ring, ring->ring_backup[i]); + amdgpu_ring_commit(ring); + + return r; } static void gfx_v9_ip_print(struct amdgpu_ip_block *ip_block, struct drm_printer *p) -- 2.49.0