diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2016-12-23 02:24:37 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-01-27 11:12:57 -0500 |
commit | 3bd58979648fd105258934fb9f0fea1d73341d08 (patch) | |
tree | c66bbd3e2ae6e137c998d4c8bff55b864b808850 /drivers | |
parent | 9d273495e691f9473db6b2ae2da41515d53a70e9 (diff) |
drm/amd/powerplay: add profiling mode in dpm level
In some case, App need to run under max stable clock.
so export profiling mode: GFX CG was disabled.
and user can select the max stable clock of the device.
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')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/ci_dpm.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/amd_shared.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 3 |
5 files changed, 24 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index ccf50b8b854b..0345fbbfff4e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -124,6 +124,7 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, | |||
124 | (level & AMD_DPM_FORCED_LEVEL_LOW) ? "low" : | 124 | (level & AMD_DPM_FORCED_LEVEL_LOW) ? "low" : |
125 | (level & AMD_DPM_FORCED_LEVEL_HIGH) ? "high" : | 125 | (level & AMD_DPM_FORCED_LEVEL_HIGH) ? "high" : |
126 | (level & AMD_DPM_FORCED_LEVEL_MANUAL) ? "manual" : | 126 | (level & AMD_DPM_FORCED_LEVEL_MANUAL) ? "manual" : |
127 | (level & AMD_DPM_FORCED_LEVEL_PROFILING) ? "profiling" : | ||
127 | "unknown")); | 128 | "unknown")); |
128 | } | 129 | } |
129 | 130 | ||
@@ -135,6 +136,7 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
135 | struct drm_device *ddev = dev_get_drvdata(dev); | 136 | struct drm_device *ddev = dev_get_drvdata(dev); |
136 | struct amdgpu_device *adev = ddev->dev_private; | 137 | struct amdgpu_device *adev = ddev->dev_private; |
137 | enum amd_dpm_forced_level level; | 138 | enum amd_dpm_forced_level level; |
139 | enum amd_dpm_forced_level current_level; | ||
138 | int ret = 0; | 140 | int ret = 0; |
139 | 141 | ||
140 | /* Can't force performance level when the card is off */ | 142 | /* Can't force performance level when the card is off */ |
@@ -142,6 +144,8 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
142 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | 144 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
143 | return -EINVAL; | 145 | return -EINVAL; |
144 | 146 | ||
147 | current_level = amdgpu_dpm_get_performance_level(adev); | ||
148 | |||
145 | if (strncmp("low", buf, strlen("low")) == 0) { | 149 | if (strncmp("low", buf, strlen("low")) == 0) { |
146 | level = AMD_DPM_FORCED_LEVEL_LOW; | 150 | level = AMD_DPM_FORCED_LEVEL_LOW; |
147 | } else if (strncmp("high", buf, strlen("high")) == 0) { | 151 | } else if (strncmp("high", buf, strlen("high")) == 0) { |
@@ -150,11 +154,24 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, | |||
150 | level = AMD_DPM_FORCED_LEVEL_AUTO; | 154 | level = AMD_DPM_FORCED_LEVEL_AUTO; |
151 | } else if (strncmp("manual", buf, strlen("manual")) == 0) { | 155 | } else if (strncmp("manual", buf, strlen("manual")) == 0) { |
152 | level = AMD_DPM_FORCED_LEVEL_MANUAL; | 156 | level = AMD_DPM_FORCED_LEVEL_MANUAL; |
157 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { | ||
158 | level = AMD_DPM_FORCED_LEVEL_PROFILING; | ||
153 | } else { | 159 | } else { |
154 | count = -EINVAL; | 160 | count = -EINVAL; |
155 | goto fail; | 161 | goto fail; |
156 | } | 162 | } |
157 | 163 | ||
164 | if (current_level == level) | ||
165 | return 0; | ||
166 | |||
167 | if (level == AMD_DPM_FORCED_LEVEL_PROFILING) | ||
168 | amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, | ||
169 | AMD_CG_STATE_UNGATE); | ||
170 | else if (level != AMD_DPM_FORCED_LEVEL_PROFILING && | ||
171 | current_level == AMD_DPM_FORCED_LEVEL_PROFILING) | ||
172 | amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, | ||
173 | AMD_CG_STATE_GATE); | ||
174 | |||
158 | if (adev->pp_enabled) | 175 | if (adev->pp_enabled) |
159 | amdgpu_dpm_force_performance_level(adev, level); | 176 | amdgpu_dpm_force_performance_level(adev, level); |
160 | else { | 177 | else { |
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c index ab7d2bb71dad..9a544ad41f4c 100644 --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c | |||
@@ -6571,8 +6571,8 @@ static int ci_dpm_force_clock_level(struct amdgpu_device *adev, | |||
6571 | { | 6571 | { |
6572 | struct ci_power_info *pi = ci_get_pi(adev); | 6572 | struct ci_power_info *pi = ci_get_pi(adev); |
6573 | 6573 | ||
6574 | if (adev->pm.dpm.forced_level | 6574 | if (!(adev->pm.dpm.forced_level & |
6575 | != AMD_DPM_FORCED_LEVEL_MANUAL) | 6575 | (AMD_DPM_FORCED_LEVEL_MANUAL | AMD_DPM_FORCED_LEVEL_PROFILING))) |
6576 | return -EINVAL; | 6576 | return -EINVAL; |
6577 | 6577 | ||
6578 | switch (type) { | 6578 | switch (type) { |
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index c92532caa05d..92138a9f6f93 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h | |||
@@ -85,6 +85,7 @@ enum amd_dpm_forced_level { | |||
85 | AMD_DPM_FORCED_LEVEL_MANUAL = 0x2, | 85 | AMD_DPM_FORCED_LEVEL_MANUAL = 0x2, |
86 | AMD_DPM_FORCED_LEVEL_LOW = 0x4, | 86 | AMD_DPM_FORCED_LEVEL_LOW = 0x4, |
87 | AMD_DPM_FORCED_LEVEL_HIGH = 0x8, | 87 | AMD_DPM_FORCED_LEVEL_HIGH = 0x8, |
88 | AMD_DPM_FORCED_LEVEL_PROFILING = 0x10, | ||
88 | }; | 89 | }; |
89 | 90 | ||
90 | enum amd_powergating_state { | 91 | enum amd_powergating_state { |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c index 9bb94af731a9..f4ff236af96a 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c | |||
@@ -1644,7 +1644,8 @@ static int cz_get_dal_power_level(struct pp_hwmgr *hwmgr, | |||
1644 | static int cz_force_clock_level(struct pp_hwmgr *hwmgr, | 1644 | static int cz_force_clock_level(struct pp_hwmgr *hwmgr, |
1645 | enum pp_clock_type type, uint32_t mask) | 1645 | enum pp_clock_type type, uint32_t mask) |
1646 | { | 1646 | { |
1647 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) | 1647 | if (!(hwmgr->dpm_level & |
1648 | (AMD_DPM_FORCED_LEVEL_MANUAL | AMD_DPM_FORCED_LEVEL_PROFILING))) | ||
1648 | return -EINVAL; | 1649 | return -EINVAL; |
1649 | 1650 | ||
1650 | switch (type) { | 1651 | switch (type) { |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index 9232c118534a..8bd1e9669fd7 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -4031,7 +4031,8 @@ static int smu7_force_clock_level(struct pp_hwmgr *hwmgr, | |||
4031 | { | 4031 | { |
4032 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); | 4032 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); |
4033 | 4033 | ||
4034 | if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) | 4034 | if (!(hwmgr->dpm_level & |
4035 | (AMD_DPM_FORCED_LEVEL_MANUAL | AMD_DPM_FORCED_LEVEL_PROFILING))) | ||
4035 | return -EINVAL; | 4036 | return -EINVAL; |
4036 | 4037 | ||
4037 | switch (type) { | 4038 | switch (type) { |