@@ -2327,15 +2327,6 @@ static u32 man_trk_ctl_continuos_full_frame(struct intel_display *display)
23272327static void intel_psr_force_update (struct intel_dp * intel_dp )
23282328{
23292329 struct intel_display * display = to_intel_display (intel_dp );
2330- enum transcoder cpu_transcoder = intel_dp -> psr .transcoder ;
2331-
2332- if (intel_dp -> psr .psr2_sel_fetch_enabled )
2333- intel_de_write (display ,
2334- PSR2_MAN_TRK_CTL (display , cpu_transcoder ),
2335- man_trk_ctl_enable_bit_get (display ) |
2336- man_trk_ctl_partial_frame_bit_get (display ) |
2337- man_trk_ctl_single_full_frame_bit_get (display ) |
2338- man_trk_ctl_continuos_full_frame (display ));
23392330
23402331 /*
23412332 * Display WA #0884: skl+
@@ -3131,31 +3122,31 @@ static void intel_psr_work(struct work_struct *work)
31313122 mutex_unlock (& intel_dp -> psr .lock );
31323123}
31333124
3134- static void _psr_invalidate_handle (struct intel_dp * intel_dp )
3125+ static void intel_psr_configure_full_frame_update (struct intel_dp * intel_dp )
31353126{
31363127 struct intel_display * display = to_intel_display (intel_dp );
31373128 enum transcoder cpu_transcoder = intel_dp -> psr .transcoder ;
31383129
3139- if (intel_dp -> psr .psr2_sel_fetch_enabled ) {
3140- u32 val ;
3130+ if (! intel_dp -> psr .psr2_sel_fetch_enabled )
3131+ return ;
31413132
3142- if (intel_dp -> psr .psr2_sel_fetch_cff_enabled ) {
3143- /* Send one update otherwise lag is observed in screen */
3144- intel_de_write (display ,
3145- CURSURFLIVE (display , intel_dp -> psr .pipe ),
3146- 0 );
3147- return ;
3133+ intel_de_write (display ,
3134+ PSR2_MAN_TRK_CTL (display , cpu_transcoder ),
3135+ man_trk_ctl_enable_bit_get (display ) |
3136+ man_trk_ctl_partial_frame_bit_get (display ) |
3137+ man_trk_ctl_single_full_frame_bit_get (display ) |
3138+ man_trk_ctl_continuos_full_frame (display ));
3139+ }
3140+
3141+ static void _psr_invalidate_handle (struct intel_dp * intel_dp )
3142+ {
3143+ if (intel_dp -> psr .psr2_sel_fetch_enabled ) {
3144+ if (!intel_dp -> psr .psr2_sel_fetch_cff_enabled ) {
3145+ intel_dp -> psr .psr2_sel_fetch_cff_enabled = true;
3146+ intel_psr_configure_full_frame_update (intel_dp );
31483147 }
31493148
3150- val = man_trk_ctl_enable_bit_get (display ) |
3151- man_trk_ctl_partial_frame_bit_get (display ) |
3152- man_trk_ctl_continuos_full_frame (display );
3153- intel_de_write (display ,
3154- PSR2_MAN_TRK_CTL (display , cpu_transcoder ),
3155- val );
3156- intel_de_write (display ,
3157- CURSURFLIVE (display , intel_dp -> psr .pipe ), 0 );
3158- intel_dp -> psr .psr2_sel_fetch_cff_enabled = true;
3149+ intel_psr_force_update (intel_dp );
31593150 } else {
31603151 intel_psr_exit (intel_dp );
31613152 }
@@ -3236,44 +3227,27 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
32363227{
32373228 struct intel_display * display = to_intel_display (intel_dp );
32383229 struct drm_i915_private * dev_priv = to_i915 (display -> drm );
3239- enum transcoder cpu_transcoder = intel_dp -> psr .transcoder ;
32403230
32413231 if (intel_dp -> psr .psr2_sel_fetch_enabled ) {
32423232 if (intel_dp -> psr .psr2_sel_fetch_cff_enabled ) {
32433233 /* can we turn CFF off? */
3244- if (intel_dp -> psr .busy_frontbuffer_bits == 0 ) {
3245- u32 val = man_trk_ctl_enable_bit_get (display ) |
3246- man_trk_ctl_partial_frame_bit_get (display ) |
3247- man_trk_ctl_single_full_frame_bit_get (display ) |
3248- man_trk_ctl_continuos_full_frame (display );
3249-
3250- /*
3251- * Set psr2_sel_fetch_cff_enabled as false to allow selective
3252- * updates. Still keep cff bit enabled as we don't have proper
3253- * SU configuration in case update is sent for any reason after
3254- * sff bit gets cleared by the HW on next vblank.
3255- */
3256- intel_de_write (display ,
3257- PSR2_MAN_TRK_CTL (display , cpu_transcoder ),
3258- val );
3259- intel_de_write (display ,
3260- CURSURFLIVE (display , intel_dp -> psr .pipe ),
3261- 0 );
3234+ if (intel_dp -> psr .busy_frontbuffer_bits == 0 )
32623235 intel_dp -> psr .psr2_sel_fetch_cff_enabled = false;
3263- }
3264- } else {
3265- /*
3266- * continuous full frame is disabled, only a single full
3267- * frame is required
3268- */
3269- intel_psr_force_update (intel_dp );
32703236 }
3271- } else {
3272- intel_psr_force_update (intel_dp );
32733237
3274- if (!intel_dp -> psr .active && !intel_dp -> psr .busy_frontbuffer_bits )
3275- queue_work (dev_priv -> unordered_wq , & intel_dp -> psr .work );
3238+ /*
3239+ * Still keep cff bit enabled as we don't have proper SU
3240+ * configuration in case update is sent for any reason after
3241+ * sff bit gets cleared by the HW on next vblank.
3242+ */
3243+ intel_psr_configure_full_frame_update (intel_dp );
32763244 }
3245+
3246+ intel_psr_force_update (intel_dp );
3247+
3248+ if (!intel_dp -> psr .psr2_sel_fetch_enabled && !intel_dp -> psr .active &&
3249+ !intel_dp -> psr .busy_frontbuffer_bits )
3250+ queue_work (dev_priv -> unordered_wq , & intel_dp -> psr .work );
32773251}
32783252
32793253/**
0 commit comments