static unsigned int TruncToValidBPP(
                double DecimalBPP,
+               double DesiredBPP,
                bool DSCEnabled,
                enum output_encoder_class Output,
                enum output_format_class Format,
 {
        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;
        } 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;
                                        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],
                                                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],
                                                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],
                                                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],
                                                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],
                                                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],
                                                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],