summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-05-19 10:56:13 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2020-12-13 12:01:31 +0000
commit24b5ca48b34a05554135b6fb68126f1a24eb9679 (patch)
tree896a0568e1daa98fd6a225a8da802ad4d9e69fc1
parent31f063627aaadceaa3be6171b45e28a4b095ab2d (diff)
endless-suspend
-rw-r--r--tests/i915/gem_exec_endless.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/i915/gem_exec_endless.c b/tests/i915/gem_exec_endless.c
index f32e6dae..72edff1d 100644
--- a/tests/i915/gem_exec_endless.c
+++ b/tests/i915/gem_exec_endless.c
@@ -318,6 +318,46 @@ static void endless_dispatch(int i915, const struct intel_execution_engine2 *e)
gem_close(i915, handle);
}
+static void endless_suspend(int i915, unsigned int state)
+{
+ struct intel_execution_engine2 *e;
+ igt_spin_t *spin[MAX_ENGINES];
+ igt_spin_t *wait[MAX_ENGINES];
+ int count;
+
+ gem_quiescent_gpu(i915);
+
+ count = 0;
+ __for_each_physical_engine(i915, e) {
+ spin[count++] = igt_spin_new(i915,
+ .engine = e->flags,
+ .flags = IGT_SPIN_FENCE_OUT);
+ wait[count++] = igt_spin_new(i915,
+ .engine = e->flags,
+ .flags = IGT_SPIN_POLL_RUN);
+ }
+
+ igt_system_suspend_autoresume(state & 0xffff, state >> 16);
+
+ for (int n = 0; n < count; n++) {
+ igt_assert(gem_bo_busy(i915, spin[n]->handle));
+ igt_assert(gem_bo_busy(i915, wait[n]->handle));
+ igt_assert(!igt_spin_has_started(wait[n]));
+
+ igt_spin_end(spin[n]);
+ igt_spin_busywait_until_started(wait[n]);
+
+ igt_assert(!gem_bo_busy(i915, spin[n]->handle));
+ igt_assert_eq(sync_fence_status(spin[n]->out_fence), 1);
+ igt_spin_free(i915, spin[n]);
+
+ igt_assert(gem_bo_busy(i915, wait[n]->handle));
+ igt_spin_free(i915, wait[n]);
+ }
+
+ gem_quiescent_gpu(i915);
+}
+
#define test_each_engine(T, i915, e) \
igt_subtest_with_dynamic(T) __for_each_physical_engine(i915, e) \
for_each_if(gem_class_can_store_dword(i915, (e)->class)) \
@@ -360,6 +400,25 @@ igt_main
igt_require_gem(i915);
}
+ igt_subtest_with_dynamic("suspend") {
+ static const struct suspend {
+ const char *name;
+ unsigned int flags;
+ } phases[] = {
+#define TEST (SUSPEND_TEST_DEVICES << 16)
+ { "S0", SUSPEND_STATE_FREEZE },
+ { "S3-devices", SUSPEND_STATE_MEM | TEST },
+ { "S3", SUSPEND_STATE_MEM },
+ { "S4-devices", SUSPEND_STATE_DISK | TEST },
+ { "S4", SUSPEND_STATE_DISK },
+ { }
+ };
+
+ for (const struct suspend *s = phases; s->name; s++)
+ igt_dynamic_f("%s", s->name)
+ endless_suspend(i915, s->flags);
+ }
+
igt_subtest_group {
struct intel_mmio_data mmio;
int sysfs;