Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Fix DC mode screen flickering on DCN321

[Why && How]
Screen flickering saw on 4K@60 eDP with high refresh rate external
monitor when booting up in DC mode. DC Mode Capping is disabled
which caused wrong UCLK being used.

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Leo Ma <hanghong.ma@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Leo Ma and committed by
Alex Deucher
ce649bd2 0e62103b

+12 -3
+12 -3
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
··· 712 712 * since we calculate mode support based on softmax being the max UCLK 713 713 * frequency. 714 714 */ 715 - dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, 716 - dc->clk_mgr->bw_params->dc_mode_softmax_memclk); 715 + if (dc->debug.disable_dc_mode_overwrite) { 716 + dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz); 717 + dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz); 718 + } else 719 + dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, 720 + dc->clk_mgr->bw_params->dc_mode_softmax_memclk); 717 721 } else { 718 722 dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz); 719 723 } ··· 750 746 /* set UCLK to requested value if P-State switching is supported, or to re-enable P-State switching */ 751 747 if (clk_mgr_base->clks.p_state_change_support && 752 748 (update_uclk || !clk_mgr_base->clks.prev_p_state_change_support) && 753 - !dc->work_arounds.clock_update_disable_mask.uclk) 749 + !dc->work_arounds.clock_update_disable_mask.uclk) { 750 + if (dc->clk_mgr->dc_mode_softmax_enabled && dc->debug.disable_dc_mode_overwrite) 751 + dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK, 752 + max((int)dc->clk_mgr->bw_params->dc_mode_softmax_memclk, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz))); 753 + 754 754 dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz)); 755 + } 755 756 756 757 if (clk_mgr_base->clks.num_ways != new_clocks->num_ways && 757 758 clk_mgr_base->clks.num_ways > new_clocks->num_ways) {