This is a probable reason for some of the sporadic kms_flip failures.
One such is https://bugs.freedesktop.org/show_bug.cgi?id=59834.

v2:
- use unsigned long for KDSETMODE/KDGETMODE
- fix passing the parameter to KDGETMODE as it should be by value
- actually testing that it works..

Signed-off-by: Imre Deak <imre.d...@intel.com>
---
 tests/kms_flip.c |   33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 39f0043..601a4a1 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -36,6 +36,7 @@
 #include <sys/time.h>
 #include <sys/mman.h>
 #include <sys/ioctl.h>
+#include <linux/kd.h>
 
 #include "i915_drm.h"
 #include "drmtest.h"
@@ -1072,6 +1073,13 @@ static void run_test_on_crtc(struct test_output *o, int 
crtc, int duration)
        }
        assert(fb_is_bound(o, o->fb_ids[0]));
 
+       /*
+        * Make sure we're unblanked if for example the test was started with
+        * the console blanked. In this case the kernel might do a DPMS_ON in
+        * the above mode set call, but it's not guaranteed.
+        */
+       do_or_die(set_dpms(o, DRM_MODE_DPMS_ON));
+
        /* quiescent the hw a bit so ensure we don't miss a single frame */
        if (o->flags & TEST_CHECK_TS)
                sleep(1);
@@ -1153,6 +1161,21 @@ static void get_timestamp_format(void)
                monotonic_timestamp ? "monotonic" : "real");
 }
 
+static unsigned long set_vt_mode(unsigned long mode)
+{
+       int fd;
+       unsigned long prev_mode;
+
+       fd = open("/dev/tty0", O_RDONLY);
+       assert(fd >= 0);
+
+       prev_mode = 0;
+       drmIoctl(fd, KDGETMODE, &prev_mode);
+       drmIoctl(fd, KDSETMODE, (void *)mode);
+
+       return prev_mode;
+}
+
 int main(int argc, char **argv)
 {
        struct {
@@ -1200,13 +1223,18 @@ int main(int argc, char **argv)
                { 1, TEST_FLIP | TEST_EINVAL | TEST_FB_BAD_TILING, 
"flip-vs-bad-tiling" },
        };
        int i;
+       bool dry_run;
+       unsigned long prev_vt_mode;
 
        drmtest_subtest_init(argc, argv);
 
        drm_fd = drm_open_any();
 
-       if (!drmtest_only_list_subtests())
+       dry_run = drmtest_only_list_subtests();
+       if (!dry_run) {
+               prev_vt_mode = set_vt_mode(KD_GRAPHICS);
                get_timestamp_format();
+       }
 
        bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
        devid = intel_get_drm_devid(drm_fd);
@@ -1219,6 +1247,9 @@ int main(int argc, char **argv)
                }
        }
 
+       if (!dry_run)
+               set_vt_mode(prev_vt_mode);
+
        close(drm_fd);
 
        return 0;
-- 
1.7.10.4

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

Reply via email to