[igt-dev] [PATCH i-g-t 1/2] tests/kms_flip: Check for link reset during TS calibration as well
Shankar, Uma
uma.shankar at intel.com
Thu Jul 2 20:17:01 UTC 2020
> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, June 30, 2020 9:34 PM
> To: igt-dev at lists.freedesktop.org
> Subject: [igt-dev] [PATCH i-g-t 1/2] tests/kms_flip: Check for link reset during TS
> calibration as well
>
> The timestamp calibration can fail when using certain monitors with a behavior
> described in
>
> commit 60e8be7ccc72086a88d2eff3bcd02495fad5fa46
> Author: Imre Deak <imre.deak at intel.com>
> Date: Mon May 11 22:08:53 2020 +0300
>
> tests/kms_flip: Retry test in case of a DP/HDMI link reset
>
> As in the above commit, retry the calibration once if a hotplug was detected
> during the calibration.
Change looks good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
> tests/kms_flip.c | 75 +++++++++++++++++++++++++++++++++---------------
> 1 file changed, 52 insertions(+), 23 deletions(-)
>
> diff --git a/tests/kms_flip.c b/tests/kms_flip.c index 3a7314ad..86c5e871 100755
> --- a/tests/kms_flip.c
> +++ b/tests/kms_flip.c
> @@ -1115,7 +1115,7 @@ static void free_test_output(struct test_output *o)
> }
> }
>
> -static void calibrate_ts(struct test_output *o, int crtc_idx)
> +static bool calibrate_ts(struct test_output *o, int crtc_idx)
> {
> #define CALIBRATE_TS_STEPS 16
> drmVBlank wait;
> @@ -1125,6 +1125,7 @@ static void calibrate_ts(struct test_output *o, int
> crtc_idx)
> double expected;
> double mean;
> double stddev;
> + bool failed = false;
> int n;
>
> memset(&wait, 0, sizeof(wait));
> @@ -1176,7 +1177,18 @@ static void calibrate_ts(struct test_output *o, int
> crtc_idx)
> igt_assert_eq(errno, EINTR);
> }
> igt_assert(read(drm_fd, &ev, sizeof(ev)) == sizeof(ev));
> - igt_assert_eq(ev.sequence, last_seq + 1);
> +
> + if (failed)
> + continue;
> +
> + if (ev.sequence != last_seq + 1) {
> + igt_debug("Unexpected frame sequence %d vs. expected
> %d\n",
> + ev.sequence, last_seq + 1);
> + failed = true;
> +
> + /* Continue to flush all the events queued up */
> + continue;
> + }
>
> now = ev.tv_sec;
> now *= 1000000;
> @@ -1188,6 +1200,9 @@ static void calibrate_ts(struct test_output *o, int
> crtc_idx)
> last_seq = ev.sequence;
> }
>
> + if (failed)
> + return false;
> +
> expected = mode_frame_time(o);
>
> mean = igt_stats_get_mean(&stats);
> @@ -1207,6 +1222,30 @@ static void calibrate_ts(struct test_output *o, int
> crtc_idx)
> }
>
> o->vblank_interval = mean;
> +
> + return true;
> +}
> +
> +/*
> + * Some monitors with odd behavior signal a bad link after waking from
> +a power
> + * saving state and the subsequent (successful) modeset. This will
> +result in a
> + * link-retraining (DP) or async modeset (HDMI), which in turn makes
> +the test
> + * miss vblank/flip events and fail. Work around this by retrying the
> +test
> + * once in case of such a link reset event, which the driver signals
> +with a
> + * hotplug event.
> + */
> +static bool needs_retry_after_link_reset(struct udev_monitor *mon) {
> + bool hotplug_detected;
> +
> + igt_suspend_signal_helper();
> + hotplug_detected = igt_hotplug_detected(mon, 3);
> + igt_resume_signal_helper();
> +
> + if (hotplug_detected)
> + igt_debug("Retrying after a hotplug event\n");
> +
> + return hotplug_detected;
> }
>
> static void __run_test_on_crtc_set(struct test_output *o, int *crtc_idxs, @@ -
> 1259,6 +1298,9 @@ static void __run_test_on_crtc_set(struct test_output *o, int
> *crtc_idxs,
> kmstest_dump_mode(&o->kmode[i]);
>
> retry:
> + memset(&o->vblank_state, 0, sizeof(o->vblank_state));
> + memset(&o->flip_state, 0, sizeof(o->flip_state));
> +
> kmstest_unset_all_crtcs(drm_fd, resources);
>
> igt_flush_uevents(mon);
> @@ -1282,8 +1324,13 @@ retry:
> }
>
> /* quiescent the hw a bit so ensure we don't miss a single frame */
> - if (o->flags & TEST_CHECK_TS)
> - calibrate_ts(o, crtc_idxs[0]);
> + if (o->flags & TEST_CHECK_TS && !calibrate_ts(o, crtc_idxs[0])) {
> + igt_assert(!retried && needs_retry_after_link_reset(mon));
> +
> + retried = true;
> +
> + goto retry;
> + }
>
> if (o->flags & TEST_BO_TOOBIG) {
> int err = do_page_flip(o, o->fb_ids[1], true); @@ -1316,28
> +1363,10 @@ retry:
> if (o->flags & TEST_VBLANK)
> state_ok &= check_final_state(o, &o->vblank_state, elapsed);
>
> - /*
> - * Some monitors with odd behavior signal a bad link after waking from
> - * a power saving state and the subsequent (successful) modeset. This
> - * will result in a link-retraining (DP) or async modeset (HDMI),
> - * which in turn makes the test miss vblank/flip events and fail.
> - * Work around this by retrying the test once in case of such a link
> - * reset event, which the driver signals with a hotplug event.
> - */
> if (!state_ok) {
> - bool hotplug_detected;
> + igt_assert(!retried && needs_retry_after_link_reset(mon));
>
> - igt_suspend_signal_helper();
> - if (!retried)
> - hotplug_detected = igt_hotplug_detected(mon, 3);
> - igt_resume_signal_helper();
> -
> - igt_assert(!retried && hotplug_detected);
> -
> - igt_debug("Retrying after a hotplug event\n");
> retried = true;
> - memset(&o->vblank_state, 0, sizeof(o->vblank_state));
> - memset(&o->flip_state, 0, sizeof(o->flip_state));
>
> goto retry;
> }
> --
> 2.20.1
>
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
More information about the igt-dev
mailing list