[PATCH i-g-t 1/2] tests/kms_async_flips: Extend the "async flip needs an extra frame" logic

Kulkarni, Vandita vandita.kulkarni at intel.com
Thu Apr 11 10:15:13 UTC 2024


> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Saturday, March 23, 2024 2:07 AM
> To: igt-dev at lists.freedesktop.org
> Subject: [PATCH i-g-t 1/2] tests/kms_async_flips: Extend the "async flip
> needs an extra frame" logic
> 
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Soon i915 will be converting the first async flip always to a sync flip on SKL+.
> The reason being that Xorg/modesetting typically attempts to change the
> modifier when it issues the first async flip, and we can't do that with an actual
> async flip.
> 
> Extend the logic to consider all platforms that need the extra frame, which
> will now be:
> - BDW-GLK due to the async flip hw double buffer fail
> - SKL+ to change the modifier
> - ADL+ to optimize watermarks/DDB
> 
> Note that the 'AT_LEAST_GEN(devid, 12)' already included TGL in this logic
> despite the kernel not actually forcing any sync flips on it previously. So only
> ICL was being correctly excluded here. Also BDW wasn't being included
> despite needing it due to the double buffer fail.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---

Looks good to me.
Reviewed-by: Vandita Kulkarni <vandita.kulkarni at intel.com>

>  tests/kms_async_flips.c | 46 +++++++++++++++++++++++++----------------
>  1 file changed, 28 insertions(+), 18 deletions(-)
> 
> diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c index
> 2895168f7dc7..efbc8778d7e1 100644
> --- a/tests/kms_async_flips.c
> +++ b/tests/kms_async_flips.c
> @@ -233,6 +233,28 @@ static void test_init_fbs(data_t *data)
>  	igt_plane_set_size(data->plane, width, height);  }
> 
> +static bool async_flip_needs_extra_frame(data_t *data) {
> +	uint32_t devid;
> +
> +	if (!is_intel_device(data->drm_fd))
> +		return false;
> +
> +	devid = intel_get_drm_devid(data->drm_fd);
> +
> +	/*
> +	 * On BDW-GLK async address update bit is double buffered
> +	 * on vblank. So the first async flip will in fact be
> +	 * performed as a sync flip by the hardware.
> +	 *
> +	 * In order to allow the first async flip to change the modifier
> +	 * on SKL+ (needed by Xorg/modesetting), and to optimize
> +	 * watermarks/ddb for faster response on ADL+, we convert the
> +	 * first async flip to a sync flip.
> +	 */
> +	return intel_display_ver(devid) >= 9 || IS_BROADWELL(devid); }
> +
>  static void test_async_flip(data_t *data)  {
>  	int ret, frame;
> @@ -259,26 +281,14 @@ static void test_async_flip(data_t *data)
> 
>  			flags |= DRM_MODE_PAGE_FLIP_ASYNC;
> 
> -			/*
> -			 * In older platforms (<= Gen10), async address
> update bit is double buffered.
> -			 * So flip timestamp can be verified only from the
> second flip.
> -			 * The first async flip just enables the async address
> update.
> -			 * In platforms greater than DISPLAY13 the first async
> flip will be discarded
> -			 * in order to change the watermark levels as per the
> optimization. Hence the
> -			 * subsequent async flips will actually do the
> asynchronous flips.
> -			 */
> -			if (is_intel_device(data->drm_fd)) {
> -				uint32_t devid = intel_get_drm_devid(data-
> >drm_fd);
> +			if (async_flip_needs_extra_frame(data)) {
> +				ret = drmModePageFlip(data->drm_fd, data-
> >crtc_id,
> +						      data->bufs[frame %
> NUM_FBS].fb_id,
> +						      flags, data);
> 
> -				if (IS_GEN9(devid) || IS_GEN10(devid) ||
> AT_LEAST_GEN(devid, 12)) {
> -					ret = drmModePageFlip(data-
> >drm_fd, data->crtc_id,
> -							      data->bufs[frame
> % NUM_FBS].fb_id,
> -							      flags, data);
> +				igt_assert(ret == 0);
> 
> -					igt_assert(ret == 0);
> -
> -					wait_flip_event(data);
> -				}
> +				wait_flip_event(data);
>  			}
>  		}
> 
> --
> 2.43.2



More information about the igt-dev mailing list