drm/amd/display: Cap certain DML values for Low Pix Clk on DCN2.1
authorSung Lee <sung.lee@amd.com>
Wed, 25 Mar 2020 18:44:25 +0000 (14:44 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 22 Apr 2020 22:11:48 +0000 (18:11 -0400)
[WHY]
In certain conditions with low pixel clock, some values in DML may go
past the max due to margining for latency hiding. This causes assertions
to get hit.

[HOW]
If the pixel clock is low and some values are high, cap it to the max.

Signed-off-by: Sung Lee <sung.lee@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c

index 5430ced..193f31b 100644 (file)
@@ -1490,13 +1490,21 @@ static void dml_rq_dlg_get_dlg_params(
        disp_dlg_regs->refcyc_per_pte_group_vblank_l =
                        (unsigned int) (dst_y_per_row_vblank * (double) htotal
                                        * ref_freq_to_pix_freq / (double) dpte_groups_per_row_ub_l);
-       ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_l < (unsigned int)dml_pow(2, 13));
+       if ((refclk_freq_in_mhz / ref_freq_to_pix_freq < 28) &&
+                       disp_dlg_regs->refcyc_per_pte_group_vblank_l >= (unsigned int)dml_pow(2, 13))
+               disp_dlg_regs->refcyc_per_pte_group_vblank_l = (1 << 13) - 1;
+       else
+               ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_l < (unsigned int)dml_pow(2, 13));
 
        if (dual_plane) {
                disp_dlg_regs->refcyc_per_pte_group_vblank_c = (unsigned int) (dst_y_per_row_vblank
                                * (double) htotal * ref_freq_to_pix_freq
                                / (double) dpte_groups_per_row_ub_c);
-               ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_c
+               if ((refclk_freq_in_mhz / ref_freq_to_pix_freq < 28) &&
+                               disp_dlg_regs->refcyc_per_pte_group_vblank_c >= (unsigned int)dml_pow(2, 13))
+                       disp_dlg_regs->refcyc_per_pte_group_vblank_c = (1 << 13) - 1;
+               else
+                       ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_c
                                < (unsigned int)dml_pow(2, 13));
        }