diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2020-05-08 14:33:09 -0400 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2020-05-08 14:33:09 -0400 | 
| commit | 0da4a419a27a7b290b4923a7051fc6cfd92f2a0c (patch) | |
| tree | b8fffc1fdeee1eff005c98b35a3cd8d804588a1f | |
| parent | 77f3a5cd7023d946a7bbcbb4c88aa5d601d5eb9b (diff) | |
drm/amdgpu: implement soft_recovery for gfx10
Same as gfx9.  This allows us to kill the waves for hung
shaders.
Acked-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 14 | 
1 files changed, 14 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index 1532fca9076c..64080d209223 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -7686,6 +7686,19 @@ static void gfx_v10_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,  							   ref, mask);  } +static void gfx_v10_0_ring_soft_recovery(struct amdgpu_ring *ring, +					 unsigned vmid) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t value = 0; + +	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03); +	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); +	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); +	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); +	WREG32_SOC15(GC, 0, mmSQ_CMD, value); +} +  static void  gfx_v10_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,  				      uint32_t me, uint32_t pipe, @@ -8077,6 +8090,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {  	.emit_wreg = gfx_v10_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v10_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait, +	.soft_recovery = gfx_v10_0_ring_soft_recovery,  };  static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = { | 
