summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-02-22 21:17:12 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2017-02-22 21:19:12 +0000
commitee4e38f9350fd8c69a3b228b8caff329fcfd87be (patch)
treef8b600f9096150fc686388a7c67f015d3ac245ee /tests
parentf00c678a9df652f5459cd4417f027bd19c189b75 (diff)
igt/drv_missed_irq: Enable fault injection!
Fixes: 4c5ed71fa743 ("igt/drv_missed_irq: Clear pending IRQs before testing") Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99909 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests')
-rw-r--r--tests/drv_missed_irq.c76
1 files changed, 52 insertions, 24 deletions
diff --git a/tests/drv_missed_irq.c b/tests/drv_missed_irq.c
index 896f1c59..3b789a6c 100644
--- a/tests/drv_missed_irq.c
+++ b/tests/drv_missed_irq.c
@@ -88,9 +88,8 @@ static void trigger_missed_interrupt(int fd, unsigned ring)
* parent. We will have to wait for our parent to sleep
* (gem_sync -> i915_wait_request) before we run.
*/
- do {
- sleep(1);
- } while (*((volatile uint32_t *)batch + 1000));
+ igt_assert(*((volatile uint32_t *)batch + 1000) == 0);
+ igt_assert(gem_bo_busy(fd, obj.handle));
*batch = MI_BATCH_BUFFER_END;
__sync_synchronize();
@@ -112,10 +111,55 @@ static void bind_to_cpu(int cpu)
igt_assert(sched_setscheduler(getpid(), SCHED_RR | SCHED_RESET_ON_FORK, &rt) == 0);
}
+static uint32_t engine_mask(void)
+{
+ uint32_t mask;
+ FILE *file;
+
+ file = igt_debugfs_fopen("i915_ring_test_irq", "w");
+ fprintf(file, "0x%x", -1);
+ fclose(file);
+
+ mask = -1;
+ file = igt_debugfs_fopen("i915_ring_test_irq", "r");
+ igt_ignore_warn(fscanf(file, "%x", &mask));
+ fclose(file);
+
+ file = igt_debugfs_fopen("i915_ring_test_irq", "w");
+ fprintf(file, "0");
+ fclose(file);
+
+ return mask;
+}
+
+static void enable_missed_irq(void)
+{
+ FILE *file;
+
+ file = igt_debugfs_fopen("i915_ring_test_irq", "w");
+ fprintf(file, "0x%x", -1);
+ fclose(file);
+}
+
+static uint32_t disable_missed_irq(void)
+{
+ FILE *file;
+ uint32_t mask = 0;
+
+ file = igt_debugfs_fopen("i915_ring_test_irq", "r");
+ igt_ignore_warn(fscanf(file, "%x", &mask));
+ fclose(file);
+
+ file = igt_debugfs_fopen("i915_ring_test_irq", "w");
+ fprintf(file, "0");
+ fclose(file);
+
+ return mask;
+}
+
igt_simple_main
{
const struct intel_execution_engine *e;
- FILE *file;
unsigned expect_rings;
unsigned missed_rings;
unsigned check_rings;
@@ -129,18 +173,7 @@ igt_simple_main
gem_require_mmap_wc(fd);
igt_fork_hang_detector(fd);
- file = igt_debugfs_fopen("i915_ring_test_irq", "w");
- fprintf(file, "0x%x", -1);
- fclose(file);
-
- expect_rings = -1;
- file = igt_debugfs_fopen("i915_ring_test_irq", "r");
- igt_ignore_warn(fscanf(file, "%x", &expect_rings));
- fclose(file);
-
- file = igt_debugfs_fopen("i915_ring_test_irq", "w");
- fprintf(file, "0");
- fclose(file);
+ expect_rings = engine_mask();
igt_debug("Clearing rings %x\n", expect_rings);
intel_detect_and_clear_missed_interrupts(fd);
@@ -158,6 +191,8 @@ igt_simple_main
igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
igt_debug("Testing rings %x\n", expect_rings);
+ enable_missed_irq();
+
intel_detect_and_clear_missed_interrupts(fd);
for (e = intel_execution_engines; e->name; e++) {
if (expect_rings == -1 && e->exec_id)
@@ -172,16 +207,9 @@ igt_simple_main
}
missed_rings = intel_detect_and_clear_missed_interrupts(fd);
- check_rings = -1;
- file = igt_debugfs_fopen("i915_ring_test_irq", "r");
- igt_ignore_warn(fscanf(file, "%x", &check_rings));
- fclose(file);
+ check_rings = disable_missed_irq();
igt_assert_eq_u32(check_rings, expect_rings);
- file = igt_debugfs_fopen("i915_ring_test_irq", "w");
- fprintf(file, "%x", 0);
- fclose(file);
-
if (expect_rings == -1)
igt_assert_eq_u32(missed_rings, 1);
else