summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-01-22 17:33:40 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-01-22 17:45:06 +0000
commit5b675f7b2f6487548a91c01eb9a7e36e808617b4 (patch)
tree8812e54f7fc5467635b7e9aaf1ccc503d3c87014
parente0ee36141ed1747f68580559a7cbfbeba902f05c (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.c32
-rw-r--r--lib/igt_gt.h2
-rw-r--r--tests/gem_concurrent_all.c27
-rw-r--r--tests/gem_ring_sync_loop.c27
-rw-r--r--tests/gem_sync.c27
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