drm/amd/display: Correct DML calculation to align HW formula
authorjsg <jsg@openbsd.org>
Thu, 15 Jun 2023 02:51:42 +0000 (02:51 +0000)
committerjsg <jsg@openbsd.org>
Thu, 15 Jun 2023 02:51:42 +0000 (02:51 +0000)
From Paul Hsieh
09f7da1301cf7390466847781ef06b0d0c61db4e in linux-6.1.y/6.1.30
26a9f53198c955b15161da48cdb51041a38d5325 in mainline linux

sys/dev/pci/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
sys/dev/pci/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c

index b612edb..7709403 100644 (file)
@@ -4305,11 +4305,11 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                                        v->AudioSampleRate[k],
                                                        v->AudioSampleLayout[k],
                                                        v->ODMCombineEnablePerState[i][k]);
-                               } else if (v->Output[k] == dm_dp || v->Output[k] == dm_edp) {
+                               } else if (v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_dp2p0) {
                                        if (v->DSCEnable[k] == true) {
                                                v->RequiresDSC[i][k] = true;
                                                v->LinkDSCEnable = true;
-                                               if (v->Output[k] == dm_dp) {
+                                               if (v->Output[k] == dm_dp || v->Output[k] == dm_dp2p0) {
                                                        v->RequiresFEC[i][k] = true;
                                                } else {
                                                        v->RequiresFEC[i][k] = false;
@@ -4317,107 +4317,201 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                        } else {
                                                v->RequiresDSC[i][k] = false;
                                                v->LinkDSCEnable = false;
-                                               v->RequiresFEC[i][k] = false;
-                                       }
-
-                                       v->Outbpp = BPP_INVALID;
-                                       if (v->PHYCLKPerState[i] >= 270.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 2700,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 540.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 5400,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR2"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 810.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 8100,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR3"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[i] >= 10000.0 / 18) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 10000,
-                                                               4,
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               //v->OutputTypeAndRatePerState[i][k] = v->Output[k] & "10x4";
+                                               if (v->Output[k] == dm_dp2p0) {
+                                                       v->RequiresFEC[i][k] = true;
+                                               } else {
+                                                       v->RequiresFEC[i][k] = false;
+                                               }
                                        }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[i] >= 12000.0 / 18) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               12000,
-                                                               4,
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               //v->OutputTypeAndRatePerState[i][k] = v->Output[k] & "12x4";
+                                       if (v->Output[k] == dm_dp2p0) {
+                                               v->Outbpp = BPP_INVALID;
+                                               if ((v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr10) &&
+                                                       v->PHYCLKD18PerState[k] >= 10000.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 10000,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[k] < 13500.0 / 18.0 &&
+                                                               v->DSCEnable[k] == true && v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 10000,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR10"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID &&
+                                                       (v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr13p5) &&
+                                                       v->PHYCLKD18PerState[k] >= 13500.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 13500,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[k] < 20000.0 / 18.0 &&
+                                                               v->DSCEnable[k] == true && v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 13500,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR13p5"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID &&
+                                                       (v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr20) &&
+                                                       v->PHYCLKD18PerState[k] >= 20000.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 20000,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->DSCEnable[k] == true &&
+                                                               v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 20000,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR20"
+                                               }
+                                       } else {
+                                               v->Outbpp = BPP_INVALID;
+                                               if (v->PHYCLKPerState[i] >= 270.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 2700,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 540.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 5400,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR2"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 810.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 8100,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR3"
+                                               }
                                        }
                                }
                        } else {
index 3afd3c8..69516cf 100644 (file)
@@ -4403,11 +4403,11 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_
                                                        v->AudioSampleRate[k],
                                                        v->AudioSampleLayout[k],
                                                        v->ODMCombineEnablePerState[i][k]);
