diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 694d85b0f0a0..77d946f8fca5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -264,7 +264,9 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, | |||
264 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | 264 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
265 | return snprintf(buf, PAGE_SIZE, "off\n"); | 265 | return snprintf(buf, PAGE_SIZE, "off\n"); |
266 | 266 | ||
267 | if (adev->powerplay.pp_funcs->get_performance_level) | 267 | if (is_support_sw_smu(adev)) |
268 | level = smu_get_performance_level(&adev->smu); | ||
269 | else if (adev->powerplay.pp_funcs->get_performance_level) | ||
268 | level = amdgpu_dpm_get_performance_level(adev); | 270 | level = amdgpu_dpm_get_performance_level(adev); |
269 | else | 271 | else |
270 | level = adev->pm.dpm.forced_level; | 272 | level = adev->pm.dpm.forced_level; |
@@ -297,7 +299,9 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
297 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | 299 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
298 | return -EINVAL; | 300 | return -EINVAL; |
299 | 301 | ||
300 | if (adev->powerplay.pp_funcs->get_performance_level) | 302 | if (is_support_sw_smu(adev)) |
303 | current_level = smu_get_performance_level(&adev->smu); | ||
304 | else if (adev->powerplay.pp_funcs->get_performance_level) | ||
301 | current_level = amdgpu_dpm_get_performance_level(adev); | 305 | current_level = amdgpu_dpm_get_performance_level(adev); |
302 | 306 | ||
303 | if (strncmp("low", buf, strlen("low")) == 0) { | 307 | if (strncmp("low", buf, strlen("low")) == 0) { |
@@ -326,7 +330,20 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
326 | if (current_level == level) | 330 | if (current_level == level) |
327 | return count; | 331 | return count; |
328 | 332 | ||
329 | if (adev->powerplay.pp_funcs->force_performance_level) { | 333 | if (is_support_sw_smu(adev)) { |
334 | mutex_lock(&adev->pm.mutex); | ||
335 | if (adev->pm.dpm.thermal_active) { | ||
336 | count = -EINVAL; | ||
337 | mutex_unlock(&adev->pm.mutex); | ||
338 | goto fail; | ||
339 | } | ||
340 | ret = smu_force_performance_level(&adev->smu, level); | ||
341 | if (ret) | ||
342 | count = -EINVAL; | ||
343 | else | ||
344 | adev->pm.dpm.forced_level = level; | ||
345 | mutex_unlock(&adev->pm.mutex); | ||
346 | } else if (adev->powerplay.pp_funcs->force_performance_level) { | ||
330 | mutex_lock(&adev->pm.mutex); | 347 | mutex_lock(&adev->pm.mutex); |
331 | if (adev->pm.dpm.thermal_active) { | 348 | if (adev->pm.dpm.thermal_active) { |
332 | count = -EINVAL; | 349 | count = -EINVAL; |