diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 35 |
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 | } |
173 | fail: | 183 | fail: |
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); |