aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
diff options
context:
space:
mode:
authorChengming Gui <Jack.Gui@amd.com>2019-01-17 22:27:25 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-03-19 16:04:00 -0400
commit9a431038e30a45c470c5f949824a76538809662d (patch)
tree362245c3d675cced1cb3b5cca0a05881ca9184f2 /drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
parentf277ff0feacc09c11b26654df9d2b8f1b339cbd8 (diff)
drm/amd/powerplay: implement power_dpm_force_performance_level for SMU11
add get_performance_level and force_performance_level to implement the sys interface for SMU11. Signed-off-by: Chengming Gui <Jack.Gui@amd.com> Reviewed-by: Huang Rui <ray.huang@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c23
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;