drm/amd/display: Get ceiling for v_total calc
authorGuo, Bing <Bing.Guo@amd.com>
Mon, 4 Oct 2021 17:13:57 +0000 (13:13 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 Oct 2021 18:26:14 +0000 (14:26 -0400)
Updating certain variable blanking calculations to use ceiling function.

Reviewed-by: Chris Park <chris.park@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Acked-by: Agustin Gutierrez <agustin.gutierrez@amd.com>
Signed-off-by: Bing Guo <Bing.Guo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/modules/freesync/freesync.c

index b99aa23..bd1d1dc 100644 (file)
@@ -155,9 +155,18 @@ static unsigned int calc_v_total_from_duration(
        if (duration_in_us > vrr->max_duration_in_us)
                duration_in_us = vrr->max_duration_in_us;
 
-       v_total = div64_u64(div64_u64(((unsigned long long)(
-                               duration_in_us) * (stream->timing.pix_clk_100hz / 10)),
-                               stream->timing.h_total), 1000);
+       if (dc_is_hdmi_signal(stream->signal)) {
+               uint32_t h_total_up_scaled;
+
+               h_total_up_scaled = stream->timing.h_total * 10000;
+               v_total = div_u64((unsigned long long)duration_in_us
+                                       * stream->timing.pix_clk_100hz + (h_total_up_scaled - 1),
+                                       h_total_up_scaled);
+       } else {
+               v_total = div64_u64(div64_u64(((unsigned long long)(
+                                       duration_in_us) * (stream->timing.pix_clk_100hz / 10)),
+                                       stream->timing.h_total), 1000);
+       }
 
        /* v_total cannot be less than nominal */
        if (v_total < stream->timing.v_total) {