[igt-dev] [PATCH i-g-t] tests/i915/kms_big_fb: trigger async flip with a dummy flip
Murthy, Arun R
arun.r.murthy at intel.com
Tue Jul 5 10:16:33 UTC 2022
> On 7/5/2022 3:08 PM, Murthy, Arun R wrote:
> >> On 6/28/2022 4:34 PM, Arun R Murthy wrote:
> >>> In oder to trigger the async flip, a dummy flip is required after
> >>> sync flip so as to update the watermarks for async in KMD which
> >>> happens as part of this dummy flip. Thereafter async memory update
> >>> will act as a trigger register.
> >>> Capturing the CRC is done after the async flip as async flip at some
> >>> times can consume fairly a vblank period time.
> >>>
> >>> Signed-off-by: Arun R Murthy <arun.r.murthy at intel.com>
> >>> ---
> >>> tests/i915/kms_big_fb.c | 29 +++++++++++++++++++----------
> >>> 1 file changed, 19 insertions(+), 10 deletions(-)
> >>>
> >>> diff --git a/tests/i915/kms_big_fb.c b/tests/i915/kms_big_fb.c index
> >>> d50fde45..6caf3c31 100644
> >>> --- a/tests/i915/kms_big_fb.c
> >>> +++ b/tests/i915/kms_big_fb.c
> >>> @@ -465,7 +465,7 @@ static bool test_pipe(data_t *data)
> >>> static bool
> >>> max_hw_stride_async_flip_test(data_t *data)
> >>> {
> >>> - uint32_t ret, startframe;
> >>> + uint32_t ret, frame;
> >>> const uint32_t w = data->output->config.default_mode.hdisplay,
> >>> h = data->output->config.default_mode.vdisplay;
> >>> igt_plane_t *primary;
> >>> @@ -519,7 +519,19 @@ max_hw_stride_async_flip_test(data_t *data)
> >>>
> >> DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> >>> igt_wait_for_vblank(data->drm_fd, data-
> >>> display.pipes[primary->pipe->pipe].crtc_offset);
> >>> - startframe = kmstest_get_vblank(data->drm_fd, data->pipe,
> >> 0) + 1;
> >>> + /*
> >>> + * 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.
> >>> + */
> >>> + ret = drmModePageFlip(data->drm_fd, data->output-
> >>> config.crtc->crtc_id,
> >>> + data->big_fb_flip[i].fb_id,
> >>> +
> >> DRM_MODE_PAGE_FLIP_ASYNC, NULL);
> >>> + igt_wait_for_vblank(data->drm_fd, data-
> >>> display.pipes[primary->pipe->pipe].crtc_offset);
> >>> + frame = kmstest_get_vblank(data->drm_fd, data->pipe, 0) +
> >> 1;
> >>
> >> Hi,
> >>
> >> Should this be added inside a gen check similar to kms_async_flips?
> > Yes sorry missed it!
> >
> >>> for (int j = 0; j < 2; j++) {
> >>> do {
> >>> @@ -528,23 +540,20 @@ max_hw_stride_async_flip_test(data_t *data)
> >>>
> >> DRM_MODE_PAGE_FLIP_ASYNC, NULL);
> >>> } while (ret == -EBUSY);
> >>> igt_assert(ret == 0);
> >>> + igt_pipe_crc_get_for_frame(data->drm_fd, data-
> >>> pipe_crc,
> >>> + frame, &compare_crc);
> >>>
> >>> + frame = kmstest_get_vblank(data->drm_fd, data-
> >>> pipe, 0) + 1;
> >>> do {
> >>> ret = drmModePageFlip(data->drm_fd, data-
> >>> output->config.crtc->crtc_id,
> >>> data->big_fb.fb_id,
> >>>
> >> DRM_MODE_PAGE_FLIP_ASYNC, NULL);
> >>> } while (ret == -EBUSY);
> >>> igt_assert(ret == 0);
> >>> + igt_pipe_crc_get_for_frame(data->drm_fd, data-
> >>> pipe_crc,
> >>> + frame, &async_crc);
> >> We should be moving this IMHO. By waiting for vblank after each async
> >> flip to capture CRC, what is the intended result? Seems to be
> >> completely changing the existing test logic.
> > We are getting the vblank count and based on that getting the crc. Now
> > we know for async flip at certain times it can consume a time
> > equivalent to a vblank period. So in those scenarios getting crc based
> > on the vblank goes for a toss. Hence capturing the vblank start time stamp
> at the beginning of each flip.
>
> Hi,
>
> But what is the the reference CRC we're expecting? The original logic is
> designed to match on one iteration and mismatch on the next using a
> combination of fb's by using async flips. But with these changes that whole
> logic goes for a toss?
>
But I see this logic doesn’t work. We cannot rely on the CRC based on the vblank time frame for each flips. Since this is a async flip and at times the async flip can consume a vblank time period for flipping. So the CRC captured based on starteframe+1 logic is not right.
Thanks and Regards,
Arun R Murthy
--------------------
More information about the igt-dev
mailing list