From: Yihan Zhu <yihan....@amd.com>

[ Upstream commit 02a940da2ccc0cc0299811379580852b405a0ea2 ]

[WHY]
If max_downscale_src_width check fails, we exit early from TAP calculation and 
left a NULL
value to the scaling data structure to cause the zero divide in the DML 
validation.

[HOW]
Call set default TAP calculation before early exit in 
get_optimal_number_of_taps due to
max downscale limit exceed.

Reviewed-by: Samson Tam <samson....@amd.com>
Signed-off-by: Yihan Zhu <yihan....@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.moha...@amd.com>
Tested-by: Daniel Wheeler <daniel.whee...@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/dcn30/dcn30_dpp.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.c
index 50dc834046446..4ce45f1bdac0f 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.c
@@ -392,11 +392,6 @@ bool dpp3_get_optimal_number_of_taps(
        int min_taps_y, min_taps_c;
        enum lb_memory_config lb_config;
 
-       if (scl_data->viewport.width > scl_data->h_active &&
-               dpp->ctx->dc->debug.max_downscale_src_width != 0 &&
-               scl_data->viewport.width > 
dpp->ctx->dc->debug.max_downscale_src_width)
-               return false;
-
        /*
         * Set default taps if none are provided
         * From programming guide: taps = min{ ceil(2*H_RATIO,1), 8} for 
downscaling
@@ -434,6 +429,12 @@ bool dpp3_get_optimal_number_of_taps(
        else
                scl_data->taps.h_taps_c = in_taps->h_taps_c;
 
+       // Avoid null data in the scl data with this early return, proceed 
non-adaptive calcualtion first
+       if (scl_data->viewport.width > scl_data->h_active &&
+               dpp->ctx->dc->debug.max_downscale_src_width != 0 &&
+               scl_data->viewport.width > 
dpp->ctx->dc->debug.max_downscale_src_width)
+               return false;
+
        /*Ensure we can support the requested number of vtaps*/
        min_taps_y = dc_fixpt_ceil(scl_data->ratios.vert);
        min_taps_c = dc_fixpt_ceil(scl_data->ratios.vert_c);
-- 
2.39.5

Reply via email to