drm/amd/display: Set ODM policy based on number of DSC slices
authorTaimur Hassan <Syed.Hassan@amd.com>
Fri, 12 Aug 2022 20:59:48 +0000 (16:59 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 29 Aug 2022 21:44:54 +0000 (17:44 -0400)
[Why & How]
Add addtional check in CalculateODMMode for cases where the ODM combine
is needed due to number of DSC slices.

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Brian Chang <Brian.Chang@amd.com>
Signed-off-by: Taimur Hassan <Syed.Hassan@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/dml/dcn32/display_mode_vba_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h

index cb20257..f831855 100644 (file)
@@ -2045,6 +2045,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                                mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
                                                mode_lib->vba.DISPCLKRampingMargin,
                                                mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
+                                               mode_lib->vba.NumberOfDSCSlices[k],
 
                                                /* Output */
                                                &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC,
@@ -2066,6 +2067,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                                mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading,
                                                mode_lib->vba.DISPCLKRampingMargin,
                                                mode_lib->vba.DISPCLKDPPCLKVCOSpeed,
+                                               mode_lib->vba.NumberOfDSCSlices[k],
 
                                                /* Output */
                                                &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC,
index 05fc14a..6b3c4db 100644 (file)
@@ -1193,6 +1193,7 @@ void dml32_CalculateODMMode(
                double DISPCLKDPPCLKDSCCLKDownSpreading,
                double DISPCLKRampingMargin,
                double DISPCLKDPPCLKVCOSpeed,
+               unsigned int NumberOfDSCSlices,
 
                /* Output */
                bool *TotalAvailablePipesSupport,
@@ -1228,7 +1229,8 @@ void dml32_CalculateODMMode(
 
        if (!(Output == dm_hdmi || Output == dm_dp || Output == dm_edp) && (ODMUse == dm_odm_combine_policy_4to1 ||
                        ((SurfaceRequiredDISPCLKWithODMCombineTwoToOne > StateDispclk ||
-                                       (DSCEnable && (HActive > 2 * MaximumPixelsPerLinePerDSCUnit)))))) {
+                                       (DSCEnable && (HActive > 2 * MaximumPixelsPerLinePerDSCUnit))
+                                       || NumberOfDSCSlices > 8)))) {
                if (TotalNumberOfActiveDPP + 4 <= MaxNumDPP) {
                        *ODMMode = dm_odm_combine_mode_4to1;
                        *RequiredDISPCLKPerSurface = SurfaceRequiredDISPCLKWithODMCombineFourToOne;
@@ -1239,7 +1241,8 @@ void dml32_CalculateODMMode(
        } else if (Output != dm_hdmi && (ODMUse == dm_odm_combine_policy_2to1 ||
                        (((SurfaceRequiredDISPCLKWithoutODMCombine > StateDispclk &&
                                        SurfaceRequiredDISPCLKWithODMCombineTwoToOne <= StateDispclk) ||
-                                       (DSCEnable && (HActive > MaximumPixelsPerLinePerDSCUnit)))))) {
+                                       (DSCEnable && (HActive > MaximumPixelsPerLinePerDSCUnit))
+                                       || (NumberOfDSCSlices <= 8 && NumberOfDSCSlices > 4))))) {
                if (TotalNumberOfActiveDPP + 2 <= MaxNumDPP) {
                        *ODMMode = dm_odm_combine_mode_2to1;
                        *RequiredDISPCLKPerSurface = SurfaceRequiredDISPCLKWithODMCombineTwoToOne;
index d293856..626f660 100644 (file)
@@ -226,6 +226,7 @@ void dml32_CalculateODMMode(
                double DISPCLKDPPCLKDSCCLKDownSpreading,
                double DISPCLKRampingMargin,
                double DISPCLKDPPCLKVCOSpeed,
+               unsigned int NumberOfDSCSlices,
 
                /* Output */
                bool *TotalAvailablePipesSupport,