-                               } else if (v->Output[k] == dm_dp || v->Output[k] == dm_edp) {
+                               } else if (v->Output[k] == dm_dp || v->Output[k] == dm_edp || v->Output[k] == dm_dp2p0) {
                                        if (v->DSCEnable[k] == true) {
                                                v->RequiresDSC[i][k] = true;
                                                v->LinkDSCEnable = true;
-                                               if (v->Output[k] == dm_dp) {
+                                               if (v->Output[k] == dm_dp || v->Output[k] == dm_dp2p0) {
                                                        v->RequiresFEC[i][k] = true;
                                                } else {
                                                        v->RequiresFEC[i][k] = false;
@@ -4415,107 +4415,201 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_
                                        } else {
                                                v->RequiresDSC[i][k] = false;
                                                v->LinkDSCEnable = false;
-                                               v->RequiresFEC[i][k] = false;
-                                       }
-
-                                       v->Outbpp = BPP_INVALID;
-                                       if (v->PHYCLKPerState[i] >= 270.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 2700,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 540.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 5400,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR2"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 810.0) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 8100,
-                                                               v->OutputLinkDPLanes[k],
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               // TODO: Need some other way to handle this nonsense
-                                               // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR3"
-                                       }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[i] >= 10000.0 / 18) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               (1.0 - v->Downspreading / 100.0) * 10000,
-                                                               4,
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               //v->OutputTypeAndRatePerState[i][k] = v->Output[k] & "10x4";
+                                               if (v->Output[k] == dm_dp2p0) {
+                                                       v->RequiresFEC[i][k] = true;
+                                               } else {
+                                                       v->RequiresFEC[i][k] = false;
+                                               }
                                        }
-                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[i] >= 12000.0 / 18) {
-                                               v->Outbpp = TruncToValidBPP(
-                                                               12000,
-                                                               4,
-                                                               v->HTotal[k],
-                                                               v->HActive[k],
-                                                               v->PixelClockBackEnd[k],
-                                                               v->ForcedOutputLinkBPP[k],
-                                                               v->LinkDSCEnable,
-                                                               v->Output[k],
-                                                               v->OutputFormat[k],
-                                                               v->DSCInputBitPerComponent[k],
-                                                               v->NumberOfDSCSlices[k],
-                                                               v->AudioSampleRate[k],
-                                                               v->AudioSampleLayout[k],
-                                                               v->ODMCombineEnablePerState[i][k]);
-                                               v->OutputBppPerState[i][k] = v->Outbpp;
-                                               //v->OutputTypeAndRatePerState[i][k] = v->Output[k] & "12x4";
+                                       if (v->Output[k] == dm_dp2p0) {
+                                               v->Outbpp = BPP_INVALID;
+                                               if ((v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr10) &&
+                                                       v->PHYCLKD18PerState[k] >= 10000.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 10000,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[k] < 13500.0 / 18.0 &&
+                                                               v->DSCEnable[k] == true && v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 10000,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR10"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID &&
+                                                       (v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr13p5) &&
+                                                       v->PHYCLKD18PerState[k] >= 13500.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 13500,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->PHYCLKD18PerState[k] < 20000.0 / 18.0 &&
+                                                               v->DSCEnable[k] == true && v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 13500,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR13p5"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID &&
+                                                       (v->OutputLinkDPRate[k] == dm_dp_rate_na || v->OutputLinkDPRate[k] == dm_dp_rate_uhbr20) &&
+                                                       v->PHYCLKD18PerState[k] >= 20000.0 / 18.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 20000,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       if (v->Outbpp == BPP_INVALID && v->DSCEnable[k] == true &&
+                                                               v->ForcedOutputLinkBPP[k] == 0) {
+                                                               v->RequiresDSC[i][k] = true;
+                                                               v->LinkDSCEnable = true;
+                                                               v->Outbpp = TruncToValidBPP(
+                                                                               (1.0 - v->Downspreading / 100.0) * 20000,
+                                                                               v->OutputLinkDPLanes[k],
+                                                                               v->HTotal[k],
+                                                                               v->HActive[k],
+                                                                               v->PixelClockBackEnd[k],
+                                                                               v->ForcedOutputLinkBPP[k],
+                                                                               v->LinkDSCEnable,
+                                                                               v->Output[k],
+                                                                               v->OutputFormat[k],
+                                                                               v->DSCInputBitPerComponent[k],
+                                                                               v->NumberOfDSCSlices[k],
+                                                                               v->AudioSampleRate[k],
+                                                                               v->AudioSampleLayout[k],
+                                                                               v->ODMCombineEnablePerState[i][k]);
+                                                       }
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " UHBR20"
+                                               }
+                                       } else {
+                                               v->Outbpp = BPP_INVALID;
+                                               if (v->PHYCLKPerState[i] >= 270.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 2700,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 540.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 5400,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR2"
+                                               }
+                                               if (v->Outbpp == BPP_INVALID && v->PHYCLKPerState[i] >= 810.0) {
+                                                       v->Outbpp = TruncToValidBPP(
+                                                                       (1.0 - v->Downspreading / 100.0) * 8100,
+                                                                       v->OutputLinkDPLanes[k],
+                                                                       v->HTotal[k],
+                                                                       v->HActive[k],
+                                                                       v->PixelClockBackEnd[k],
+                                                                       v->ForcedOutputLinkBPP[k],
+                                                                       v->LinkDSCEnable,
+                                                                       v->Output[k],
+                                                                       v->OutputFormat[k],
+                                                                       v->DSCInputBitPerComponent[k],
+                                                                       v->NumberOfDSCSlices[k],
+                                                                       v->AudioSampleRate[k],
+                                                                       v->AudioSampleLayout[k],
+                                                                       v->ODMCombineEnablePerState[i][k]);
+                                                       v->OutputBppPerState[i][k] = v->Outbpp;
+                                                       // TODO: Need some other way to handle this nonsense
+                                                       // v->OutputTypeAndRatePerState[i][k] = v->Output[k] & " HBR3"
+                                               }
                                        }
                                }
                        } else {