aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2017-04-21 01:15:05 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-05-24 18:31:01 -0400
commit8f5508617b1356fafa8ba2960d7748ddbbc89964 (patch)
tree7c90275de1ae732eadb6e615f23f119590165784
parent96cda84a6762a8caa9aee9381022e28adb3ea1ef (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.c58
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h6
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
46static const unsigned long PhwRaven_Magic = (unsigned long) PHM_Cz_Magic; 46static const unsigned long PhwRaven_Magic = (unsigned long) PHM_Cz_Magic;
47int rv_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
48 struct pp_display_clock_request *clock_req);
47 49
48struct phm_vq_budgeting_record rv_vqtable[] = { 50struct 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
235static int rv_tf_set_isp_clock_limit(struct pp_hwmgr *hwmgr, void *input, 237static 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
256static const struct phm_master_table_item rv_set_power_state_list[] = { 310static 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
291struct pp_hwmgr; 297struct pp_hwmgr;