]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: Fix DML calculation errors
authorNicholas Susanto <nicholas.susanto@amd.com>
Fri, 21 Jul 2023 18:45:34 +0000 (14:45 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 11 Sep 2023 21:15:23 +0000 (17:15 -0400)
[Why]
DML calculations differ with DCN3.1 spreadsheet values due to
translations errors from the visual basic code

[How]
Add missing calculations that set the value for DSCDelay

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Jun Lei <jun.lei@amd.com>
Acked-by: Stylon Wang <stylon.wang@amd.com>
Signed-off-by: Nicholas Susanto <nicholas.susanto@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c

index a94aa0f21a7f424165a62997613e93b121507db8..88e56889a68caafd1adcbeb15f4dfa6e3fe22d83 100644 (file)
@@ -2311,6 +2311,7 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
                                                                v->OutputFormat[k],
                                                                v->Output[k]) + dscComputeDelay(v->OutputFormat[k], v->Output[k]));
                        }
+                       v->DSCDelay[k] = v->DSCDelay[k] + (v->HTotal[k] - v->HActive[k]) * dml_ceil((double) v->DSCDelay[k] / v->HActive[k], 1);
                        v->DSCDelay[k] = v->DSCDelay[k] * v->PixelClock[k] / v->PixelClockBackEnd[k];
                } else {
                        v->DSCDelay[k] = 0;
@@ -4719,6 +4720,7 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_
                                                                        v->OutputFormat[k],
                                                                        v->Output[k]) + dscComputeDelay(v->OutputFormat[k], v->Output[k]));
                                }
+                               v->DSCDelayPerState[i][k] = v->DSCDelayPerState[i][k] + (v->HTotal[k] - v->HActive[k]) * dml_ceil((double) v->DSCDelayPerState[i][k] / v->HActive[k], 1.0);
                                v->DSCDelayPerState[i][k] = v->DSCDelayPerState[i][k] * v->PixelClock[k] / v->PixelClockBackEnd[k];
                        } else {
                                v->DSCDelayPerState[i][k] = 0.0;