aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c27
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c2
3 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 5cbed256f006..c87dfdb8aedb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -990,6 +990,7 @@ struct amdgpu_device {
990 /* record last mm index being written through WREG32*/ 990 /* record last mm index being written through WREG32*/
991 unsigned long last_mm_index; 991 unsigned long last_mm_index;
992 bool in_gpu_reset; 992 bool in_gpu_reset;
993 enum pp_mp1_state mp1_state;
993 struct mutex lock_reset; 994 struct mutex lock_reset;
994 struct amdgpu_doorbell_index doorbell_index; 995 struct amdgpu_doorbell_index doorbell_index;
995 996
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 14a9169446f5..2081649f49ca 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2175,6 +2175,21 @@ static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)
2175 DRM_ERROR("suspend of IP block <%s> failed %d\n", 2175 DRM_ERROR("suspend of IP block <%s> failed %d\n",
2176 adev->ip_blocks[i].version->funcs->name, r); 2176 adev->ip_blocks[i].version->funcs->name, r);
2177 } 2177 }
2178 /* handle putting the SMC in the appropriate state */
2179 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
2180 if (is_support_sw_smu(adev)) {
2181 /* todo */
2182 } else if (adev->powerplay.pp_funcs &&
2183 adev->powerplay.pp_funcs->set_mp1_state) {
2184 r = adev->powerplay.pp_funcs->set_mp1_state(
2185 adev->powerplay.pp_handle,
2186 adev->mp1_state);
2187 if (r) {
2188 DRM_ERROR("SMC failed to set mp1 state %d, %d\n",
2189 adev->mp1_state, r);
2190 }
2191 }
2192 }
2178 } 2193 }
2179 2194
2180 return 0; 2195 return 0;
@@ -3640,6 +3655,17 @@ static bool amdgpu_device_lock_adev(struct amdgpu_device *adev, bool trylock)
3640 3655
3641 atomic_inc(&adev->gpu_reset_counter); 3656 atomic_inc(&adev->gpu_reset_counter);
3642 adev->in_gpu_reset = 1; 3657 adev->in_gpu_reset = 1;
3658 switch (amdgpu_asic_reset_method(adev)) {
3659 case AMD_RESET_METHOD_MODE1:
3660 adev->mp1_state = PP_MP1_STATE_SHUTDOWN;
3661 break;
3662 case AMD_RESET_METHOD_MODE2:
3663 adev->mp1_state = PP_MP1_STATE_RESET;
3664 break;
3665 default:
3666 adev->mp1_state = PP_MP1_STATE_NONE;
3667 break;
3668 }
3643 /* Block kfd: SRIOV would do it separately */ 3669 /* Block kfd: SRIOV would do it separately */
3644 if (!amdgpu_sriov_vf(adev)) 3670 if (!amdgpu_sriov_vf(adev))
3645 amdgpu_amdkfd_pre_reset(adev); 3671 amdgpu_amdkfd_pre_reset(adev);
@@ -3653,6 +3679,7 @@ static void amdgpu_device_unlock_adev(struct amdgpu_device *adev)
3653 if (!amdgpu_sriov_vf(adev)) 3679 if (!amdgpu_sriov_vf(adev))
3654 amdgpu_amdkfd_post_reset(adev); 3680 amdgpu_amdkfd_post_reset(adev);
3655 amdgpu_vf_error_trans_all(adev); 3681 amdgpu_vf_error_trans_all(adev);
3682 adev->mp1_state = PP_MP1_STATE_NONE;
3656 adev->in_gpu_reset = 0; 3683 adev->in_gpu_reset = 0;
3657 mutex_unlock(&adev->lock_reset); 3684 mutex_unlock(&adev->lock_reset);
3658} 3685}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 56f807757d2c..e3e09e6d7f42 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -1096,7 +1096,9 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
1096 * unfortunately we can't detect certain 1096 * unfortunately we can't detect certain
1097 * hypervisors so just do this all the time. 1097 * hypervisors so just do this all the time.
1098 */ 1098 */
1099 adev->mp1_state = PP_MP1_STATE_UNLOAD;
1099 amdgpu_device_ip_suspend(adev); 1100 amdgpu_device_ip_suspend(adev);
1101 adev->mp1_state = PP_MP1_STATE_NONE;
1100} 1102}
1101 1103
1102static int amdgpu_pmops_suspend(struct device *dev) 1104static int amdgpu_pmops_suspend(struct device *dev)