diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_gt.c | 32 | ||||
-rw-r--r-- | lib/igt_gt.h | 2 |
2 files changed, 34 insertions, 0 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 */ |