[PATCH] drm/i915/psr: Do not trigger Frame Change events from frontbuffer flush

Kandpal, Suraj suraj.kandpal at intel.com
Thu Aug 7 04:38:16 UTC 2025


> Subject: [PATCH] drm/i915/psr: Do not trigger Frame Change events from
> frontbuffer flush
> 
> We want to get rid of triggering "Frame Change" events from frontbuffer flush
> calls. We are about to move using TRANS_PUSH register for this on LunarLake
> and onwards. Touching TRANS_PUSH register from fronbuffer flush would be
> problematic as it's written by DSB as well.
> 
> Fix this by using intel_psr_exit when flush or invalidate is done on LunarLake
> and onwards. This is not possible on AlderLake and MeteorLake due to HW bug
> in PSR2 disable.
> 
> This patch is also fixing problems with cursor plane where cursor is
> disappearing or duplicate cursor is seen on the screen.
> 

Any Bspec link that documents this tried to look through the patch series this was plucked of from
Didn’t find any there either.

Regards,
Suraj Kandpal

> v2: Commit message updated
> 
> Reported-by: Janna Martl <janna.martl109 at gmail.com>
> Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/5522
> Fixes: 411ad63877bb ("drm/i915/psr: Use SFF_CTL on invalidate/flush for
> LunarLake onwards")
> Tested-by: Janna Martl <janna.martl109 at gmail.com>
> Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_psr.c | 14 +++++++++-----
>  1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> b/drivers/gpu/drm/i915/display/intel_psr.c
> index 6bd3454bb00e..4279c28ae27c 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -3254,7 +3254,9 @@ static void
> intel_psr_configure_full_frame_update(struct intel_dp *intel_dp)
> 
>  static void _psr_invalidate_handle(struct intel_dp *intel_dp)  {
> -	if (intel_dp->psr.psr2_sel_fetch_enabled) {
> +	struct intel_display *display = to_intel_display(intel_dp);
> +
> +	if (DISPLAY_VER(display) < 20 && intel_dp-
> >psr.psr2_sel_fetch_enabled)
> +{
>  		if (!intel_dp->psr.psr2_sel_fetch_cff_enabled) {
>  			intel_dp->psr.psr2_sel_fetch_cff_enabled = true;
>  			intel_psr_configure_full_frame_update(intel_dp);
> @@ -3340,7 +3342,7 @@ static void _psr_flush_handle(struct intel_dp
> *intel_dp)  {
>  	struct intel_display *display = to_intel_display(intel_dp);
> 
> -	if (intel_dp->psr.psr2_sel_fetch_enabled) {
> +	if (DISPLAY_VER(display) < 20 && intel_dp-
> >psr.psr2_sel_fetch_enabled)
> +{
>  		if (intel_dp->psr.psr2_sel_fetch_cff_enabled) {
>  			/* can we turn CFF off? */
>  			if (intel_dp->psr.busy_frontbuffer_bits == 0) @@ -
> 3357,11 +3359,13 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
>  		 * existing SU configuration
>  		 */
>  		intel_psr_configure_full_frame_update(intel_dp);
> -	}
> 
> -	intel_psr_force_update(intel_dp);
> +		intel_psr_force_update(intel_dp);
> +	} else {
> +		intel_psr_exit(intel_dp);
> +	}
> 
> -	if (!intel_dp->psr.psr2_sel_fetch_enabled && !intel_dp->psr.active &&
> +	if ((!intel_dp->psr.psr2_sel_fetch_enabled || DISPLAY_VER(display) >=
> +20) &&
>  	    !intel_dp->psr.busy_frontbuffer_bits)
>  		queue_work(display->wq.unordered, &intel_dp->psr.work);  }
> --
> 2.43.0



More information about the Intel-xe mailing list