@@ -117,30 +117,41 @@ static int intel_vrr_vblank_exit_length(const struct intel_crtc_state *crtc_stat
117
117
if (DISPLAY_VER (display ) >= 13 )
118
118
return crtc_state -> vrr .guardband ;
119
119
else
120
- /* The hw imposes the extra scanline before frame start */
120
+ /* hardware imposes one extra scanline somewhere */
121
121
return crtc_state -> vrr .pipeline_full + crtc_state -> framestart_delay + 1 ;
122
122
}
123
123
124
124
int intel_vrr_vmin_vtotal (const struct intel_crtc_state * crtc_state )
125
125
{
126
+ struct intel_display * display = to_intel_display (crtc_state );
127
+
126
128
/* Min vblank actually determined by flipline */
127
- return intel_vrr_vmin_flipline (crtc_state );
129
+ if (DISPLAY_VER (display ) >= 13 )
130
+ return intel_vrr_vmin_flipline (crtc_state );
131
+ else
132
+ return intel_vrr_vmin_flipline (crtc_state ) +
133
+ intel_vrr_vblank_delay (crtc_state );
128
134
}
129
135
130
136
int intel_vrr_vmax_vtotal (const struct intel_crtc_state * crtc_state )
131
137
{
132
- return crtc_state -> vrr .vmax ;
138
+ struct intel_display * display = to_intel_display (crtc_state );
139
+
140
+ if (DISPLAY_VER (display ) >= 13 )
141
+ return crtc_state -> vrr .vmax ;
142
+ else
143
+ return crtc_state -> vrr .vmax +
144
+ intel_vrr_vblank_delay (crtc_state );
133
145
}
134
146
135
147
int intel_vrr_vmin_vblank_start (const struct intel_crtc_state * crtc_state )
136
148
{
137
- /* Min vblank actually determined by flipline */
138
- return intel_vrr_vmin_flipline (crtc_state ) - intel_vrr_vblank_exit_length (crtc_state );
149
+ return intel_vrr_vmin_vtotal (crtc_state ) - intel_vrr_vblank_exit_length (crtc_state );
139
150
}
140
151
141
152
int intel_vrr_vmax_vblank_start (const struct intel_crtc_state * crtc_state )
142
153
{
143
- return crtc_state -> vrr . vmax - intel_vrr_vblank_exit_length (crtc_state );
154
+ return intel_vrr_vmax_vtotal ( crtc_state ) - intel_vrr_vblank_exit_length (crtc_state );
144
155
}
145
156
146
157
static bool
@@ -289,9 +300,18 @@ void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state)
289
300
crtc_state -> vrr .guardband =
290
301
crtc_state -> vrr .vmin - adjusted_mode -> crtc_vblank_start ;
291
302
} else {
303
+ /* hardware imposes one extra scanline somewhere */
292
304
crtc_state -> vrr .pipeline_full =
293
305
min (255 , crtc_state -> vrr .vmin - adjusted_mode -> crtc_vblank_start -
294
306
crtc_state -> framestart_delay - 1 );
307
+
308
+ /*
309
+ * vmin/vmax/flipline also need to be adjusted by
310
+ * the vblank delay to maintain correct vtotals.
311
+ */
312
+ crtc_state -> vrr .vmin -= intel_vrr_vblank_delay (crtc_state );
313
+ crtc_state -> vrr .vmax -= intel_vrr_vblank_delay (crtc_state );
314
+ crtc_state -> vrr .flipline -= intel_vrr_vblank_delay (crtc_state );
295
315
}
296
316
}
297
317
0 commit comments