diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index 8c1fa985c7d4..60a22d8da7f0 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -2170,6 +2170,12 @@ static int vega20_force_dpm_highest(struct pp_hwmgr *hwmgr) | |||
2170 | data->dpm_table.mem_table.dpm_state.soft_max_level = | 2170 | data->dpm_table.mem_table.dpm_state.soft_max_level = |
2171 | data->dpm_table.mem_table.dpm_levels[soft_level].value; | 2171 | data->dpm_table.mem_table.dpm_levels[soft_level].value; |
2172 | 2172 | ||
2173 | soft_level = vega20_find_highest_dpm_level(&(data->dpm_table.soc_table)); | ||
2174 | |||
2175 | data->dpm_table.soc_table.dpm_state.soft_min_level = | ||
2176 | data->dpm_table.soc_table.dpm_state.soft_max_level = | ||
2177 | data->dpm_table.soc_table.dpm_levels[soft_level].value; | ||
2178 | |||
2173 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2179 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2174 | PP_ASSERT_WITH_CODE(!ret, | 2180 | PP_ASSERT_WITH_CODE(!ret, |
2175 | "Failed to upload boot level to highest!", | 2181 | "Failed to upload boot level to highest!", |
@@ -2202,6 +2208,12 @@ static int vega20_force_dpm_lowest(struct pp_hwmgr *hwmgr) | |||
2202 | data->dpm_table.mem_table.dpm_state.soft_max_level = | 2208 | data->dpm_table.mem_table.dpm_state.soft_max_level = |
2203 | data->dpm_table.mem_table.dpm_levels[soft_level].value; | 2209 | data->dpm_table.mem_table.dpm_levels[soft_level].value; |
2204 | 2210 | ||
2211 | soft_level = vega20_find_lowest_dpm_level(&(data->dpm_table.soc_table)); | ||
2212 | |||
2213 | data->dpm_table.soc_table.dpm_state.soft_min_level = | ||
2214 | data->dpm_table.soc_table.dpm_state.soft_max_level = | ||
2215 | data->dpm_table.soc_table.dpm_levels[soft_level].value; | ||
2216 | |||
2205 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2217 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2206 | PP_ASSERT_WITH_CODE(!ret, | 2218 | PP_ASSERT_WITH_CODE(!ret, |
2207 | "Failed to upload boot level to highest!", | 2219 | "Failed to upload boot level to highest!", |
@@ -2218,8 +2230,32 @@ static int vega20_force_dpm_lowest(struct pp_hwmgr *hwmgr) | |||
2218 | 2230 | ||
2219 | static int vega20_unforce_dpm_levels(struct pp_hwmgr *hwmgr) | 2231 | static int vega20_unforce_dpm_levels(struct pp_hwmgr *hwmgr) |
2220 | { | 2232 | { |
2233 | struct vega20_hwmgr *data = | ||
2234 | (struct vega20_hwmgr *)(hwmgr->backend); | ||
2235 | uint32_t soft_min_level, soft_max_level; | ||
2221 | int ret = 0; | 2236 | int ret = 0; |
2222 | 2237 | ||
2238 | soft_min_level = vega20_find_lowest_dpm_level(&(data->dpm_table.gfx_table)); | ||
2239 | soft_max_level = vega20_find_highest_dpm_level(&(data->dpm_table.gfx_table)); | ||
2240 | data->dpm_table.gfx_table.dpm_state.soft_min_level = | ||
2241 | data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; | ||
2242 | data->dpm_table.gfx_table.dpm_state.soft_max_level = | ||
2243 | data->dpm_table.gfx_table.dpm_levels[soft_max_level].value; | ||
2244 | |||
2245 | soft_min_level = vega20_find_lowest_dpm_level(&(data->dpm_table.mem_table)); | ||
2246 | soft_max_level = vega20_find_highest_dpm_level(&(data->dpm_table.mem_table)); | ||
2247 | data->dpm_table.mem_table.dpm_state.soft_min_level = | ||
2248 | data->dpm_table.mem_table.dpm_levels[soft_min_level].value; | ||
2249 | data->dpm_table.mem_table.dpm_state.soft_max_level = | ||
2250 | data->dpm_table.mem_table.dpm_levels[soft_max_level].value; | ||
2251 | |||
2252 | soft_min_level = vega20_find_lowest_dpm_level(&(data->dpm_table.soc_table)); | ||
2253 | soft_max_level = vega20_find_highest_dpm_level(&(data->dpm_table.soc_table)); | ||
2254 | data->dpm_table.soc_table.dpm_state.soft_min_level = | ||
2255 | data->dpm_table.soc_table.dpm_levels[soft_min_level].value; | ||
2256 | data->dpm_table.soc_table.dpm_state.soft_max_level = | ||
2257 | data->dpm_table.soc_table.dpm_levels[soft_max_level].value; | ||
2258 | |||
2223 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2259 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); |
2224 | PP_ASSERT_WITH_CODE(!ret, | 2260 | PP_ASSERT_WITH_CODE(!ret, |
2225 | "Failed to upload DPM Bootup Levels!", | 2261 | "Failed to upload DPM Bootup Levels!", |
@@ -2457,6 +2493,7 @@ static int vega20_dpm_force_dpm_level(struct pp_hwmgr *hwmgr, | |||
2457 | return ret; | 2493 | return ret; |
2458 | vega20_force_clock_level(hwmgr, PP_SCLK, 1 << sclk_mask); | 2494 | vega20_force_clock_level(hwmgr, PP_SCLK, 1 << sclk_mask); |
2459 | vega20_force_clock_level(hwmgr, PP_MCLK, 1 << mclk_mask); | 2495 | vega20_force_clock_level(hwmgr, PP_MCLK, 1 << mclk_mask); |
2496 | vega20_force_clock_level(hwmgr, PP_SOCCLK, 1 << soc_mask); | ||
2460 | break; | 2497 | break; |
2461 | 2498 | ||
2462 | case AMD_DPM_FORCED_LEVEL_MANUAL: | 2499 | case AMD_DPM_FORCED_LEVEL_MANUAL: |