i915-$(CONFIG_DRM_I915_CAPTURE_ERROR) += i915_gpu_error.o
 i915-$(CONFIG_DRM_I915_SELFTEST) += \
        selftests/i915_random.o \
-       selftests/i915_selftest.o
+       selftests/i915_selftest.o \
+       selftests/igt_flush_test.o
 
 # virtual gpu code
 i915-y += i915_vgpu.o
 
--- /dev/null
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2018 Intel Corporation
+ */
+
+#include "../i915_drv.h"
+
+#include "../i915_selftest.h"
+#include "igt_flush_test.h"
+
+struct wedge_me {
+       struct delayed_work work;
+       struct drm_i915_private *i915;
+       const void *symbol;
+};
+
+static void wedge_me(struct work_struct *work)
+{
+       struct wedge_me *w = container_of(work, typeof(*w), work.work);
+
+       pr_err("%pS timed out, cancelling all further testing.\n", w->symbol);
+
+       GEM_TRACE("%pS timed out.\n", w->symbol);
+       GEM_TRACE_DUMP();
+
+       i915_gem_set_wedged(w->i915);
+}
+
+static void __init_wedge(struct wedge_me *w,
+                        struct drm_i915_private *i915,
+                        long timeout,
+                        const void *symbol)
+{
+       w->i915 = i915;
+       w->symbol = symbol;
+
+       INIT_DELAYED_WORK_ONSTACK(&w->work, wedge_me);
+       schedule_delayed_work(&w->work, timeout);
+}
+
+static void __fini_wedge(struct wedge_me *w)
+{
+       cancel_delayed_work_sync(&w->work);
+       destroy_delayed_work_on_stack(&w->work);
+       w->i915 = NULL;
+}
+
+#define wedge_on_timeout(W, DEV, TIMEOUT)                              \
+       for (__init_wedge((W), (DEV), (TIMEOUT), __builtin_return_address(0)); \
+            (W)->i915;                                                 \
+            __fini_wedge((W)))
+
+int igt_flush_test(struct drm_i915_private *i915, unsigned int flags)
+{
+       struct wedge_me w;
+
+       cond_resched();
+
+       wedge_on_timeout(&w, i915, HZ)
+               i915_gem_wait_for_idle(i915, flags);
+
+       return i915_terminally_wedged(&i915->gpu_error) ? -EIO : 0;
+}
 
--- /dev/null
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2018 Intel Corporation
+ */
+
+#ifndef IGT_FLUSH_TEST_H
+#define IGT_FLUSH_TEST_H
+
+struct drm_i915_private;
+
+int igt_flush_test(struct drm_i915_private *i915, unsigned int flags);
+
+#endif /* IGT_FLUSH_TEST_H */
 
 
 #include "../i915_selftest.h"
 #include "i915_random.h"
+#include "igt_flush_test.h"
 
 #include "mock_context.h"
 #include "mock_drm.h"
        return READ_ONCE(h->seqno[rq->fence.context % (PAGE_SIZE/sizeof(u32))]);
 }
 
-struct wedge_me {
-       struct delayed_work work;
-       struct drm_i915_private *i915;
-       const void *symbol;
-};
-
-static void wedge_me(struct work_struct *work)
-{
-       struct wedge_me *w = container_of(work, typeof(*w), work.work);
-
-       pr_err("%pS timed out, cancelling all further testing.\n", w->symbol);
-
-       GEM_TRACE("%pS timed out.\n", w->symbol);
-       GEM_TRACE_DUMP();
-
-       i915_gem_set_wedged(w->i915);
-}
-
-static void __init_wedge(struct wedge_me *w,
-                        struct drm_i915_private *i915,
-                        long timeout,
-                        const void *symbol)
-{
-       w->i915 = i915;
-       w->symbol = symbol;
-
-       INIT_DELAYED_WORK_ONSTACK(&w->work, wedge_me);
-       schedule_delayed_work(&w->work, timeout);
-}
-
-static void __fini_wedge(struct wedge_me *w)
-{
-       cancel_delayed_work_sync(&w->work);
-       destroy_delayed_work_on_stack(&w->work);
-       w->i915 = NULL;
-}
-
-#define wedge_on_timeout(W, DEV, TIMEOUT)                              \
-       for (__init_wedge((W), (DEV), (TIMEOUT), __builtin_return_address(0)); \
-            (W)->i915;                                                 \
-            __fini_wedge((W)))
-
-static noinline int
-flush_test(struct drm_i915_private *i915, unsigned int flags)
-{
-       struct wedge_me w;
-
-       cond_resched();
-
-       wedge_on_timeout(&w, i915, HZ)
-               i915_gem_wait_for_idle(i915, flags);
-
-       return i915_terminally_wedged(&i915->gpu_error) ? -EIO : 0;
-}
-
 static void hang_fini(struct hang *h)
 {
        *h->batch = MI_BATCH_BUFFER_END;
 
        kernel_context_close(h->ctx);
 
-       flush_test(h->i915, I915_WAIT_LOCKED);
+       igt_flush_test(h->i915, I915_WAIT_LOCKED);
 }
 
 static bool wait_until_running(struct hang *h, struct i915_request *rq)
                if (err)
                        break;
 
