[PATCH v2 4/5] drm/i915: Eliminate extra frame from skl-glk sync->async flip change
Murthy, Arun R
arun.r.murthy at intel.com
Fri May 3 07:12:26 UTC 2024
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Tuesday, April 30, 2024 3:27 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [PATCH v2 4/5] drm/i915: Eliminate extra frame from skl-glk sync-
> >async flip change
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> On bdw-glk the sync->async flip change takes an extra frame due to the double
> buffering behaviour of the async flip plane control bit.
>
> Since on skl+ we are now explicitly converting the first async flip to a sync flip
> (in order to allow changing the modifier and/or
> ddb/watermarks) we are now taking two extra frames until async flips are
> actually active. We can drop that back down to one frame by setting the async
> flip bit already during the sync flip.
>
> Note that on bdw we don't currently do the extra sync flip (see
> intel_plane_do_async_flip()) so technically we wouldn't have to deal with this in
> i9xx_plane_update_arm(). But I added the relevant snippet of code there as
> well, just in case we ever decide to go for the extra sync flip on pre-skl platforms
> as well (we might, for example, want to change the fb stride).
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Reviewed-by: Arun R Murthy <arun.r.murthy at intel.com>
Thanks and Regards,
Arun R Murthy
--------------------
> ---
> drivers/gpu/drm/i915/display/i9xx_plane.c | 5 +++++
> drivers/gpu/drm/i915/display/intel_atomic_plane.c | 15 +++++++++++----
> .../gpu/drm/i915/display/skl_universal_plane.c | 5 +++++
> 3 files changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c
> b/drivers/gpu/drm/i915/display/i9xx_plane.c
> index 0279c8aabdd1..76fc7626051b 100644
> --- a/drivers/gpu/drm/i915/display/i9xx_plane.c
> +++ b/drivers/gpu/drm/i915/display/i9xx_plane.c
> @@ -455,6 +455,11 @@ static void i9xx_plane_update_arm(struct intel_plane
> *plane,
>
> dspcntr = plane_state->ctl | i9xx_plane_ctl_crtc(crtc_state);
>
> + /* see intel_plane_atomic_calc_changes() */
> + if (plane->need_async_flip_disable_wa &&
> + crtc_state->async_flip_planes & BIT(plane->id))
> + dspcntr |= DISP_ASYNC_FLIP;
> +
> linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
>
> if (DISPLAY_VER(dev_priv) >= 4)
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> index 769010d0ebc4..7098a34a17c8 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> @@ -437,10 +437,6 @@ static bool intel_plane_do_async_flip(struct
> intel_plane *plane,
> * only X-tile is supported with async flips, though we could
> * extend this so other scanout parameters (stride/etc) could
> * be changed as well...
> - *
> - * FIXME: Platforms with need_async_flip_disable_wa==true will
> - * now end up doing two sync flips initially. Would be nice to
> - * combine those into just the one sync flip...
> */
> return DISPLAY_VER(i915) < 9 || old_crtc_state->uapi.async_flip; } @@
> -604,6 +600,17 @@ static int intel_plane_atomic_calc_changes(const struct
> intel_crtc_state *old_cr
> if (intel_plane_do_async_flip(plane, old_crtc_state, new_crtc_state)) {
> new_crtc_state->do_async_flip = true;
> new_crtc_state->async_flip_planes |= BIT(plane->id);
> + } else if (plane->need_async_flip_disable_wa &&
> + new_crtc_state->uapi.async_flip) {
> + /*
> + * On platforms with double buffered async flip bit we
> + * set the bit already one frame early during the sync
> + * flip (see {i9xx,skl}_plane_update_arm()). The
> + * hardware will therefore be ready to perform a real
> + * async flip during the next commit, without having
> + * to wait yet another frame for the bit to latch.
> + */
> + new_crtc_state->async_flip_planes |= BIT(plane->id);
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> index 860574d04f88..ad4c90344f68 100644
> --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> @@ -1174,6 +1174,11 @@ skl_plane_update_arm(struct intel_plane *plane,
> plane_ctl = plane_state->ctl |
> skl_plane_ctl_crtc(crtc_state);
>
> + /* see intel_plane_atomic_calc_changes() */
> + if (plane->need_async_flip_disable_wa &&
> + crtc_state->async_flip_planes & BIT(plane->id))
> + plane_ctl |= PLANE_CTL_ASYNC_FLIP;
> +
> if (DISPLAY_VER(dev_priv) >= 10)
> plane_color_ctl = plane_state->color_ctl |
> glk_plane_color_ctl_crtc(crtc_state);
> --
> 2.43.2
More information about the Intel-gfx
mailing list