mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 17:44:14 +08:00
drm/amd/display: Fix dml20v2_ModeSupportAndSystemConfigurationFull() to check DesiredBPP.
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>
This commit is contained in:
parent
64ff088242
commit
4ef37e2703
@ -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],
|
||||
|
Loading…
Reference in New Issue
Block a user