diff options
author | Flora Cui <Flora.Cui@amd.com> | 2016-02-25 21:45:25 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-05-04 20:27:39 -0400 |
commit | c5a93a282f09a79d86f4299c03fdf032abec7252 (patch) | |
tree | 95930866069b1bd47d378d89a1a11341f82dafad /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | f4bfffddd705bc57f92bdd6c96dd04dbe16a90a8 (diff) |
drm/amdgpu: ungate SMC clockgating first before suspend
46c34bcb6a15dd85329a39a5e72c62108626acdc put all block’s clockgating
support in SMC. The sequence in suspend routine should be adjusted
accordingly, otherwise it causes asic hang.
Signed-off-by: Flora Cui <Flora.Cui@amd.com>
Reviewed-by: Eric Huang <JinHuiEric.Huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 077d4cc51a8c..ebcb0835d52a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1336,14 +1336,23 @@ static int amdgpu_suspend(struct amdgpu_device *adev) | |||
1336 | { | 1336 | { |
1337 | int i, r; | 1337 | int i, r; |
1338 | 1338 | ||
1339 | /* ungate SMC block first */ | ||
1340 | r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC, | ||
1341 | AMD_CG_STATE_UNGATE); | ||
1342 | if (r) { | ||
1343 | DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r); | ||
1344 | } | ||
1345 | |||
1339 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1346 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1340 | if (!adev->ip_block_status[i].valid) | 1347 | if (!adev->ip_block_status[i].valid) |
1341 | continue; | 1348 | continue; |
1342 | /* ungate blocks so that suspend can properly shut them down */ | 1349 | /* ungate blocks so that suspend can properly shut them down */ |
1343 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, | 1350 | if (i != AMD_IP_BLOCK_TYPE_SMC) { |
1344 | AMD_CG_STATE_UNGATE); | 1351 | r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, |
1345 | if (r) { | 1352 | AMD_CG_STATE_UNGATE); |
1346 | DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r); | 1353 | if (r) { |
1354 | DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r); | ||
1355 | } | ||
1347 | } | 1356 | } |
1348 | /* XXX handle errors */ | 1357 | /* XXX handle errors */ |
1349 | r = adev->ip_blocks[i].funcs->suspend(adev); | 1358 | r = adev->ip_blocks[i].funcs->suspend(adev); |