diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/tonga_ih.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 49 | 
1 files changed, 47 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c index c92055805a45..d127d59f953a 100644 --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c @@ -373,10 +373,10 @@ static int tonga_ih_wait_for_idle(void *handle)  	return -ETIMEDOUT;  } -static int tonga_ih_soft_reset(void *handle) +static int tonga_ih_check_soft_reset(void *handle)  { -	u32 srbm_soft_reset = 0;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	u32 srbm_soft_reset = 0;  	u32 tmp = RREG32(mmSRBM_STATUS);  	if (tmp & SRBM_STATUS__IH_BUSY_MASK) @@ -384,6 +384,48 @@ static int tonga_ih_soft_reset(void *handle)  						SOFT_RESET_IH, 1);  	if (srbm_soft_reset) { +		adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = true; +		adev->irq.srbm_soft_reset = srbm_soft_reset; +	} else { +		adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = false; +		adev->irq.srbm_soft_reset = 0; +	} + +	return 0; +} + +static int tonga_ih_pre_soft_reset(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang) +		return 0; + +	return tonga_ih_hw_fini(adev); +} + +static int tonga_ih_post_soft_reset(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang) +		return 0; + +	return tonga_ih_hw_init(adev); +} + +static int tonga_ih_soft_reset(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	u32 srbm_soft_reset; + +	if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang) +		return 0; +	srbm_soft_reset = adev->irq.srbm_soft_reset; + +	if (srbm_soft_reset) { +		u32 tmp; +  		tmp = RREG32(mmSRBM_SOFT_RESET);  		tmp |= srbm_soft_reset;  		dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); @@ -427,7 +469,10 @@ const struct amd_ip_funcs tonga_ih_ip_funcs = {  	.resume = tonga_ih_resume,  	.is_idle = tonga_ih_is_idle,  	.wait_for_idle = tonga_ih_wait_for_idle, +	.check_soft_reset = tonga_ih_check_soft_reset, +	.pre_soft_reset = tonga_ih_pre_soft_reset,  	.soft_reset = tonga_ih_soft_reset, +	.post_soft_reset = tonga_ih_post_soft_reset,  	.set_clockgating_state = tonga_ih_set_clockgating_state,  	.set_powergating_state = tonga_ih_set_powergating_state,  }; |