Skip to content

Commit 002a612

Browse files
Relja Vojvodicalexdeucher
authored andcommitted
drm/amd/display: Increase minimum clock for TMDS 420 with pipe splitting
[Why] -Pipe splitting allows for clocks to be reduced, but when using TMDS 420, reduced clocks lead to missed clocks cycles on clock resyncing [How] -Impose a minimum clock when using TMDS 420 Reviewed-by: Chris Park <chris.park@amd.com> Signed-off-by: Relja Vojvodic <rvojvodi@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 5eeb16c commit 002a612

1 file changed

Lines changed: 19 additions & 9 deletions

File tree

drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,18 +1238,27 @@ static void CalculateDETBufferSize(
12381238

12391239
static double CalculateRequiredDispclk(
12401240
enum dml2_odm_mode ODMMode,
1241-
double PixelClock)
1241+
double PixelClock,
1242+
bool isTMDS420)
12421243
{
1244+
double DispClk;
12431245

12441246
if (ODMMode == dml2_odm_mode_combine_4to1) {
1245-
return PixelClock / 4.0;
1247+
DispClk = PixelClock / 4.0;
12461248
} else if (ODMMode == dml2_odm_mode_combine_3to1) {
1247-
return PixelClock / 3.0;
1249+
DispClk = PixelClock / 3.0;
12481250
} else if (ODMMode == dml2_odm_mode_combine_2to1) {
1249-
return PixelClock / 2.0;
1251+
DispClk = PixelClock / 2.0;
12501252
} else {
1251-
return PixelClock;
1253+
DispClk = PixelClock;
1254+
}
1255+
1256+
if (isTMDS420) {
1257+
double TMDS420MinPixClock = PixelClock / 2.0;
1258+
DispClk = math_max2(DispClk, TMDS420MinPixClock);
12521259
}
1260+
1261+
return DispClk;
12531262
}
12541263

12551264
static double TruncToValidBPP(
@@ -4122,11 +4131,12 @@ static noinline_for_stack void CalculateODMMode(
41224131
bool success;
41234132
bool UseDSC = DSCEnable && (NumberOfDSCSlices > 0);
41244133
enum dml2_odm_mode DecidedODMMode;
4134+
bool isTMDS420 = (OutFormat == dml2_420 && Output == dml2_hdmi);
41254135

4126-
SurfaceRequiredDISPCLKWithoutODMCombine = CalculateRequiredDispclk(dml2_odm_mode_bypass, PixelClock);
4127-
SurfaceRequiredDISPCLKWithODMCombineTwoToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_2to1, PixelClock);
4128-
SurfaceRequiredDISPCLKWithODMCombineThreeToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_3to1, PixelClock);
4129-
SurfaceRequiredDISPCLKWithODMCombineFourToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_4to1, PixelClock);
4136+
SurfaceRequiredDISPCLKWithoutODMCombine = CalculateRequiredDispclk(dml2_odm_mode_bypass, PixelClock, isTMDS420);
4137+
SurfaceRequiredDISPCLKWithODMCombineTwoToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_2to1, PixelClock, isTMDS420);
4138+
SurfaceRequiredDISPCLKWithODMCombineThreeToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_3to1, PixelClock, isTMDS420);
4139+
SurfaceRequiredDISPCLKWithODMCombineFourToOne = CalculateRequiredDispclk(dml2_odm_mode_combine_4to1, PixelClock, isTMDS420);
41304140
#ifdef __DML_VBA_DEBUG__
41314141
DML_LOG_VERBOSE("DML::%s: ODMUse = %d\n", __func__, ODMUse);
41324142
DML_LOG_VERBOSE("DML::%s: Output = %d\n", __func__, Output);

0 commit comments

Comments
 (0)