drm/amdgpu: when suspend, set boot state instand of disable dpm.
authorRex Zhu <Rex.Zhu@amd.com>
Mon, 3 Oct 2016 12:46:36 +0000 (20:46 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Oct 2016 19:18:19 +0000 (15:18 -0400)
fix pm-hibernate bug, when suspend/resume, dpm start failed.

Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
drivers/gpu/drm/amd/amdgpu/ci_dpm.c

index e5e0a9a..bd85e35 100644 (file)
@@ -404,6 +404,8 @@ struct amdgpu_dpm {
        enum amd_vce_level vce_level;
        enum amd_pm_state_type state;
        enum amd_pm_state_type user_state;
+       enum amd_pm_state_type last_state;
+       enum amd_pm_state_type last_user_state;
        u32                     platform_caps;
        u32                     voltage_response_time;
        u32                     backbias_response_time;
index 6ecfc48..1c3b5c4 100644 (file)
@@ -6345,12 +6345,19 @@ static int ci_dpm_suspend(void *handle)
 
        if (adev->pm.dpm_enabled) {
                mutex_lock(&adev->pm.mutex);
-               /* disable dpm */
-               ci_dpm_disable(adev);
-               /* reset the power state */
-               adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps;
+               amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq,
+                              AMDGPU_THERMAL_IRQ_LOW_TO_HIGH);
+               amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq,
+                              AMDGPU_THERMAL_IRQ_HIGH_TO_LOW);
+               adev->pm.dpm.last_user_state = adev->pm.dpm.user_state;
+               adev->pm.dpm.last_state = adev->pm.dpm.state;
+               adev->pm.dpm.user_state = POWER_STATE_TYPE_INTERNAL_BOOT;
+               adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_BOOT;
                mutex_unlock(&adev->pm.mutex);
+               amdgpu_pm_compute_clocks(adev);
+
        }
+
        return 0;
 }
 
@@ -6368,6 +6375,8 @@ static int ci_dpm_resume(void *handle)
                        adev->pm.dpm_enabled = false;
                else
                        adev->pm.dpm_enabled = true;
+               adev->pm.dpm.user_state = adev->pm.dpm.last_user_state;
+               adev->pm.dpm.state = adev->pm.dpm.last_state;
                mutex_unlock(&adev->pm.mutex);
                if (adev->pm.dpm_enabled)
                        amdgpu_pm_compute_clocks(adev);