drm/amd/display: Prevent VStartup Overflow
authorRyan Seto <ryanseto@amd.com>
Fri, 28 Feb 2025 19:24:57 +0000 (14:24 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 10 Mar 2025 17:30:45 +0000 (13:30 -0400)
[Why]
For some VR headsets with large blanks, it's possible
to overflow the OTG_VSTARTUP_PARAM:VSTARTUP_START
register. This can lead to incorrect DML calculations
and underflow downstream.

[How]
Min the calcualted max_vstartup_lines with the max
value of the register.

Reviewed-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Ryan Seto <ryanseto@amd.com>
Signed-off-by: Tom Chung <chiahsuan.chung@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/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c

index 4c33d99ca7e8190c5bc0be68bc609c0f48197f2c..4c504cb0e1c5391b0979e7a447e8acd09bb39d44 100644 (file)
@@ -15,6 +15,7 @@
 //#define DML_MODE_SUPPORT_USE_DPM_DRAM_BW
 //#define DML_GLOBAL_PREFETCH_CHECK
 #define ALLOW_SDPIF_RATE_LIMIT_PRE_CSTATE
+#define DML_MAX_VSTARTUP_START 1023
 
 const char *dml2_core_internal_bw_type_str(enum dml2_core_internal_bw_type bw_type)
 {
@@ -3737,6 +3738,7 @@ static unsigned int CalculateMaxVStartup(
        dml2_printf("DML::%s: vblank_avail = %u\n", __func__, vblank_avail);
        dml2_printf("DML::%s: max_vstartup_lines = %u\n", __func__, max_vstartup_lines);
 #endif
+       max_vstartup_lines = (unsigned int)math_min2(max_vstartup_lines, DML_MAX_VSTARTUP_START);
        return max_vstartup_lines;
 }