tests/kms_pipe_crc_basic: Add gpu hang tests
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 22 May 2014 15:29:48 +0000 (17:29 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 22 May 2014 15:30:16 +0000 (17:30 +0200)
Currently pipe CRC support is broken after gpu hangs. This tests for
this bug.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
tests/kms_pipe_crc_basic.c

index eedb3f3..9eec4e6 100644 (file)
@@ -31,6 +31,7 @@
 #include "igt_debugfs.h"
 #include "igt_kms.h"
 #include "igt_aux.h"
+#include "ioctl_wrappers.h"
 
 typedef struct {
        int drm_fd;
@@ -38,6 +39,55 @@ typedef struct {
        struct igt_fb fb;
 } data_t;
 
+static uint64_t submit_batch(int fd, unsigned ring_id)
+{
+       const uint32_t batch[] = { MI_NOOP,
+                                  MI_BATCH_BUFFER_END };
+       struct drm_i915_gem_execbuffer2 execbuf;
+       struct drm_i915_gem_exec_object2 exec;
+       uint64_t presumed_offset;
+
+       gem_require_ring(fd, ring_id);
+
+       exec.handle = gem_create(fd, 4096);
+       gem_write(fd, exec.handle, 0, batch, sizeof(batch));
+       exec.relocation_count = 0;
+       exec.relocs_ptr = 0;
+       exec.alignment = 0;
+       exec.offset = 0;
+       exec.flags = 0;
+       exec.rsvd1 = 0;
+       exec.rsvd2 = 0;
+
+       execbuf.buffers_ptr = (uintptr_t)&exec;
+       execbuf.buffer_count = 1;
+       execbuf.batch_start_offset = 0;
+       execbuf.batch_len = sizeof(batch);
+       execbuf.cliprects_ptr = 0;
+       execbuf.num_cliprects = 0;
+       execbuf.DR1 = 0;
+       execbuf.DR4 = 0;
+       execbuf.flags = ring_id;
+       i915_execbuffer2_set_context_id(execbuf, 0);
+       execbuf.rsvd2 = 0;
+
+       gem_execbuf(fd, &execbuf);
+       gem_sync(fd, exec.handle);
+       presumed_offset = exec.offset;
+
+       igt_set_stop_rings(igt_to_stop_ring_flag(ring_id));
+
+       gem_execbuf(fd, &execbuf);
+       gem_sync(fd, exec.handle);
+
+       igt_assert(igt_get_stop_rings() == STOP_RING_NONE);
+       igt_assert(presumed_offset == exec.offset);
+
+       gem_close(fd, exec.handle);
+
+       return exec.offset;
+}
+
 static void test_bad_command(data_t *data, const char *cmd)
 {
        FILE *ctl;
@@ -127,10 +177,10 @@ static void test_read_crc(data_t *data, int pipe, unsigned flags)
 
 }
 
+data_t data = {0, };
+
 igt_main
 {
-       data_t data = {0, };
-
        igt_skip_on_simulation();
 
        igt_fixture {
@@ -167,6 +217,12 @@ igt_main
 
                        test_read_crc(&data, i, 0);
                }
+
+               igt_subtest_f("hang-read-crc-pipe-%c", 'A'+i) {
+                       submit_batch(data.drm_fd, I915_EXEC_RENDER);
+
+                       test_read_crc(&data, i, 0);
+               }
        }
 
        igt_fixture {