Since the modeline may differ from actual hardware timings, do not rely
upon it but instead measure the actual and verify that it does not
change across the various flip/vblank configurations.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 tests/kms_flip.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 74754d1..6a1549e 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -177,6 +177,8 @@ struct test_output {
        int seq_step;
        unsigned int pending_events;
        int flip_count;
+
+       double vblank_interval;
 };
 
 
@@ -579,6 +581,12 @@ static double mode_frame_time(const struct test_output *o)
        return 1000.0 * o->kmode[0].htotal * o->kmode[0].vtotal / 
o->kmode[0].clock;
 }
 
+static double actual_frame_time(const struct test_output *o)
+{
+       igt_assert(o->flags & TEST_CHECK_TS);
+       return o->vblank_interval;
+}
+
 static void *vblank_wait_thread_func(void *data)
 {
        struct test_output *o = data;
@@ -687,12 +695,12 @@ static void check_state(const struct test_output *o, 
const struct event_state *e
                          es->current_seq, es->last_seq);
        }
 
-       if ((o->flags & TEST_CHECK_TS) && (!analog_tv_connector(o))) {
+       if (o->flags & TEST_CHECK_TS) {
                double elapsed, expected;
 
                timersub(&es->current_ts, &es->last_ts, &diff);
                elapsed = 1e6*diff.tv_sec + diff.tv_usec;
-               expected = (es->current_seq - es->last_seq) * 
mode_frame_time(o);
+               expected = (es->current_seq - es->last_seq) * 
actual_frame_time(o);
 
                igt_debug("%s ts/seq: last %ld.%06ld/%u, current %ld.%06ld/%u: 
elapsed=%.1fus expected=%.1fus +- %.1fus, error %.1f%%\n",
                          es->name, es->last_ts.tv_sec, es->last_ts.tv_usec, 
es->last_seq,
@@ -1192,17 +1200,17 @@ static void check_final_state(const struct test_output 
*o,
 
        /* Verify we drop no frames, but only if it's not a TV encoder, since
         * those use some funny fake timings behind userspace's back. */
-       if (o->flags & TEST_CHECK_TS && !analog_tv_connector(o)) {
+       if (o->flags & TEST_CHECK_TS) {
                int count = es->count * o->seq_step;
-               unsigned int min = mode_frame_time(o) * (count - 1);
-               unsigned int max = mode_frame_time(o) * (count + 1);
+               unsigned int min = actual_frame_time(o) * (count - 1);
+               unsigned int max = actual_frame_time(o) * (count + 1);
 
                igt_debug("expected %d, counted %d, encoder type %d\n",
-                         (int)(elapsed / mode_frame_time(o)), count,
+                         (int)(elapsed / actual_frame_time(o)), count,
                          o->kencoder[0]->encoder_type);
                igt_assert_f(elapsed >= min && elapsed <= max,
                             "dropped frames, expected %d, counted %d, encoder 
type %d\n",
-                            (int)(elapsed / mode_frame_time(o)), count,
+                            (int)(elapsed / actual_frame_time(o)), count,
                             o->kencoder[0]->encoder_type);
        }
 }
@@ -1361,10 +1369,13 @@ static void calibrate_ts(struct test_output *o, int 
crtc_idx)
                 expected, mean, stddev, 100 * 6 * stddev / mean);
        igt_assert(6 * stddev / mean < 0.005); /* 99% accuracy within 0.5% */
 
-       igt_require_f(fabs(mean - expected) < 2*stddev,
-                     "vblank interval differs from modeline! expected %.1fus, 
measured %1.fus +- %.3fus, difference %.1fus (%.1f sigma)\n",
-                     expected, mean, stddev,
-                     fabs(mean - expected), fabs(mean - expected) / stddev);
+       if (fabs(mean - expected) > 2*stddev) {
+               igt_warn("vblank interval differs from modeline! expected 
%.1fus, measured %1.fus +- %.3fus, difference %.1fus (%.1f sigma)\n",
+                               expected, mean, stddev,
+                               fabs(mean - expected), fabs(mean - expected) / 
stddev);
+       }
+
+       o->vblank_interval = mean;
 }
 
 static void run_test_on_crtc_set(struct test_output *o, int *crtc_idxs,
-- 
2.10.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to