diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2020-05-19 10:56:13 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-12-13 12:01:31 +0000 |
commit | 24b5ca48b34a05554135b6fb68126f1a24eb9679 (patch) | |
tree | 896a0568e1daa98fd6a225a8da802ad4d9e69fc1 | |
parent | 31f063627aaadceaa3be6171b45e28a4b095ab2d (diff) |
endless-suspend
-rw-r--r-- | tests/i915/gem_exec_endless.c | 59 |
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; |