drm/amd/display: Fix dml20v2_ModeSupportAndSystemConfigurationFull() to check DesiredBPP.
authorBing Guo <bing.guo@amd.com>
Thu, 7 Jan 2021 22:39:13 +0000 (17:39 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Jan 2021 21:38:21 +0000 (16:38 -0500)
Why:
dml20v2_ModeSupportAndSystemConfigurationFull() didn't check against
DesiredBPP, so it doesn't work correctly when DesiredBPP can't be satisfied.

How:
Port the TruncToValidBPP() version from display_mode_vba_21.c to
display_mode_vba_20v2.c.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Bing Guo <bing.guo@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Anson Jacob <anson.jacob@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c

index 80170f9..47e8e71 100644 (file)
@@ -3263,6 +3263,7 @@ static void CalculateFlipSchedule(
 
 static unsigned int TruncToValidBPP(
                double DecimalBPP,
+               double DesiredBPP,
                bool DSCEnabled,
                enum output_encoder_class Output,
                enum output_format_class Format,
@@ -3270,31 +3271,31 @@ static unsigned int TruncToValidBPP(
 {
        if (Output == dm_hdmi) {
                if (Format == dm_420) {
-                       if (DecimalBPP >= 18)
+                       if (DecimalBPP >= 18 && (DesiredBPP == 0 || DesiredBPP == 18))
                                return 18;
-                       else if (DecimalBPP >= 15)
+                       else if (DecimalBPP >= 15 && (DesiredBPP == 0 || DesiredBPP == 15))
                                return 15;
-                       else if (DecimalBPP >= 12)
+                       else if (DecimalBPP >= 12 && (DesiredBPP == 0 || DesiredBPP == 12))
                                return 12;
                        else
                                return BPP_INVALID;
                } else if (Format == dm_444) {
-                       if (DecimalBPP >= 36)
+                       if (DecimalBPP >= 36 && (DesiredBPP == 0 || DesiredBPP == 36))
                                return 36;
-                       else if (DecimalBPP >= 30)
+                       else if (DecimalBPP >= 30 && (DesiredBPP == 0 || DesiredBPP == 30))
                                return 30;
-                       else if (DecimalBPP >= 24)
+                       else if (DecimalBPP >= 24 && (DesiredBPP == 0 || DesiredBPP == 24))
                                return 24;
-                       else if (DecimalBPP >= 18)
+                       else if (DecimalBPP >= 18 && (DesiredBPP == 0 || DesiredBPP == 18))
                                return 18;
                        else
                                return BPP_INVALID;
                } else {
-                       if (DecimalBPP / 1.5 >= 24)
+                       if (DecimalBPP / 1.5 >= 24 && (DesiredBPP == 0 || DesiredBPP == 24))
                                return 24;
-                       else if (DecimalBPP / 1.5 >= 20)
+                       else if (DecimalBPP / 1.5 >= 20 && (DesiredBPP == 0 || DesiredBPP == 20))
                                return 20;
-                       else if (DecimalBPP / 1.5 >= 16)
+                       else if (DecimalBPP / 1.5 >= 16 && (DesiredBPP == 0 || DesiredBPP == 16))
                                return 16;
                        else
                                return BPP_INVALID;
@@ -3302,53 +3303,86 @@ static unsigned int TruncToValidBPP(
        } else {
                if (DSCEnabled) {
                        if (Format == dm_420) {
-                               if (DecimalBPP < 6)
-                                       return BPP_INVALID;
-                               else if (DecimalBPP >= 1.5 * DSCInputBitPerComponent - 1 / 16)
-                                       return 1.5 * DSCInputBitPerComponent - 1 / 16;
-                               else
-                                       return dml_floor(16 * DecimalBPP, 1) / 16;
+                               if (DesiredBPP == 0) {
+                                       if (DecimalBPP < 6)
+                                               return BPP_INVALID;
+                                       else if (DecimalBPP >= 1.5 * DSCInputBitPerComponent - 1.0 / 16.0)
+                                               return 1.5 * DSCInputBitPerComponent - 1.0 / 16.0;
+                                       else
+                                               return dml_floor(16 * DecimalBPP, 1) / 16.0;
+                               } else {
+                                       if (DecimalBPP < 6
+                                                       || DesiredBPP < 6
+                                                       || DesiredBPP > 1.5 * DSCInputBitPerComponent - 1.0 / 16.0
+                                                       || DecimalBPP < DesiredBPP) {
+                                               return BPP_INVALID;
+                                       } else {
+                                               return DesiredBPP;
+                                       }
+                               }
                        } else if (Format == dm_n422) {
-                               if (DecimalBPP < 7)
-                                       return BPP_INVALID;
-                               else if (DecimalBPP >= 2 * DSCInputBitPerComponent - 1 / 16)
-                                       return 2 * DSCInputBitPerComponent - 1 / 16;
-                               else
-                                       return dml_floor(16 * DecimalBPP, 1) / 16;
+                               if (DesiredBPP == 0) {
+                                       if (DecimalBPP < 7)
+                                               return BPP_INVALID;
+                                       else if (DecimalBPP >= 2 * DSCInputBitPerComponent - 1.0 / 16.0)
+                                               return 2 * DSCInputBitPerComponent - 1.0 / 16.0;
+                                       else
+                                               return dml_floor(16 * DecimalBPP, 1) / 16.0;
+                               } else {
+                                       if (DecimalBPP < 7
+                                                       || DesiredBPP < 7
+                                                       || DesiredBPP > 2 * DSCInputBitPerComponent - 1.0 / 16.0
+                                                       || DecimalBPP < DesiredBPP) {
+                                               return BPP_INVALID;
+                                       } else {
+                                               return DesiredBPP;
+                                       }
+                               }
                        } else {
-                               if (DecimalBPP < 8)
-                                       return BPP_INVALID;
-                               else if (DecimalBPP >= 3 * DSCInputBitPerComponent - 1 / 16)
-                                       return 3 * DSCInputBitPerComponent - 1 / 16;
-                               else
-                                       return dml_floor(16 * DecimalBPP, 1) / 16;
+                               if (DesiredBPP == 0) {
+                                       if (DecimalBPP < 8)
+                                               return BPP_INVALID;
+                                       else if (DecimalBPP >= 3 * DSCInputBitPerComponent - 1.0 / 16.0)
+                                               return 3 * DSCInputBitPerComponent - 1.0 / 16.0;
+                                       else
+                                               return dml_floor(16 * DecimalBPP, 1) / 16.0;
+                               } else {
+                                       if (DecimalBPP < 8
+                                                       || DesiredBPP < 8
+                                                       || DesiredBPP > 3 * DSCInputBitPerComponent - 1.0 / 16.0
+                                                       || DecimalBPP < DesiredBPP) {
+                                               return BPP_INVALID;
+                                       } else {
+                                               return DesiredBPP;
+                                       }
+                               }
                        }
                } else if (Format == dm_420) {
-                       if (DecimalBPP >= 18)
+                       if (DecimalBPP >= 18 && (DesiredBPP == 0 || DesiredBPP == 18))
                                return 18;
-                       else if (DecimalBPP >= 15)
+                       else if (DecimalBPP >= 15 && (DesiredBPP == 0 || DesiredBPP == 15))
                                return 15;
-                       else if (DecimalBPP >= 12)
+                       else if (DecimalBPP >= 12 && (DesiredBPP == 0 || DesiredBPP == 12))
                                return 12;
                        else
                                return BPP_INVALID;
                } else if (Format == dm_s422 || Format == dm_n422) {
-                       if (DecimalBPP >= 24)
+                       if (DecimalBPP >= 24 && (DesiredBPP == 0 || DesiredBPP == 24))
                                return 24;
-                       else if (DecimalBPP >= 20)
+                       else if (DecimalBPP >= 20 && (DesiredBPP == 0 || DesiredBPP == 20))
                                return 20;
-                       else if (DecimalBPP >= 16)
+                       else if (DecimalBPP >= 16 && (DesiredBPP == 0 || DesiredBPP == 16))
                                return 16;
                        else
                                return BPP_INVALID;
                } else {
-                       if (DecimalBPP >= 36)
+                       if (DecimalBPP >= 36 && (DesiredBPP == 0 || DesiredBPP == 36))
                                return 36;
-                       else if (DecimalBPP >= 30)
+                       else if (DecimalBPP >= 30 && (DesiredBPP == 0 || DesiredBPP == 30))
                                return 30;
-                       else if (DecimalBPP >= 24)
+                       else if (DecimalBPP >= 24 && (DesiredBPP == 0 || DesiredBPP == 24))
                                return 24;
-                       else if (DecimalBPP >= 18)
+                       else if (DecimalBPP >= 18 && (DesiredBPP == 0 || DesiredBPP == 18))
                                return 18;
                        else
                                return BPP_INVALID;
@@ -4137,6 +4171,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                        locals->RequiresFEC[i][k] = 0;
                                        locals->OutputBppPerState[i][k] = TruncToValidBPP(
                                                        dml_min(600.0, mode_lib->vba.PHYCLKPerState[i]) / mode_lib->vba.PixelClockBackEnd[k] * 24,
+                                                       mode_lib->vba.ForcedOutputLinkBPP[k],
                                                        false,
                                                        mode_lib->vba.Output[k],
                                                        mode_lib->vba.OutputFormat[k],
@@ -4153,6 +4188,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.Outbpp = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * 270.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                false,
                                                                mode_lib->vba.Output[k],
                                                                mode_lib->vba.OutputFormat[k],
@@ -4160,6 +4196,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.OutbppDSC = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 270.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                true,
                                                                mode_lib->vba.Output[k],
                                                                mode_lib->vba.OutputFormat[k],
@@ -4182,6 +4219,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.Outbpp = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * 540.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                        false,
                                                                        mode_lib->vba.Output[k],
                                                                        mode_lib->vba.OutputFormat[k],
@@ -4189,6 +4227,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.OutbppDSC = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 540.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                true,
                                                                mode_lib->vba.Output[k],
                                                                mode_lib->vba.OutputFormat[k],
@@ -4213,6 +4252,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.Outbpp = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * 810.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                false,
                                                                mode_lib->vba.Output[k],
                                                                mode_lib->vba.OutputFormat[k],
@@ -4220,6 +4260,7 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
                                                mode_lib->vba.OutbppDSC = TruncToValidBPP(
                                                                (1.0 - mode_lib->vba.Downspreading / 100.0) * (1.0 - mode_lib->vba.EffectiveFECOverhead / 100.0) * 810.0
                                                                * mode_lib->vba.OutputLinkDPLanes[k] / mode_lib->vba.PixelClockBackEnd[k] * 8.0,
+                                                               mode_lib->vba.ForcedOutputLinkBPP[k],
                                                                true,
                                                                mode_lib->vba.Output[k],
                                                                mode_lib->vba.OutputFormat[k],