diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2017-04-21 01:15:05 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 18:31:01 -0400 |
commit | 8f5508617b1356fafa8ba2960d7748ddbbc89964 (patch) | |
tree | 7c90275de1ae732eadb6e615f23f119590165784 | |
parent | 96cda84a6762a8caa9aee9381022e28adb3ea1ef (diff) |
drm/amd/powerplay: add function set_clock_limit for Rv.
Sets floors for various clocks depending on current
requirements.
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c | 58 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h | 6 |
2 files changed, 62 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c index 631ef82b5d7f..654dd43b8639 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c | |||
@@ -44,6 +44,8 @@ | |||
44 | 44 | ||
45 | 45 | ||
46 | static const unsigned long PhwRaven_Magic = (unsigned long) PHM_Cz_Magic; | 46 | static const unsigned long PhwRaven_Magic = (unsigned long) PHM_Cz_Magic; |
47 | int rv_display_clock_voltage_request(struct pp_hwmgr *hwmgr, | ||
48 | struct pp_display_clock_request *clock_req); | ||
47 | 49 | ||
48 | struct phm_vq_budgeting_record rv_vqtable[] = { | 50 | struct phm_vq_budgeting_record rv_vqtable[] = { |
49 | /* _TBD | 51 | /* _TBD |
@@ -232,9 +234,61 @@ static int rv_construct_boot_state(struct pp_hwmgr *hwmgr) | |||
232 | return 0; | 234 | return 0; |
233 | } | 235 | } |
234 | 236 | ||
235 | static int rv_tf_set_isp_clock_limit(struct pp_hwmgr *hwmgr, void *input, | 237 | static int rv_tf_set_clock_limit(struct pp_hwmgr *hwmgr, void *input, |
236 | void *output, void *storage, int result) | 238 | void *output, void *storage, int result) |
237 | { | 239 | { |
240 | struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend); | ||
241 | struct PP_Clocks clocks = {0}; | ||
242 | struct pp_display_clock_request clock_req; | ||
243 | |||
244 | clocks.dcefClock = hwmgr->display_config.min_dcef_set_clk; | ||
245 | clocks.dcefClockInSR = hwmgr->display_config.min_dcef_deep_sleep_set_clk; | ||
246 | clock_req.clock_type = amd_pp_dcf_clock; | ||
247 | clock_req.clock_freq_in_khz = clocks.dcefClock * 10; | ||
248 | |||
249 | if (clocks.dcefClock == 0 && clocks.dcefClockInSR == 0) | ||
250 | clock_req.clock_freq_in_khz = rv_data->dcf_actual_hard_min_freq; | ||
251 | |||
252 | PP_ASSERT_WITH_CODE(!rv_display_clock_voltage_request(hwmgr, &clock_req), | ||
253 | "Attempt to set DCF Clock Failed!", return -EINVAL); | ||
254 | |||
255 | if(rv_data->need_min_deep_sleep_dcefclk && 0 != clocks.dcefClockInSR) | ||
256 | smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
257 | PPSMC_MSG_SetMinDeepSleepDcefclk, | ||
258 | clocks.dcefClockInSR / 100); | ||
259 | /* | ||
260 | if(!rv_data->isp_tileA_power_gated || !rv_data->isp_tileB_power_gated) { | ||
261 | if ((hwmgr->ispArbiter.iclk != 0) && (rv_data->ISPActualHardMinFreq != (hwmgr->ispArbiter.iclk / 100) )) { | ||
262 | smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
263 | PPSMC_MSG_SetHardMinIspclkByFreq, hwmgr->ispArbiter.iclk / 100); | ||
264 | rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->ISPActualHardMinFreq), | ||
265 | } | ||
266 | } */ | ||
267 | |||
268 | if((hwmgr->gfx_arbiter.sclk_hard_min != 0) && | ||
269 | ((hwmgr->gfx_arbiter.sclk_hard_min / 100) != rv_data->soc_actual_hard_min_freq)) { | ||
270 | smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
271 | PPSMC_MSG_SetHardMinSocclkByFreq, | ||
272 | hwmgr->gfx_arbiter.sclk_hard_min / 100); | ||
273 | rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->soc_actual_hard_min_freq); | ||
274 | } | ||
275 | |||
276 | if ((hwmgr->gfx_arbiter.gfxclk != 0) && | ||
277 | (rv_data->gfx_actual_soft_min_freq != (hwmgr->gfx_arbiter.gfxclk))) { | ||
278 | smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
279 | PPSMC_MSG_SetMinVideoGfxclkFreq, | ||
280 | hwmgr->gfx_arbiter.gfxclk / 100); | ||
281 | rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->gfx_actual_soft_min_freq); | ||
282 | } | ||
283 | |||
284 | if ((hwmgr->gfx_arbiter.fclk != 0) && | ||
285 | (rv_data->fabric_actual_soft_min_freq != (hwmgr->gfx_arbiter.fclk / 100))) { | ||
286 | smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, | ||
287 | PPSMC_MSG_SetMinVideoFclkFreq, | ||
288 | hwmgr->gfx_arbiter.fclk / 100); | ||
289 | rv_read_arg_from_smc(hwmgr->smumgr, &rv_data->fabric_actual_soft_min_freq); | ||
290 | } | ||
291 | |||
238 | return 0; | 292 | return 0; |
239 | } | 293 | } |
240 | 294 | ||
@@ -254,7 +308,7 @@ static int rv_tf_set_num_active_display(struct pp_hwmgr *hwmgr, void *input, | |||
254 | } | 308 | } |
255 | 309 | ||
256 | static const struct phm_master_table_item rv_set_power_state_list[] = { | 310 | static const struct phm_master_table_item rv_set_power_state_list[] = { |
257 | { NULL, rv_tf_set_isp_clock_limit }, | 311 | { NULL, rv_tf_set_clock_limit }, |
258 | { NULL, rv_tf_set_num_active_display }, | 312 | { NULL, rv_tf_set_num_active_display }, |
259 | { } | 313 | { } |
260 | }; | 314 | }; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h index 673369131e08..afb852295a15 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h | |||
@@ -276,6 +276,11 @@ struct rv_hwmgr { | |||
276 | bool isp_tileB_power_gated; | 276 | bool isp_tileB_power_gated; |
277 | uint32_t isp_actual_hard_min_freq; | 277 | uint32_t isp_actual_hard_min_freq; |
278 | uint32_t soc_actual_hard_min_freq; | 278 | uint32_t soc_actual_hard_min_freq; |
279 | uint32_t dcf_actual_hard_min_freq; | ||
280 | |||
281 | uint32_t f_actual_hard_min_freq; | ||
282 | uint32_t fabric_actual_soft_min_freq; | ||
283 | uint32_t gfx_actual_soft_min_freq; | ||
279 | 284 | ||
280 | bool vcn_power_gated; | 285 | bool vcn_power_gated; |
281 | bool vcn_dpg_mode; | 286 | bool vcn_dpg_mode; |
@@ -286,6 +291,7 @@ struct rv_hwmgr { | |||
286 | DpmClocks_t clock_table; | 291 | DpmClocks_t clock_table; |
287 | 292 | ||
288 | uint32_t active_process_mask; | 293 | uint32_t active_process_mask; |
294 | bool need_min_deep_sleep_dcefclk; /* disabled by default */ | ||
289 | }; | 295 | }; |
290 | 296 | ||
291 | struct pp_hwmgr; | 297 | struct pp_hwmgr; |