diff options
author | Chengming Gui <Jack.Gui@amd.com> | 2019-01-17 22:27:25 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-03-19 16:04:00 -0400 |
commit | 9a431038e30a45c470c5f949824a76538809662d (patch) | |
tree | 362245c3d675cced1cb3b5cca0a05881ca9184f2 /drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |
parent | f277ff0feacc09c11b26654df9d2b8f1b339cbd8 (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.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; |