diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-01-22 17:33:40 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-01-22 17:45:06 +0000 |
commit | 5b675f7b2f6487548a91c01eb9a7e36e808617b4 (patch) | |
tree | 8812e54f7fc5467635b7e9aaf1ccc503d3c87014 | |
parent | e0ee36141ed1747f68580559a7cbfbeba902f05c (diff) |
lib: Refactor common detection of missed interrupts
As we have the same function in a few places to read the
debugfs/i915_ring_missed_irq file, move it to the core.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | lib/igt_gt.c | 32 | ||||
-rw-r--r-- | lib/igt_gt.h | 2 | ||||
-rw-r--r-- | tests/gem_concurrent_all.c | 27 | ||||
-rw-r--r-- | tests/gem_ring_sync_loop.c | 27 | ||||
-rw-r--r-- | tests/gem_sync.c | 27 |
5 files changed, 42 insertions, 73 deletions
diff --git a/lib/igt_gt.c b/lib/igt_gt.c index 84d764a9..149435cd 100644 --- a/lib/igt_gt.c +++ b/lib/igt_gt.c @@ -501,3 +501,35 @@ void igt_clflush_range(void *addr, int size) asm volatile("clflush %0" : "+m" (*(volatile char *)p)); asm volatile("mfence" ::: "memory"); } + +/** + * intel_detect_and_clear_missed_irq: + * @fd: open i915 drm file descriptor, used to quiesce the gpu + * + * This functions idles the GPU and then queries whether there has + * been a missed interrupt reported by the driver. Afterwards it + * clears the missed interrupt flag, in order to disable the timer + * fallback for the next test. + */ +unsigned intel_detect_and_clear_missed_interrupts(int fd) +{ + unsigned missed = 0; + FILE *file; + + gem_quiescent_gpu(fd); + + file = igt_debugfs_fopen("i915_ring_missed_irq", "r"); + if (file) { + igt_assert(fscanf(file, "%x", &missed) == 1); + fclose(file); + } + if (missed) { + file = igt_debugfs_fopen("i915_ring_missed_irq", "w"); + if (file) { + fwrite("0\n", 1, 2, file); + fclose(file); + } + } + + return missed; +} diff --git a/lib/igt_gt.h b/lib/igt_gt.h index 3d81ec95..4cf898a2 100644 --- a/lib/igt_gt.h +++ b/lib/igt_gt.h @@ -89,4 +89,6 @@ enum stop_ring_flags igt_get_stop_rings(void); int igt_setup_clflush(void); void igt_clflush_range(void *addr, int size); +unsigned intel_detect_and_clear_missed_interrupts(int fd); + #endif /* IGT_GT_H */ diff --git a/tests/gem_concurrent_all.c b/tests/gem_concurrent_all.c index 9fcced73..cc0e4565 100644 --- a/tests/gem_concurrent_all.c +++ b/tests/gem_concurrent_all.c @@ -755,26 +755,6 @@ static struct igt_hang_ring rcs_hang(void) return igt_hang_ring(fd, I915_EXEC_RENDER); } -static void check_gpu(void) -{ - unsigned missed_irq = 0; - FILE *file; - - gem_quiescent_gpu(fd); - - file = igt_debugfs_fopen("i915_ring_missed_irq", "r"); - if (file) { - fscanf(file, "%x", &missed_irq); - fclose(file); - } - file = igt_debugfs_fopen("i915_ring_missed_irq", "w"); - if (file) { - fwrite("0\n", 1, 2, file); - fclose(file); - } - igt_assert_eq(missed_irq, 0); -} - static void do_basic0(struct buffers *buffers, do_copy do_copy_func, do_hang do_hang_func) @@ -1135,7 +1115,7 @@ static void run_single(struct buffers *buffers, do_hang do_hang_func) { do_test_func(buffers, do_copy_func, do_hang_func); - check_gpu(); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); } static void run_interruptible(struct buffers *buffers, @@ -1146,7 +1126,7 @@ static void run_interruptible(struct buffers *buffers, for (pass = 0; pass < 10; pass++) do_test_func(buffers, do_copy_func, do_hang_func); pass = 0; - check_gpu(); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); } static void __run_forked(struct buffers *buffers, @@ -1177,7 +1157,7 @@ static void __run_forked(struct buffers *buffers, } igt_waitchildren(); - check_gpu(); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); num_buffers = old_num_buffers; } @@ -1473,6 +1453,7 @@ igt_main igt_fixture { fd = drm_open_driver(DRIVER_INTEL); + intel_detect_and_clear_missed_interrupts(fd); devid = intel_get_drm_devid(fd); gen = intel_gen(devid); rendercopy = igt_get_render_copyfunc(devid); diff --git a/tests/gem_ring_sync_loop.c b/tests/gem_ring_sync_loop.c index 721cce9e..ca9f5687 100644 --- a/tests/gem_ring_sync_loop.c +++ b/tests/gem_ring_sync_loop.c @@ -91,39 +91,16 @@ sync_loop(int fd) gem_close(fd, object[0].handle); } -static unsigned intel_detect_and_clear_missed_irq(int fd) -{ - unsigned missed = 0; - FILE *file; - - gem_quiescent_gpu(fd); - - file = igt_debugfs_fopen("i915_ring_missed_irq", "r"); - if (file) { - igt_assert(fscanf(file, "%x", &missed) == 1); - fclose(file); - } - if (missed) { - file = igt_debugfs_fopen("i915_ring_missed_irq", "w"); - if (file) { - fwrite("0\n", 1, 2, file); - fclose(file); - } - } - - return missed; -} - igt_simple_main { int fd; fd = drm_open_driver(DRIVER_INTEL); igt_require(gem_get_num_rings(fd) > 1); - intel_detect_and_clear_missed_irq(fd); /* clear before we begin */ + intel_detect_and_clear_missed_interrupts(fd); sync_loop(fd); - igt_assert_eq(intel_detect_and_clear_missed_irq(fd), 0); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); close(fd); } diff --git a/tests/gem_sync.c b/tests/gem_sync.c index 7c3b7ee5..8b7490d7 100644 --- a/tests/gem_sync.c +++ b/tests/gem_sync.c @@ -33,29 +33,6 @@ IGT_TEST_DESCRIPTION("Basic check of ring<->ring write synchronisation."); * Extremely efficient at catching missed irqs */ -static unsigned intel_detect_and_clear_missed_irq(int fd) -{ - unsigned missed = 0; - FILE *file; - - gem_quiescent_gpu(fd); - - file = igt_debugfs_fopen("i915_ring_missed_irq", "r"); - if (file) { - igt_assert(fscanf(file, "%x", &missed) == 1); - fclose(file); - } - if (missed) { - file = igt_debugfs_fopen("i915_ring_missed_irq", "w"); - if (file) { - fwrite("0\n", 1, 2, file); - fclose(file); - } - } - - return missed; -} - static double gettime(void) { static clockid_t clock = -1; @@ -105,7 +82,7 @@ sync_ring(int fd, int ring, unsigned flags) double start, elapsed; unsigned long cycles; - intel_detect_and_clear_missed_irq(fd); /* clear before we begin */ + intel_detect_and_clear_missed_interrupts(fd); memset(&object, 0, sizeof(object)); object.handle = gem_create(fd, 4096); @@ -130,7 +107,7 @@ sync_ring(int fd, int ring, unsigned flags) igt_info("Completed %ld cycles: %.3f us\n", cycles, elapsed*1e6/cycles); gem_close(fd, object.handle); - igt_assert_eq(intel_detect_and_clear_missed_irq(fd), 0); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); } igt_main |