drm/amd/display: Prevent overflow on DTO calculation
authorChris Park <chris.park@amd.com>
Tue, 28 May 2024 01:21:30 +0000 (21:21 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Jun 2024 20:17:15 +0000 (16:17 -0400)
[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: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: Chris Park <chris.park@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c

index 63deb5b..042a418 100644 (file)
@@ -1088,11 +1088,15 @@ static bool dcn401_program_pix_clk(
                dto_params.clk_src = DPREFCLK;
 
                if (e) {
-                       dto_params.pixclk_hz = e->target_pixel_rate_khz * e->mult_factor;
-                       dto_params.refclk_hz = dtbclk_p_src_clk_khz * e->div_factor;
+                       dto_params.pixclk_hz = e->target_pixel_rate_khz;
+                       dto_params.pixclk_hz *= e->mult_factor;
+                       dto_params.refclk_hz = dtbclk_p_src_clk_khz;
+                       dto_params.refclk_hz *= e->div_factor;
                } else {
-                       dto_params.pixclk_hz = pix_clk_params->requested_pix_clk_100hz * 100;
-                       dto_params.refclk_hz = dtbclk_p_src_clk_khz * 1000;
+                       dto_params.pixclk_hz = pix_clk_params->requested_pix_clk_100hz;
+                       dto_params.pixclk_hz *= 100;
+                       dto_params.refclk_hz = dtbclk_p_src_clk_khz;
+                       dto_params.refclk_hz *= 1000;
                }
 
                /* enable DP DTO */