93
93
#include "intel_fbc.h"
94
94
#include "intel_fdi.h"
95
95
#include "intel_fifo_underrun.h"
96
+ #include "intel_flipq.h"
96
97
#include "intel_frontbuffer.h"
97
98
#include "intel_hdmi.h"
98
99
#include "intel_hotplug.h"
@@ -6619,7 +6620,7 @@ static void commit_pipe_pre_planes(struct intel_atomic_state *state,
6619
6620
intel_atomic_get_new_crtc_state (state , crtc );
6620
6621
bool modeset = intel_crtc_needs_modeset (new_crtc_state );
6621
6622
6622
- drm_WARN_ON (display -> drm , new_crtc_state -> use_dsb );
6623
+ drm_WARN_ON (display -> drm , new_crtc_state -> use_dsb || new_crtc_state -> use_flipq );
6623
6624
6624
6625
/*
6625
6626
* During modesets pipe configuration was programmed as the
@@ -6649,7 +6650,7 @@ static void commit_pipe_post_planes(struct intel_atomic_state *state,
6649
6650
intel_atomic_get_new_crtc_state (state , crtc );
6650
6651
bool modeset = intel_crtc_needs_modeset (new_crtc_state );
6651
6652
6652
- drm_WARN_ON (display -> drm , new_crtc_state -> use_dsb );
6653
+ drm_WARN_ON (display -> drm , new_crtc_state -> use_dsb || new_crtc_state -> use_flipq );
6653
6654
6654
6655
/*
6655
6656
* Disable the scaler(s) after the plane(s) so that we don't
@@ -6738,10 +6739,10 @@ static void intel_pre_update_crtc(struct intel_atomic_state *state,
6738
6739
6739
6740
if (!modeset &&
6740
6741
intel_crtc_needs_color_update (new_crtc_state ) &&
6741
- !new_crtc_state -> use_dsb )
6742
+ !new_crtc_state -> use_dsb && ! new_crtc_state -> use_flipq )
6742
6743
intel_color_commit_noarm (NULL , new_crtc_state );
6743
6744
6744
- if (!new_crtc_state -> use_dsb )
6745
+ if (!new_crtc_state -> use_dsb && ! new_crtc_state -> use_flipq )
6745
6746
intel_crtc_planes_update_noarm (NULL , state , crtc );
6746
6747
}
6747
6748
@@ -6753,7 +6754,14 @@ static void intel_update_crtc(struct intel_atomic_state *state,
6753
6754
struct intel_crtc_state * new_crtc_state =
6754
6755
intel_atomic_get_new_crtc_state (state , crtc );
6755
6756
6756
- if (new_crtc_state -> use_dsb ) {
6757
+ if (new_crtc_state -> use_flipq ) {
6758
+ intel_flipq_enable (new_crtc_state );
6759
+
6760
+ intel_crtc_prepare_vblank_event (new_crtc_state , & crtc -> flipq_event );
6761
+
6762
+ intel_flipq_add (crtc , INTEL_FLIPQ_PLANE_1 , 0 , INTEL_DSB_0 ,
6763
+ new_crtc_state -> dsb_commit );
6764
+ } else if (new_crtc_state -> use_dsb ) {
6757
6765
intel_crtc_prepare_vblank_event (new_crtc_state , & crtc -> dsb_event );
6758
6766
6759
6767
intel_dsb_commit (new_crtc_state -> dsb_commit );
@@ -7191,7 +7199,17 @@ static void intel_atomic_dsb_prepare(struct intel_atomic_state *state,
7191
7199
return ;
7192
7200
7193
7201
/* FIXME deal with everything */
7202
+ new_crtc_state -> use_flipq =
7203
+ intel_flipq_supported (display ) &&
7204
+ !new_crtc_state -> do_async_flip &&
7205
+ !new_crtc_state -> vrr .enable &&
7206
+ !new_crtc_state -> has_psr &&
7207
+ !intel_crtc_needs_modeset (new_crtc_state ) &&
7208
+ !intel_crtc_needs_fastset (new_crtc_state ) &&
7209
+ !intel_crtc_needs_color_update (new_crtc_state );
7210
+
7194
7211
new_crtc_state -> use_dsb =
7212
+ !new_crtc_state -> use_flipq &&
7195
7213
!new_crtc_state -> do_async_flip &&
7196
7214
(DISPLAY_VER (display ) >= 20 || !new_crtc_state -> has_psr ) &&
7197
7215
!intel_crtc_needs_modeset (new_crtc_state ) &&
@@ -7207,7 +7225,9 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
7207
7225
struct intel_crtc_state * new_crtc_state =
7208
7226
intel_atomic_get_new_crtc_state (state , crtc );
7209
7227
7210
- if (!new_crtc_state -> use_dsb && !new_crtc_state -> dsb_color )
7228
+ if (!new_crtc_state -> use_flipq &&
7229
+ !new_crtc_state -> use_dsb &&
7230
+ !new_crtc_state -> dsb_color )
7211
7231
return ;
7212
7232
7213
7233
/*
@@ -7216,14 +7236,16 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
7216
7236
* Double that for pipe stuff and other overhead.
7217
7237
*/
7218
7238
new_crtc_state -> dsb_commit = intel_dsb_prepare (state , crtc , INTEL_DSB_0 ,
7219
- new_crtc_state -> use_dsb ? 1024 : 16 );
7239
+ new_crtc_state -> use_dsb ||
7240
+ new_crtc_state -> use_flipq ? 1024 : 16 );
7220
7241
if (!new_crtc_state -> dsb_commit ) {
7242
+ new_crtc_state -> use_flipq = false;
7221
7243
new_crtc_state -> use_dsb = false;
7222
7244
intel_color_cleanup_commit (new_crtc_state );
7223
7245
return ;
7224
7246
}
7225
7247
7226
- if (new_crtc_state -> use_dsb ) {
7248
+ if (new_crtc_state -> use_flipq || new_crtc_state -> use_dsb ) {
7227
7249
if (intel_crtc_needs_color_update (new_crtc_state ))
7228
7250
intel_color_commit_noarm (new_crtc_state -> dsb_commit ,
7229
7251
new_crtc_state );
@@ -7238,7 +7260,8 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
7238
7260
intel_psr_trigger_frame_change_event (new_crtc_state -> dsb_commit ,
7239
7261
state , crtc );
7240
7262
7241
- intel_dsb_vblank_evade (state , new_crtc_state -> dsb_commit );
7263
+ if (new_crtc_state -> use_dsb )
7264
+ intel_dsb_vblank_evade (state , new_crtc_state -> dsb_commit );
7242
7265
7243
7266
if (intel_crtc_needs_color_update (new_crtc_state ))
7244
7267
intel_color_commit_arm (new_crtc_state -> dsb_commit ,
@@ -7417,6 +7440,9 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
7417
7440
7418
7441
if (!state -> base .legacy_cursor_update && !new_crtc_state -> use_dsb )
7419
7442
intel_vrr_check_push_sent (NULL , new_crtc_state );
7443
+
7444
+ if (new_crtc_state -> use_flipq )
7445
+ intel_flipq_disable (new_crtc_state );
7420
7446
}
7421
7447
7422
7448
/*
0 commit comments