diff options
| author | Rex Zhu <Rex.Zhu@amd.com> | 2017-01-06 00:32:49 -0500 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2017-01-27 11:13:14 -0500 |
| commit | 570272d2296ce42b7d0b4c5afa5b668100930507 (patch) | |
| tree | 127897c329a360f9d5392b3ec1b54e976237c8e6 /drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |
| parent | 7f61bed0c45df0b58af589b0569ce3349cbc53cb (diff) | |
drm/amdgpu: extend profiling mode.
in profiling mode, powerplay will fix power state
as stable as possible.and disable gfx cg and LBPW feature.
profile_standard: as a prerequisite, ensure power and thermal
sustainable, set clocks ratio as close to the highest clock
ratio as possible.
profile_min_sclk: fix mclk as profile_normal, set lowest sclk
profile_min_mclk: fix sclk as profile_normal, set lowest mclk
profile_peak: set highest sclk and mclk, power and thermal not
sustainable
profile_exit: exit profile mode. enable gfx cg/lbpw feature.
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-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 | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 9abd8f6705c0..f35893c19531 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
| @@ -142,12 +142,15 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, | |||
| 142 | 142 | ||
| 143 | level = amdgpu_dpm_get_performance_level(adev); | 143 | level = amdgpu_dpm_get_performance_level(adev); |
| 144 | return snprintf(buf, PAGE_SIZE, "%s\n", | 144 | return snprintf(buf, PAGE_SIZE, "%s\n", |
| 145 | (level & (AMD_DPM_FORCED_LEVEL_AUTO) ? "auto" : | 145 | (level == AMD_DPM_FORCED_LEVEL_AUTO) ? "auto" : |
| 146 | (level & AMD_DPM_FORCED_LEVEL_LOW) ? "low" : | 146 | (level == AMD_DPM_FORCED_LEVEL_LOW) ? "low" : |
| 147 | (level & AMD_DPM_FORCED_LEVEL_HIGH) ? "high" : | 147 | (level == AMD_DPM_FORCED_LEVEL_HIGH) ? "high" : |
| 148 | (level & AMD_DPM_FORCED_LEVEL_MANUAL) ? "manual" : | 148 | (level == AMD_DPM_FORCED_LEVEL_MANUAL) ? "manual" : |
| 149 | (level & AMD_DPM_FORCED_LEVEL_PROFILING) ? "profiling" : | 149 | (level == AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD) ? "profile_standard" : |
| 150 | "unknown")); | 150 | (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) ? "profile_min_sclk" : |
| 151 | (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) ? "profile_min_mclk" : | ||
| 152 | (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) ? "profile_peak" : | ||
| 153 | "unknown"); | ||
| 151 | } | 154 | } |
| 152 | 155 | ||
| 153 | static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | 156 | static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, |
| @@ -176,9 +179,17 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
| 176 | level = AMD_DPM_FORCED_LEVEL_AUTO; | 179 | level = AMD_DPM_FORCED_LEVEL_AUTO; |
| 177 | } else if (strncmp("manual", buf, strlen("manual")) == 0) { | 180 | } else if (strncmp("manual", buf, strlen("manual")) == 0) { |
| 178 | level = AMD_DPM_FORCED_LEVEL_MANUAL; | 181 | level = AMD_DPM_FORCED_LEVEL_MANUAL; |
| 179 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { | 182 | } else if (strncmp("profile_exit", buf, strlen("profile_exit")) == 0) { |
| 180 | level = AMD_DPM_FORCED_LEVEL_PROFILING; | 183 | level = AMD_DPM_FORCED_LEVEL_PROFILE_EXIT; |
| 181 | } else { | 184 | } else if (strncmp("profile_standard", buf, strlen("profile_standard")) == 0) { |
| 185 | level = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD; | ||
| 186 | } else if (strncmp("profile_min_sclk", buf, strlen("profile_min_sclk")) == 0) { | ||
| 187 | level = AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK; | ||
| 188 | } else if (strncmp("profile_min_mclk", buf, strlen("profile_min_mclk")) == 0) { | ||
| 189 | level = AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK; | ||
| 190 | } else if (strncmp("profile_peak", buf, strlen("profile_peak")) == 0) { | ||
| 191 | level = AMD_DPM_FORCED_LEVEL_PROFILE_PEAK; | ||
| 192 | } else { | ||
| 182 | count = -EINVAL; | 193 | count = -EINVAL; |
| 183 | goto fail; | 194 | goto fail; |
| 184 | } | 195 | } |
| @@ -186,14 +197,6 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
| 186 | if (current_level == level) | 197 | if (current_level == level) |
| 187 | return count; | 198 | return count; |
| 188 | 199 | ||
| 189 | if (level == AMD_DPM_FORCED_LEVEL_PROFILING) | ||
| 190 | amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, | ||
| 191 | AMD_CG_STATE_UNGATE); | ||
| 192 | else if (level != AMD_DPM_FORCED_LEVEL_PROFILING && | ||
| 193 | current_level == AMD_DPM_FORCED_LEVEL_PROFILING) | ||
| 194 | amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, | ||
| 195 | AMD_CG_STATE_GATE); | ||
| 196 | |||
| 197 | if (adev->pp_enabled) | 200 | if (adev->pp_enabled) |
| 198 | amdgpu_dpm_force_performance_level(adev, level); | 201 | amdgpu_dpm_force_performance_level(adev, level); |
| 199 | else { | 202 | else { |
| @@ -210,6 +213,7 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
| 210 | adev->pm.dpm.forced_level = level; | 213 | adev->pm.dpm.forced_level = level; |
| 211 | mutex_unlock(&adev->pm.mutex); | 214 | mutex_unlock(&adev->pm.mutex); |
| 212 | } | 215 | } |
| 216 | |||
| 213 | fail: | 217 | fail: |
| 214 | return count; | 218 | return count; |
| 215 | } | 219 | } |
