aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2016-10-13 16:07:03 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-10-14 11:51:04 -0400
commitda146d3b5262c1866c868b9dec1bd0f834d6ded6 (patch)
tree193192d0c84b24c26f9e01c510dc4e913a289428 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
parentaee3960a0ca34f8bf7dbcdb330c4f37a0f94dd8a (diff)
drm/amdgpu: fix amdgpu_need_full_reset (v2)
IP types are not an index. Each asic may have number and type of IPs. Properly check the the type rather than using the type id as an index. v2: fix all the IPs to not use IP type as an idx as well. Reviewed-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> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 15afe22ca890..fda0e57c5e0f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2075,7 +2075,8 @@ static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2075 if (!adev->ip_block_status[i].valid) 2075 if (!adev->ip_block_status[i].valid)
2076 continue; 2076 continue;
2077 if (adev->ip_blocks[i].funcs->check_soft_reset) 2077 if (adev->ip_blocks[i].funcs->check_soft_reset)
2078 adev->ip_blocks[i].funcs->check_soft_reset(adev); 2078 adev->ip_block_status[i].hang =
2079 adev->ip_blocks[i].funcs->check_soft_reset(adev);
2079 if (adev->ip_block_status[i].hang) { 2080 if (adev->ip_block_status[i].hang) {
2080 DRM_INFO("IP block:%d is hang!\n", i); 2081 DRM_INFO("IP block:%d is hang!\n", i);
2081 asic_hang = true; 2082 asic_hang = true;
@@ -2104,12 +2105,20 @@ static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
2104 2105
2105static bool amdgpu_need_full_reset(struct amdgpu_device *adev) 2106static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2106{ 2107{
2107 if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang || 2108 int i;
2108 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang || 2109
2109 adev->ip_block_status[AMD_IP_BLOCK_TYPE_ACP].hang || 2110 for (i = 0; i < adev->num_ip_blocks; i++) {
2110 adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang) { 2111 if (!adev->ip_block_status[i].valid)
2111 DRM_INFO("Some block need full reset!\n"); 2112 continue;
2112 return true; 2113 if ((adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) ||
2114 (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_SMC) ||
2115 (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_ACP) ||
2116 (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_DCE)) {
2117 if (adev->ip_block_status[i].hang) {
2118 DRM_INFO("Some block need full reset!\n");
2119 return true;
2120 }
2121 }
2113 } 2122 }
2114 return false; 2123 return false;
2115} 2124}