mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
drm/amd/powerplay: fix possible hang with 3+ 4K monitors
If DAL requires to force MCLK high, the FCLK will be forced to high also. Signed-off-by: Evan Quan <evan.quan@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
aaaba51bf1
commit
db64a2f43c
1 changed files with 9 additions and 1 deletions
|
@ -3470,6 +3470,7 @@ static int vega20_apply_clocks_adjust_rules(struct pp_hwmgr *hwmgr)
|
||||||
struct vega20_single_dpm_table *dpm_table;
|
struct vega20_single_dpm_table *dpm_table;
|
||||||
bool vblank_too_short = false;
|
bool vblank_too_short = false;
|
||||||
bool disable_mclk_switching;
|
bool disable_mclk_switching;
|
||||||
|
bool disable_fclk_switching;
|
||||||
uint32_t i, latency;
|
uint32_t i, latency;
|
||||||
|
|
||||||
disable_mclk_switching = ((1 < hwmgr->display_config->num_display) &&
|
disable_mclk_switching = ((1 < hwmgr->display_config->num_display) &&
|
||||||
|
@ -3545,13 +3546,20 @@ static int vega20_apply_clocks_adjust_rules(struct pp_hwmgr *hwmgr)
|
||||||
if (hwmgr->display_config->nb_pstate_switch_disable)
|
if (hwmgr->display_config->nb_pstate_switch_disable)
|
||||||
dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
|
dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
|
||||||
|
|
||||||
|
if ((disable_mclk_switching &&
|
||||||
|
(dpm_table->dpm_state.hard_min_level == dpm_table->dpm_levels[dpm_table->count - 1].value)) ||
|
||||||
|
hwmgr->display_config->min_mem_set_clock / 100 >= dpm_table->dpm_levels[dpm_table->count - 1].value)
|
||||||
|
disable_fclk_switching = true;
|
||||||
|
else
|
||||||
|
disable_fclk_switching = false;
|
||||||
|
|
||||||
/* fclk */
|
/* fclk */
|
||||||
dpm_table = &(data->dpm_table.fclk_table);
|
dpm_table = &(data->dpm_table.fclk_table);
|
||||||
dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value;
|
dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[0].value;
|
||||||
dpm_table->dpm_state.soft_max_level = VG20_CLOCK_MAX_DEFAULT;
|
dpm_table->dpm_state.soft_max_level = VG20_CLOCK_MAX_DEFAULT;
|
||||||
dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value;
|
dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[0].value;
|
||||||
dpm_table->dpm_state.hard_max_level = VG20_CLOCK_MAX_DEFAULT;
|
dpm_table->dpm_state.hard_max_level = VG20_CLOCK_MAX_DEFAULT;
|
||||||
if (hwmgr->display_config->nb_pstate_switch_disable)
|
if (hwmgr->display_config->nb_pstate_switch_disable || disable_fclk_switching)
|
||||||
dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
|
dpm_table->dpm_state.soft_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
|
||||||
|
|
||||||
/* vclk */
|
/* vclk */
|
||||||
|
|
Loading…
Add table
Reference in a new issue