aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index d77b2bdbe800..ff9597ce268c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -113,6 +113,10 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev,
113 struct drm_device *ddev = dev_get_drvdata(dev); 113 struct drm_device *ddev = dev_get_drvdata(dev);
114 struct amdgpu_device *adev = ddev->dev_private; 114 struct amdgpu_device *adev = ddev->dev_private;
115 115
116 if ((adev->flags & AMD_IS_PX) &&
117 (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
118 return snprintf(buf, PAGE_SIZE, "off\n");
119
116 if (adev->pp_enabled) { 120 if (adev->pp_enabled) {
117 enum amd_dpm_forced_level level; 121 enum amd_dpm_forced_level level;
118 122
@@ -142,6 +146,11 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,
142 enum amdgpu_dpm_forced_level level; 146 enum amdgpu_dpm_forced_level level;
143 int ret = 0; 147 int ret = 0;
144 148
149 /* Can't force performance level when the card is off */
150 if ((adev->flags & AMD_IS_PX) &&
151 (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
152 return -EINVAL;
153
145 if (strncmp("low", buf, strlen("low")) == 0) { 154 if (strncmp("low", buf, strlen("low")) == 0) {
146 level = AMDGPU_DPM_FORCED_LEVEL_LOW; 155 level = AMDGPU_DPM_FORCED_LEVEL_LOW;
147 } else if (strncmp("high", buf, strlen("high")) == 0) { 156 } else if (strncmp("high", buf, strlen("high")) == 0) {
@@ -161,6 +170,7 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,
161 mutex_lock(&adev->pm.mutex); 170 mutex_lock(&adev->pm.mutex);
162 if (adev->pm.dpm.thermal_active) { 171 if (adev->pm.dpm.thermal_active) {
163 count = -EINVAL; 172 count = -EINVAL;
173 mutex_unlock(&adev->pm.mutex);
164 goto fail; 174 goto fail;
165 } 175 }
166 ret = amdgpu_dpm_force_performance_level(adev, level); 176 ret = amdgpu_dpm_force_performance_level(adev, level);
@@ -171,8 +181,6 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,
171 mutex_unlock(&adev->pm.mutex); 181 mutex_unlock(&adev->pm.mutex);
172 } 182 }
173fail: 183fail:
174 mutex_unlock(&adev->pm.mutex);
175
176 return count; 184 return count;
177} 185}
178 186
@@ -469,8 +477,14 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev,
469 char *buf) 477 char *buf)
470{ 478{
471 struct amdgpu_device *adev = dev_get_drvdata(dev); 479 struct amdgpu_device *adev = dev_get_drvdata(dev);
480 struct drm_device *ddev = adev->ddev;
472 int temp; 481 int temp;
473 482
483 /* Can't get temperature when the card is off */
484 if ((adev->flags & AMD_IS_PX) &&
485 (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
486 return -EINVAL;
487
474 if (!adev->pp_enabled && !adev->pm.funcs->get_temperature) 488 if (!adev->pp_enabled && !adev->pm.funcs->get_temperature)
475 temp = 0; 489 temp = 0;
476 else 490 else
@@ -919,11 +933,6 @@ force:
919 933
920 /* update display watermarks based on new power state */ 934 /* update display watermarks based on new power state */
921 amdgpu_display_bandwidth_update(adev); 935 amdgpu_display_bandwidth_update(adev);
922 /* update displays */
923 amdgpu_dpm_display_configuration_changed(adev);
924
925 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs;
926 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count;
927 936
928 /* wait for the rings to drain */ 937 /* wait for the rings to drain */
929 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 938 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
@@ -940,6 +949,12 @@ force:
940 949
941 amdgpu_dpm_post_set_power_state(adev); 950 amdgpu_dpm_post_set_power_state(adev);
942 951
952 /* update displays */
953 amdgpu_dpm_display_configuration_changed(adev);
954
955 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs;
956 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count;
957
943 if (adev->pm.funcs->force_performance_level) { 958 if (adev->pm.funcs->force_performance_level) {
944 if (adev->pm.dpm.thermal_active) { 959 if (adev->pm.dpm.thermal_active) {
945 enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; 960 enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level;
@@ -1174,12 +1189,16 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
1174 struct drm_info_node *node = (struct drm_info_node *) m->private; 1189 struct drm_info_node *node = (struct drm_info_node *) m->private;
1175 struct drm_device *dev = node->minor->dev; 1190 struct drm_device *dev = node->minor->dev;
1176 struct amdgpu_device *adev = dev->dev_private; 1191 struct amdgpu_device *adev = dev->dev_private;
1192 struct drm_device *ddev = adev->ddev;
1177 1193
1178 if (!adev->pm.dpm_enabled) { 1194 if (!adev->pm.dpm_enabled) {
1179 seq_printf(m, "dpm not enabled\n"); 1195 seq_printf(m, "dpm not enabled\n");
1180 return 0; 1196 return 0;
1181 } 1197 }
1182 if (adev->pp_enabled) { 1198 if ((adev->flags & AMD_IS_PX) &&
1199 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) {
1200 seq_printf(m, "PX asic powered off\n");
1201 } else if (adev->pp_enabled) {
1183 amdgpu_dpm_debugfs_print_current_performance_level(adev, m); 1202 amdgpu_dpm_debugfs_print_current_performance_level(adev, m);
1184 } else { 1203 } else {
1185 mutex_lock(&adev->pm.mutex); 1204 mutex_lock(&adev->pm.mutex);