drm/amdgpu: implement vi ih check/pre/post_soft_reset
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>
This commit is contained in:
parent
50b0197abf
commit
1015a1b175
|
@ -1976,7 +1976,6 @@ int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
|
|||
static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang ||
|
||||
adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang ||
|
||||
|
|
|
@ -70,6 +70,7 @@ struct amdgpu_irq {
|
|||
/* gen irq stuff */
|
||||
struct irq_domain *domain; /* GPU irq controller domain */
|
||||
unsigned virq[AMDGPU_MAX_IRQ_SRC_ID];
|
||||
uint32_t srbm_soft_reset;
|
||||
};
|
||||
|
||||
void amdgpu_irq_preinstall(struct drm_device *dev);
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue