Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- tests/gem_pread_after_blit.c | 82 +++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/tests/gem_pread_after_blit.c b/tests/gem_pread_after_blit.c index 0b8bfa6..e1a5260 100644 --- a/tests/gem_pread_after_blit.c +++ b/tests/gem_pread_after_blit.c @@ -50,6 +50,7 @@ #include "intel_chipset.h" #include "intel_io.h" #include "igt_aux.h" +#include "igt_gt.h" static drm_intel_bufmgr *bufmgr; struct intel_batchbuffer *batch; @@ -119,12 +120,26 @@ verify_small_read(drm_intel_bo *bo, uint32_t val) } } +typedef struct igt_hang_ring (*do_hang)(int fd); + +static struct igt_hang_ring no_hang(int fd) +{ + return (struct igt_hang_ring){0}; +} + +static struct igt_hang_ring bcs_hang(int fd) +{ + return igt_hang_ring(fd, batch->gen, batch->gen >= 6 ? I915_EXEC_BLT : I915_EXEC_DEFAULT); +} + static void do_test(int fd, int cache_level, drm_intel_bo *src[2], const uint32_t start[2], drm_intel_bo *tmp[2], - int loop) + int loop, do_hang do_hang_func) { + struct igt_hang_ring hang; + if (cache_level != -1) { gem_set_caching(fd, tmp[0]->handle, cache_level); gem_set_caching(fd, tmp[1]->handle, cache_level); @@ -133,32 +148,48 @@ static void do_test(int fd, int cache_level, do { /* First, do a full-buffer read after blitting */ intel_copy_bo(batch, tmp[0], src[0], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[0], start[0]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[1], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[0], start[1]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[0], width*height*4); + hang = do_hang_func(fd); verify_small_read(tmp[0], start[0]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[1], width*height*4); + hang = do_hang_func(fd); verify_small_read(tmp[0], start[1]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[0], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[0], start[0]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[0], width*height*4); intel_copy_bo(batch, tmp[1], src[1], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[0], start[0]); verify_large_read(tmp[1], start[1]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[0], src[0], width*height*4); intel_copy_bo(batch, tmp[1], src[1], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[1], start[1]); verify_large_read(tmp[0], start[0]); + igt_post_hang_ring(fd, hang); intel_copy_bo(batch, tmp[1], src[0], width*height*4); intel_copy_bo(batch, tmp[0], src[1], width*height*4); + hang = do_hang_func(fd); verify_large_read(tmp[0], start[1]); verify_large_read(tmp[1], start[0]); + igt_post_hang_ring(fd, hang); } while (--loop); } @@ -168,6 +199,16 @@ int fd; igt_main { const uint32_t start[2] = {0, 1024 * 1024 / 4}; + const struct { + const char *name; + int cache; + } tests[] = { + { "default", -1 }, + { "uncached", 0 }, + { "snooped", 1 }, + { "display", 2 }, + { NULL, -1 }, + }, *t; igt_skip_on_simulation(); @@ -185,40 +226,19 @@ igt_main dst[1] = drm_intel_bo_alloc(bufmgr, "dst bo", size, 4096); } - igt_subtest("normal") - do_test(fd, -1, src, start, dst, 1); + for (t = tests; t->name; t++) { + igt_subtest_f("%s-normal", t->name) + do_test(fd, t->cache, src, start, dst, 1, no_hang); - igt_subtest("interruptible") { igt_fork_signal_helper(); - do_test(fd, -1, src, start, dst, 100); + igt_subtest_f("%s-interruptible", t->name) + do_test(fd, t->cache, src, start, dst, 100, no_hang); igt_stop_signal_helper(); - } - igt_subtest("normal-uncached") - do_test(fd, 0, src, start, dst, 1); - - igt_subtest("interruptible-uncached") { - igt_fork_signal_helper(); - do_test(fd, 0, src, start, dst, 100); - igt_stop_signal_helper(); - } - - igt_subtest("normal-snoop") - do_test(fd, 1, src, start, dst, 1); - - igt_subtest("interruptible-snoop") { - igt_fork_signal_helper(); - do_test(fd, 1, src, start, dst, 100); - igt_stop_signal_helper(); - } - - igt_subtest("normal-display") - do_test(fd, 2, src, start, dst, 1); - - igt_subtest("interruptible-display") { - igt_fork_signal_helper(); - do_test(fd, 2, src, start, dst, 100); - igt_stop_signal_helper(); + igt_subtest_f("%s-hang", t->name) { + igt_require(igt_can_hang_ring(fd, batch->gen, -1)); + do_test(fd, t->cache, src, start, dst, 1, bcs_hang); + } } igt_fixture { -- 2.1.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx