[PATCH 3/5] drm/i915/display/intel_psr: Fix intel_psr2_sel_fetch_et_alignment usage

Kahola, Mika mika.kahola at intel.com
Thu Mar 28 09:25:54 UTC 2024


> -----Original Message-----
> From: Hogander, Jouni <jouni.hogander at intel.com>
> Sent: Tuesday, March 19, 2024 2:33 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: Kahola, Mika <mika.kahola at intel.com>; Hogander, Jouni <jouni.hogander at intel.com>
> Subject: [PATCH 3/5] drm/i915/display/intel_psr: Fix intel_psr2_sel_fetch_et_alignment usage
> 
> Currently we are not aligning selective update area to cover cursor fully when cursor is not updated by itself but still in the
> selective update area. Fix this by checking cursor separately after drm_atomic_add_affected_planes.
> 
> Bspec: 68927
> 
> Fixes: 1bff93b8bc27 ("drm/i915/psr: Extend SU area to cover cursor fully if needed")

Reviewed-by: Mika Kahola <mika.kahola at intel.com>

> Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_psr.c | 55 ++++++++++++++----------
>  1 file changed, 33 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
> index 961f92d10241..e1a9399aa503 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -2140,21 +2140,36 @@ static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_st
>   * cursor fully when cursor is in SU area.
>   */
>  static void
> -intel_psr2_sel_fetch_et_alignment(struct intel_crtc_state *crtc_state,
> -				  struct intel_plane_state *cursor_state)
> +intel_psr2_sel_fetch_et_alignment(struct intel_atomic_state *state,
> +				  struct intel_crtc *crtc)
>  {
> -	struct drm_rect inter;
> +	struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
> +	struct intel_plane_state *new_plane_state;
> +	struct intel_plane *plane;
> +	int i;
> 
> -	if (!crtc_state->enable_psr2_su_region_et ||
> -	    !cursor_state->uapi.visible)
> +	if (!crtc_state->enable_psr2_su_region_et)
>  		return;
> 
> -	inter = crtc_state->psr2_su_area;
> -	if (!drm_rect_intersect(&inter, &cursor_state->uapi.dst))
> -		return;
> +	for_each_new_intel_plane_in_state(state, plane, new_plane_state, i) {
> +		struct drm_rect inter;
> 
> -	clip_area_update(&crtc_state->psr2_su_area, &cursor_state->uapi.dst,
> -			 &crtc_state->pipe_src);
> +		if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc)
> +			continue;
> +
> +		if (plane->id != PLANE_CURSOR)
> +			continue;
> +
> +		if (!new_plane_state->uapi.visible)
> +			continue;
> +
> +		inter = crtc_state->psr2_su_area;
> +		if (!drm_rect_intersect(&inter, &new_plane_state->uapi.dst))
> +			continue;
> +
> +		clip_area_update(&crtc_state->psr2_su_area, &new_plane_state->uapi.dst,
> +				 &crtc_state->pipe_src);
> +	}
>  }
> 
>  /*
> @@ -2197,8 +2212,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,  {
>  	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
>  	struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
> -	struct intel_plane_state *new_plane_state, *old_plane_state,
> -		*cursor_plane_state = NULL;
> +	struct intel_plane_state *new_plane_state, *old_plane_state;
>  	struct intel_plane *plane;
>  	bool full_update = false;
>  	int i, ret;
> @@ -2283,13 +2297,6 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
>  		damaged_area.x2 += new_plane_state->uapi.dst.x1 - src.x1;
> 
>  		clip_area_update(&crtc_state->psr2_su_area, &damaged_area, &crtc_state->pipe_src);
> -
> -		/*
> -		 * Cursor plane new state is stored to adjust su area to cover
> -		 * cursor are fully.
> -		 */
> -		if (plane->id == PLANE_CURSOR)
> -			cursor_plane_state = new_plane_state;
>  	}
> 
>  	/*
> @@ -2318,9 +2325,13 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
>  	if (ret)
>  		return ret;
> 
> -	/* Adjust su area to cover cursor fully as necessary */
> -	if (cursor_plane_state)
> -		intel_psr2_sel_fetch_et_alignment(crtc_state, cursor_plane_state);
> +	/*
> +	 * Adjust su area to cover cursor fully as necessary (early
> +	 * transport). This needs to be done after
> +	 * drm_atomic_add_affected_planes to ensure visible cursor is added into
> +	 * affected planes even when cursor is not updated by itself.
> +	 */
> +	intel_psr2_sel_fetch_et_alignment(state, crtc);
> 
>  	intel_psr2_sel_fetch_pipe_alignment(crtc_state);
> 
> --
> 2.34.1



More information about the Intel-gfx mailing list