@@ -81,6 +81,19 @@ int intel_vrr_vblank_delay(const struct intel_crtc_state *crtc_state)
81
81
crtc_state -> hw .adjusted_mode .crtc_vdisplay ;
82
82
}
83
83
84
+ static int intel_vrr_flipline_offset (struct intel_display * display )
85
+ {
86
+ /* ICL/TGL hardware imposes flipline>=vmin+1 */
87
+ return DISPLAY_VER (display ) < 13 ? 1 : 0 ;
88
+ }
89
+
90
+ static int intel_vrr_vmin_flipline (const struct intel_crtc_state * crtc_state )
91
+ {
92
+ struct intel_display * display = to_intel_display (crtc_state );
93
+
94
+ return crtc_state -> vrr .vmin + intel_vrr_flipline_offset (display );
95
+ }
96
+
84
97
/*
85
98
* Without VRR registers get latched at:
86
99
* vblank_start
@@ -110,8 +123,8 @@ static int intel_vrr_vblank_exit_length(const struct intel_crtc_state *crtc_stat
110
123
111
124
int intel_vrr_vmin_vtotal (const struct intel_crtc_state * crtc_state )
112
125
{
113
- /* Min vblank actually determined by flipline that is always >=vmin+1 */
114
- return crtc_state -> vrr . vmin + 1 ;
126
+ /* Min vblank actually determined by flipline */
127
+ return intel_vrr_vmin_flipline ( crtc_state ) ;
115
128
}
116
129
117
130
int intel_vrr_vmax_vtotal (const struct intel_crtc_state * crtc_state )
@@ -121,8 +134,8 @@ int intel_vrr_vmax_vtotal(const struct intel_crtc_state *crtc_state)
121
134
122
135
int intel_vrr_vmin_vblank_start (const struct intel_crtc_state * crtc_state )
123
136
{
124
- /* Min vblank actually determined by flipline that is always >=vmin+1 */
125
- return crtc_state -> vrr . vmin + 1 - intel_vrr_vblank_exit_length (crtc_state );
137
+ /* Min vblank actually determined by flipline */
138
+ return intel_vrr_vmin_flipline ( crtc_state ) - intel_vrr_vblank_exit_length (crtc_state );
126
139
}
127
140
128
141
int intel_vrr_vmax_vblank_start (const struct intel_crtc_state * crtc_state )
@@ -219,15 +232,17 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
219
232
if (vmin >= vmax )
220
233
return ;
221
234
235
+ crtc_state -> vrr .vmin = vmin ;
236
+ crtc_state -> vrr .vmax = vmax ;
237
+
238
+ crtc_state -> vrr .flipline = crtc_state -> vrr .vmin ;
239
+
222
240
/*
223
241
* flipline determines the min vblank length the hardware will
224
- * generate, and flipline>=vmin+1, hence we reduce vmin by one
225
- * to make sure we can get the actual min vblank length.
242
+ * generate, and on ICL/TGL flipline>=vmin+1, hence we reduce
243
+ * vmin by one to make sure we can get the actual min vblank length.
226
244
*/
227
- crtc_state -> vrr .vmin = vmin - 1 ;
228
- crtc_state -> vrr .vmax = vmax ;
229
-
230
- crtc_state -> vrr .flipline = crtc_state -> vrr .vmin + 1 ;
245
+ crtc_state -> vrr .vmin -= intel_vrr_flipline_offset (display );
231
246
232
247
/*
233
248
* When panel is VRR capable and userspace has
@@ -272,7 +287,7 @@ void intel_vrr_compute_config_late(struct intel_crtc_state *crtc_state)
272
287
273
288
if (DISPLAY_VER (display ) >= 13 ) {
274
289
crtc_state -> vrr .guardband =
275
- crtc_state -> vrr .vmin + 1 - adjusted_mode -> crtc_vblank_start ;
290
+ crtc_state -> vrr .vmin - adjusted_mode -> crtc_vblank_start ;
276
291
} else {
277
292
crtc_state -> vrr .pipeline_full =
278
293
min (255 , crtc_state -> vrr .vmin - adjusted_mode -> crtc_vblank_start -
0 commit comments