From: Chris Park <chris.p...@amd.com>

[ Upstream commit 80089dd8410f356d5104496d5ab71a66a4f4646b ]

[Why]
At very high pixel clock, bandwidth calculation exceeds 32 bit size
and overflow value. This causes the resulting selection of link rate
to be inaccurate.

[How]
Change order of operation and use fixed point to deal with integer
accuracy. Also address bug found when forcing link rate.

Signed-off-by: Chris Park <chris.p...@amd.com>
Reviewed-by: Wenjing Liu <wenjing....@amd.com>
Acked-by: Eryk Brol <eryk.b...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 47cefc05fd3f5..f933791f1fbbb 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -2906,11 +2906,14 @@ uint32_t dc_bandwidth_in_kbps_from_timing(
 {
        uint32_t bits_per_channel = 0;
        uint32_t kbps;
+       struct fixed31_32 link_bw_kbps;
 
 #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
        if (timing->flags.DSC) {
-               kbps = (timing->pix_clk_100hz * timing->dsc_cfg.bits_per_pixel);
-               kbps = kbps / 160 + ((kbps % 160) ? 1 : 0);
+               link_bw_kbps = dc_fixpt_from_int(timing->pix_clk_100hz);
+               link_bw_kbps = dc_fixpt_div_int(link_bw_kbps, 160);
+               link_bw_kbps = dc_fixpt_mul_int(link_bw_kbps, 
timing->dsc_cfg.bits_per_pixel);
+               kbps = dc_fixpt_ceil(link_bw_kbps);
                return kbps;
        }
 #endif
-- 
2.27.0

Reply via email to