-               err = flush_test(i915, 0);
+               err = igt_flush_test(i915, 0);
                if (err)
                        break;
        }
                if (err)
                        break;
 
-               err = flush_test(i915, 0);
+               err = igt_flush_test(i915, 0);
                if (err)
                        break;
        }
 
                i915_request_put(prev);
 
-               err = flush_test(i915, I915_WAIT_LOCKED);
+               err = igt_flush_test(i915, I915_WAIT_LOCKED);
                if (err)
                        break;
        }
        err = i915_subtests(tests, i915);
 
        mutex_lock(&i915->drm.struct_mutex);
-       flush_test(i915, I915_WAIT_LOCKED);
+       igt_flush_test(i915, I915_WAIT_LOCKED);
        mutex_unlock(&i915->drm.struct_mutex);
 
        i915_modparams.enable_hangcheck = saved_hangcheck;
 
  */
 
 #include "../i915_selftest.h"
+#include "igt_flush_test.h"
 
 #include "mock_context.h"
 
        return READ_ONCE(*seqno);
 }
 
-struct wedge_me {
-       struct delayed_work work;
-       struct drm_i915_private *i915;
-       const void *symbol;
-};
-
-static void wedge_me(struct work_struct *work)
-{
-       struct wedge_me *w = container_of(work, typeof(*w), work.work);
-
-       pr_err("%pS timed out, cancelling all further testing.\n", w->symbol);
-
-       GEM_TRACE("%pS timed out.\n", w->symbol);
-       GEM_TRACE_DUMP();
-
-       i915_gem_set_wedged(w->i915);
-}
-
-static void __init_wedge(struct wedge_me *w,
-                        struct drm_i915_private *i915,
-                        long timeout,
-                        const void *symbol)
-{
-       w->i915 = i915;
-       w->symbol = symbol;
-
-       INIT_DELAYED_WORK_ONSTACK(&w->work, wedge_me);
-       schedule_delayed_work(&w->work, timeout);
-}
-
-static void __fini_wedge(struct wedge_me *w)
-{
-       cancel_delayed_work_sync(&w->work);
-       destroy_delayed_work_on_stack(&w->work);
-       w->i915 = NULL;
-}
-
-#define wedge_on_timeout(W, DEV, TIMEOUT)                              \
-       for (__init_wedge((W), (DEV), (TIMEOUT), __builtin_return_address(0)); \
-            (W)->i915;                                                 \
-            __fini_wedge((W)))
-
-static noinline int
-flush_test(struct drm_i915_private *i915, unsigned int flags)
-{
-       struct wedge_me w;
-
-       cond_resched();
-
-       wedge_on_timeout(&w, i915, HZ)
-               i915_gem_wait_for_idle(i915, flags);
-
-       return i915_terminally_wedged(&i915->gpu_error) ? -EIO : 0;
-}
-
 static void spinner_end(struct spinner *spin)
 {
        *spin->batch = MI_BATCH_BUFFER_END;
                }
 
                spinner_end(&spin);
-               if (flush_test(i915, I915_WAIT_LOCKED)) {
+               if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
                        err = -EIO;
                        goto err_ctx;
                }
 err_spin:
        spinner_fini(&spin);
 err_unlock:
-       flush_test(i915, I915_WAIT_LOCKED);
+       igt_flush_test(i915, I915_WAIT_LOCKED);
        mutex_unlock(&i915->drm.struct_mutex);
        return err;
 }
 
                spinner_end(&spin_hi);
                spinner_end(&spin_lo);
-               if (flush_test(i915, I915_WAIT_LOCKED)) {
+               if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
                        err = -EIO;
                        goto err_ctx_lo;
                }
 err_spin_hi:
        spinner_fini(&spin_hi);
 err_unlock:
-       flush_test(i915, I915_WAIT_LOCKED);
+       igt_flush_test(i915, I915_WAIT_LOCKED);
        mutex_unlock(&i915->drm.struct_mutex);
        return err;
 }
 
                spinner_end(&spin_hi);
                spinner_end(&spin_lo);
-               if (flush_test(i915, I915_WAIT_LOCKED)) {
+               if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
                        err = -EIO;
                        goto err_ctx_lo;
                }
 err_spin_hi:
        spinner_fini(&spin_hi);
 err_unlock:
-       flush_test(i915, I915_WAIT_LOCKED);
+       igt_flush_test(i915, I915_WAIT_LOCKED);
        mutex_unlock(&i915->drm.struct_mutex);
        return err;