mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 19:26:01 -04:00
drm/amd/display: Cleanup outdated interfaces in dcn401_clk_mgr
[WHY&HOW] - Remove legacy update clocks sequence - FCLK P-State allow message is not required Reviewed-by: Alvin Lee <alvin.lee2@amd.com> Signed-off-by: Dillon Varone <dillon.varone@amd.com> Signed-off-by: Roman Li <roman.li@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
149bacfe9c
commit
f0aece43ee
@@ -628,207 +628,6 @@ static void dcn401_update_clocks_update_dentist(
|
||||
|
||||
}
|
||||
|
||||
static void dcn401_update_clocks_legacy(struct clk_mgr *clk_mgr_base,
|
||||
struct dc_state *context,
|
||||
bool safe_to_lower)
|
||||
{
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk;
|
||||
struct dc *dc = clk_mgr_base->ctx->dc;
|
||||
int display_count;
|
||||
bool update_dppclk = false;
|
||||
bool update_dispclk = false;
|
||||
bool enter_display_off = false;
|
||||
bool dpp_clock_lowered = false;
|
||||
struct dmcu *dmcu = clk_mgr_base->ctx->dc->res_pool->dmcu;
|
||||
bool force_reset = false;
|
||||
bool update_uclk = false, update_fclk = false;
|
||||
bool p_state_change_support;
|
||||
bool fclk_p_state_change_support;
|
||||
int total_plane_count;
|
||||
|
||||
if (dc->work_arounds.skip_clock_update)
|
||||
return;
|
||||
|
||||
if (clk_mgr_base->clks.dispclk_khz == 0 ||
|
||||
(dc->debug.force_clock_mode & 0x1)) {
|
||||
/* This is from resume or boot up, if forced_clock cfg option used,
|
||||
* we bypass program dispclk and DPPCLK, but need set them for S3.
|
||||
*/
|
||||
force_reset = true;
|
||||
|
||||
dcn2_read_clocks_from_hw_dentist(clk_mgr_base);
|
||||
|
||||
/* Force_clock_mode 0x1: force reset the clock even it is the same clock
|
||||
* as long as it is in Passive level.
|
||||
*/
|
||||
}
|
||||
display_count = clk_mgr_helper_get_active_display_cnt(dc, context);
|
||||
|
||||
if (display_count == 0)
|
||||
enter_display_off = true;
|
||||
|
||||
if (clk_mgr->smu_present) {
|
||||
if (enter_display_off == safe_to_lower)
|
||||
dcn401_smu_set_num_of_displays(clk_mgr, display_count);
|
||||
|
||||
clk_mgr_base->clks.fclk_prev_p_state_change_support = clk_mgr_base->clks.fclk_p_state_change_support;
|
||||
|
||||
total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context);
|
||||
fclk_p_state_change_support = new_clocks->fclk_p_state_change_support || (total_plane_count == 0);
|
||||
|
||||
if (should_update_pstate_support(safe_to_lower, fclk_p_state_change_support, clk_mgr_base->clks.fclk_p_state_change_support)) {
|
||||
clk_mgr_base->clks.fclk_p_state_change_support = fclk_p_state_change_support;
|
||||
|
||||
/* To enable FCLK P-state switching, send PSTATE_SUPPORTED message to PMFW */
|
||||
if (clk_mgr_base->clks.fclk_p_state_change_support) {
|
||||
/* Handle the code for sending a message to PMFW that FCLK P-state change is supported */
|
||||
dcn401_smu_send_fclk_pstate_message(clk_mgr, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (dc->debug.force_min_dcfclk_mhz > 0)
|
||||
new_clocks->dcfclk_khz = (new_clocks->dcfclk_khz > (dc->debug.force_min_dcfclk_mhz * 1000)) ?
|
||||
new_clocks->dcfclk_khz : (dc->debug.force_min_dcfclk_mhz * 1000);
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr_base->clks.dcfclk_khz)) {
|
||||
clk_mgr_base->clks.dcfclk_khz = new_clocks->dcfclk_khz;
|
||||
if (dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DCFCLK))
|
||||
dcn401_smu_set_hard_min_by_freq(clk_mgr, PPCLK_DCFCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_khz));
|
||||
}
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dcfclk_deep_sleep_khz, clk_mgr_base->clks.dcfclk_deep_sleep_khz)) {
|
||||
clk_mgr_base->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
|
||||
if (dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DCFCLK))
|
||||
dcn401_smu_set_min_deep_sleep_dcef_clk(clk_mgr, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_deep_sleep_khz));
|
||||
}
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->socclk_khz, clk_mgr_base->clks.socclk_khz))
|
||||
/* We don't actually care about socclk, don't notify SMU of hard min */
|
||||
clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;
|
||||
|
||||
clk_mgr_base->clks.prev_p_state_change_support = clk_mgr_base->clks.p_state_change_support;
|
||||
clk_mgr_base->clks.prev_num_ways = clk_mgr_base->clks.num_ways;
|
||||
|
||||
if (clk_mgr_base->clks.num_ways != new_clocks->num_ways &&
|
||||
clk_mgr_base->clks.num_ways < new_clocks->num_ways) {
|
||||
clk_mgr_base->clks.num_ways = new_clocks->num_ways;
|
||||
if (dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_UCLK))
|
||||
dcn401_smu_send_cab_for_uclk_message(clk_mgr, clk_mgr_base->clks.num_ways);
|
||||
}
|
||||
|
||||
|
||||
p_state_change_support = new_clocks->p_state_change_support || (total_plane_count == 0);
|
||||
if (should_update_pstate_support(safe_to_lower, p_state_change_support, clk_mgr_base->clks.prev_p_state_change_support)) {
|
||||
clk_mgr_base->clks.p_state_change_support = p_state_change_support;
|
||||
clk_mgr_base->clks.fw_based_mclk_switching = p_state_change_support && new_clocks->fw_based_mclk_switching;
|
||||
|
||||
/* to disable P-State switching, set UCLK min = max */
|
||||
if (!clk_mgr_base->clks.p_state_change_support && dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_UCLK))
|
||||
dcn401_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK,
|
||||
clk_mgr_base->bw_params->clk_table.entries[clk_mgr_base->bw_params->clk_table.num_entries_per_clk.num_memclk_levels - 1].memclk_mhz);
|
||||
}
|
||||
|
||||
/* Always update saved value, even if new value not set due to P-State switching unsupported. Also check safe_to_lower for FCLK */
|
||||
if (safe_to_lower && (clk_mgr_base->clks.fclk_p_state_change_support != clk_mgr_base->clks.fclk_prev_p_state_change_support)) {
|
||||
update_fclk = true;
|
||||
}
|
||||
|
||||
if (!clk_mgr_base->clks.fclk_p_state_change_support &&
|
||||
update_fclk &&
|
||||
dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_FCLK)) {
|
||||
/* Handle code for sending a message to PMFW that FCLK P-state change is not supported */
|
||||
dcn401_smu_send_fclk_pstate_message(clk_mgr, false);
|
||||
}
|
||||
|
||||
/* Always update saved value, even if new value not set due to P-State switching unsupported */
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dramclk_khz, clk_mgr_base->clks.dramclk_khz)) {
|
||||
clk_mgr_base->clks.dramclk_khz = new_clocks->dramclk_khz;
|
||||
update_uclk = true;
|
||||
}
|
||||
|
||||
/* set UCLK to requested value if P-State switching is supported, or to re-enable P-State switching */
|
||||
if (clk_mgr_base->clks.p_state_change_support &&
|
||||
(update_uclk || !clk_mgr_base->clks.prev_p_state_change_support) &&
|
||||
dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_UCLK))
|
||||
dcn401_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz));
|
||||
|
||||
if (clk_mgr_base->clks.num_ways != new_clocks->num_ways &&
|
||||
clk_mgr_base->clks.num_ways > new_clocks->num_ways) {
|
||||
clk_mgr_base->clks.num_ways = new_clocks->num_ways;
|
||||
if (dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_UCLK))
|
||||
dcn401_smu_send_cab_for_uclk_message(clk_mgr, clk_mgr_base->clks.num_ways);
|
||||
}
|
||||
}
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr_base->clks.dppclk_khz)) {
|
||||
if (clk_mgr_base->clks.dppclk_khz > new_clocks->dppclk_khz)
|
||||
dpp_clock_lowered = true;
|
||||
|
||||
clk_mgr_base->clks.dppclk_khz = new_clocks->dppclk_khz;
|
||||
clk_mgr_base->clks.actual_dppclk_khz = new_clocks->dppclk_khz;
|
||||
|
||||
if (clk_mgr->smu_present && !dpp_clock_lowered && dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DPPCLK))
|
||||
clk_mgr_base->clks.actual_dppclk_khz = dcn401_set_hard_min_by_freq_optimized(clk_mgr, PPCLK_DPPCLK, clk_mgr_base->clks.dppclk_khz);
|
||||
update_dppclk = true;
|
||||
}
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) {
|
||||
clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz;
|
||||
|
||||
if (clk_mgr->smu_present && dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DISPCLK))
|
||||
clk_mgr_base->clks.actual_dispclk_khz = dcn401_set_hard_min_by_freq_optimized(clk_mgr, PPCLK_DISPCLK, clk_mgr_base->clks.dispclk_khz);
|
||||
|
||||
update_dispclk = true;
|
||||
}
|
||||
|
||||
if (!new_clocks->dtbclk_en && dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DTBCLK)) {
|
||||
new_clocks->ref_dtbclk_khz = clk_mgr_base->bw_params->clk_table.entries[0].dtbclk_mhz * 1000;
|
||||
}
|
||||
|
||||
/* clock limits are received with MHz precision, divide by 1000 to prevent setting clocks at every call */
|
||||
if (!dc->debug.disable_dtb_ref_clk_switch &&
|
||||
should_set_clock(safe_to_lower, new_clocks->ref_dtbclk_khz / 1000, clk_mgr_base->clks.ref_dtbclk_khz / 1000) &&
|
||||
dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DTBCLK)) {
|
||||
/* DCCG requires KHz precision for DTBCLK */
|
||||
clk_mgr_base->clks.ref_dtbclk_khz =
|
||||
dcn401_smu_set_hard_min_by_freq(clk_mgr, PPCLK_DTBCLK, khz_to_mhz_ceil(new_clocks->ref_dtbclk_khz));
|
||||
|
||||
dcn401_update_clocks_update_dtb_dto(clk_mgr, context, clk_mgr_base->clks.ref_dtbclk_khz);
|
||||
}
|
||||
|
||||
if (dc->config.forced_clocks == false || (force_reset && safe_to_lower)) {
|
||||
if (dpp_clock_lowered) {
|
||||
/* if clock is being lowered, increase DTO before lowering refclk */
|
||||
dcn401_update_clocks_update_dpp_dto(clk_mgr, context,
|
||||
safe_to_lower, clk_mgr_base->clks.dppclk_khz);
|
||||
dcn401_update_clocks_update_dentist(clk_mgr, context);
|
||||
if (clk_mgr->smu_present && dcn401_is_ppclk_dpm_enabled(clk_mgr, PPCLK_DPPCLK)) {
|
||||
clk_mgr_base->clks.actual_dppclk_khz = dcn401_set_hard_min_by_freq_optimized(clk_mgr, PPCLK_DPPCLK,
|
||||
clk_mgr_base->clks.dppclk_khz);
|
||||
dcn401_update_clocks_update_dpp_dto(clk_mgr, context, safe_to_lower,
|
||||
clk_mgr_base->clks.actual_dppclk_khz);
|
||||
}
|
||||
|
||||
} else {
|
||||
/* if clock is being raised, increase refclk before lowering DTO */
|
||||
if (update_dppclk || update_dispclk)
|
||||
dcn401_update_clocks_update_dentist(clk_mgr, context);
|
||||
/* There is a check inside dcn20_update_clocks_update_dpp_dto which ensures
|
||||
* that we do not lower dto when it is not safe to lower. We do not need to
|
||||
* compare the current and new dppclk before calling this function.
|
||||
*/
|
||||
dcn401_update_clocks_update_dpp_dto(clk_mgr, context,
|
||||
safe_to_lower, clk_mgr_base->clks.actual_dppclk_khz);
|
||||
}
|
||||
}
|
||||
|
||||
if (update_dispclk && dmcu && dmcu->funcs->is_dmcu_initialized(dmcu))
|
||||
/*update dmcu for wait_loop count*/
|
||||
dmcu->funcs->set_psr_wait_loop(dmcu,
|
||||
clk_mgr_base->clks.dispclk_khz / 1000 / 7);
|
||||
}
|
||||
|
||||
static void dcn401_execute_block_sequence(struct clk_mgr *clk_mgr_base, unsigned int num_steps)
|
||||
{
|
||||
struct clk_mgr_internal *clk_mgr_internal = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
@@ -1008,15 +807,15 @@ static unsigned int dcn401_build_update_bandwidth_clocks_sequence(
|
||||
update_active_fclk = true;
|
||||
update_idle_fclk = true;
|
||||
|
||||
/* To enable FCLK P-state switching, send PSTATE_SUPPORTED message to PMFW */
|
||||
if (clk_mgr_base->clks.fclk_p_state_change_support) {
|
||||
/* Handle the code for sending a message to PMFW that FCLK P-state change is supported */
|
||||
if (dcn401_is_ppclk_dpm_enabled(clk_mgr_internal, PPCLK_FCLK)) {
|
||||
block_sequence[num_steps].params.update_pstate_support_params.support = true;
|
||||
block_sequence[num_steps].func = CLK_MGR401_UPDATE_FCLK_PSTATE_SUPPORT;
|
||||
num_steps++;
|
||||
}
|
||||
}
|
||||
/* To enable FCLK P-state switching, send PSTATE_SUPPORTED message to PMFW (message not supported on DCN401)*/
|
||||
// if (clk_mgr_base->clks.fclk_p_state_change_support) {
|
||||
// /* Handle the code for sending a message to PMFW that FCLK P-state change is supported */
|
||||
// if (dcn401_is_ppclk_dpm_enabled(clk_mgr_internal, PPCLK_FCLK)) {
|
||||
// block_sequence[num_steps].params.update_pstate_support_params.support = true;
|
||||
// block_sequence[num_steps].func = CLK_MGR401_UPDATE_FCLK_PSTATE_SUPPORT;
|
||||
// num_steps++;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
if (!clk_mgr_base->clks.fclk_p_state_change_support && dcn401_is_ppclk_dpm_enabled(clk_mgr_internal, PPCLK_FCLK)) {
|
||||
@@ -1224,14 +1023,14 @@ static unsigned int dcn401_build_update_bandwidth_clocks_sequence(
|
||||
// (*num_steps)++;
|
||||
// }
|
||||
|
||||
/* disable FCLK P-State support if needed */
|
||||
if (!fclk_p_state_change_support &&
|
||||
should_update_pstate_support(safe_to_lower, fclk_p_state_change_support, clk_mgr_base->clks.fclk_prev_p_state_change_support) &&
|
||||
dcn401_is_ppclk_dpm_enabled(clk_mgr_internal, PPCLK_FCLK)) {
|
||||
block_sequence[num_steps].params.update_pstate_support_params.support = false;
|
||||
block_sequence[num_steps].func = CLK_MGR401_UPDATE_FCLK_PSTATE_SUPPORT;
|
||||
num_steps++;
|
||||
}
|
||||
/* disable FCLK P-State support if needed (message not supported on DCN401)*/
|
||||
// if (!fclk_p_state_change_support &&
|
||||
// should_update_pstate_support(safe_to_lower, fclk_p_state_change_support, clk_mgr_base->clks.fclk_prev_p_state_change_support) &&
|
||||
// dcn401_is_ppclk_dpm_enabled(clk_mgr_internal, PPCLK_FCLK)) {
|
||||
// block_sequence[num_steps].params.update_pstate_support_params.support = false;
|
||||
// block_sequence[num_steps].func = CLK_MGR401_UPDATE_FCLK_PSTATE_SUPPORT;
|
||||
// num_steps++;
|
||||
// }
|
||||
}
|
||||
|
||||
if (new_clocks->fw_based_mclk_switching != clk_mgr_base->clks.fw_based_mclk_switching &&
|
||||
@@ -1412,11 +1211,6 @@ static void dcn401_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
|
||||
unsigned int num_steps = 0;
|
||||
|
||||
if (dc->debug.enable_legacy_clock_update) {
|
||||
dcn401_update_clocks_legacy(clk_mgr_base, context, safe_to_lower);
|
||||
return;
|
||||
}
|
||||
|
||||
/* build bandwidth related clocks update sequence */
|
||||
num_steps = dcn401_build_update_bandwidth_clocks_sequence(clk_mgr_base,
|
||||
context,
|
||||
|
||||
@@ -1060,7 +1060,6 @@ struct dc_debug_options {
|
||||
uint32_t dml21_disable_pstate_method_mask;
|
||||
union fw_assisted_mclk_switch_version fams_version;
|
||||
union dmub_fams2_global_feature_config fams2_config;
|
||||
bool enable_legacy_clock_update;
|
||||
unsigned int force_cositing;
|
||||
unsigned int disable_spl;
|
||||
unsigned int force_easf;
|
||||
|
||||
Reference in New Issue
Block a user