Commit 8362061e authored by Chris Park's avatar Chris Park Committed by Alex Deucher

drm/amd/display: Prevent overflow on DTO calculation

[Why]
uint32_t is implicitly converted to uint64_t while multiplication
still happens on uint32_t side.  This creates digit overflow
for large pixel clock which is meant to be retained in uint64_t.

[How]
Calculate multiplication of units in uint64_t domain instead of
uint32_t in DTO parameter clock caculation.
Reviewed-by: default avatarAlvin Lee <alvin.lee2@amd.com>
Acked-by: default avatarZaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: default avatarChris Park <chris.park@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ed79ab5a
...@@ -1088,11 +1088,15 @@ static bool dcn401_program_pix_clk( ...@@ -1088,11 +1088,15 @@ static bool dcn401_program_pix_clk(
dto_params.clk_src = DPREFCLK; dto_params.clk_src = DPREFCLK;
if (e) { if (e) {
dto_params.pixclk_hz = e->target_pixel_rate_khz * e->mult_factor; dto_params.pixclk_hz = e->target_pixel_rate_khz;
dto_params.refclk_hz = dtbclk_p_src_clk_khz * e->div_factor; dto_params.pixclk_hz *= e->mult_factor;
dto_params.refclk_hz = dtbclk_p_src_clk_khz;
dto_params.refclk_hz *= e->div_factor;
} else { } else {
dto_params.pixclk_hz = pix_clk_params->requested_pix_clk_100hz * 100; dto_params.pixclk_hz = pix_clk_params->requested_pix_clk_100hz;
dto_params.refclk_hz = dtbclk_p_src_clk_khz * 1000; dto_params.pixclk_hz *= 100;
dto_params.refclk_hz = dtbclk_p_src_clk_khz;
dto_params.refclk_hz *= 1000;
} }
/* enable DP DTO */ /* enable DP DTO */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment