diff options
author | John Harrison <John.C.Harrison@Intel.com> | 2022-01-14 10:17:11 -0800 |
---|---|---|
committer | Ashutosh Dixit <ashutosh.dixit@intel.com> | 2022-01-18 12:43:38 -0800 |
commit | 95ab495085dc0f271e7e1261020e372645d27cb9 (patch) | |
tree | 3d9b65082ef1cb136496adf242f65c518a526192 /lib/i915 | |
parent | 86023757642cf7201ec4043030487194f2b243c4 (diff) |
lib/i915: Add helper for non-destructive engine property updates
Various tests want to configure engine properties such as pre-emption
timeout and heartbeat interval. Some don't bother to restore the
original values again afterwards. So, add a helper to make it easier
to do this.
v2: Fix for platforms with no pre-emption capability.
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Diffstat (limited to 'lib/i915')
-rw-r--r-- | lib/i915/gem_engine_topology.c | 46 | ||||
-rw-r--r-- | lib/i915/gem_engine_topology.h | 9 |
2 files changed, 55 insertions, 0 deletions
diff --git a/lib/i915/gem_engine_topology.c b/lib/i915/gem_engine_topology.c index 729f42b0..bd12d0bc 100644 --- a/lib/i915/gem_engine_topology.c +++ b/lib/i915/gem_engine_topology.c @@ -488,6 +488,52 @@ int gem_engine_property_printf(int i915, const char *engine, const char *attr, return ret; } +/* Ensure fast hang detection */ +void gem_engine_properties_configure(int fd, struct gem_engine_properties *params) +{ + int ret; + struct gem_engine_properties write = *params; + + ret = gem_engine_property_scanf(fd, write.engine->name, + "heartbeat_interval_ms", + "%d", ¶ms->heartbeat_interval); + igt_assert_eq(ret, 1); + + ret = gem_engine_property_printf(fd, write.engine->name, + "heartbeat_interval_ms", "%d", + write.heartbeat_interval); + igt_assert_lt(0, ret); + + if (gem_scheduler_has_preemption(fd)) { + ret = gem_engine_property_scanf(fd, write.engine->name, + "preempt_timeout_ms", + "%d", ¶ms->preempt_timeout); + igt_assert_eq(ret, 1); + + ret = gem_engine_property_printf(fd, write.engine->name, + "preempt_timeout_ms", "%d", + write.preempt_timeout); + igt_assert_lt(0, ret); + } +} + +void gem_engine_properties_restore(int fd, const struct gem_engine_properties *saved) +{ + int ret; + + ret = gem_engine_property_printf(fd, saved->engine->name, + "heartbeat_interval_ms", "%d", + saved->heartbeat_interval); + igt_assert_lt(0, ret); + + if (gem_scheduler_has_preemption(fd)) { + ret = gem_engine_property_printf(fd, saved->engine->name, + "preempt_timeout_ms", "%d", + saved->preempt_timeout); + igt_assert_lt(0, ret); + } +} + uint32_t gem_engine_mmio_base(int i915, const char *engine) { unsigned int mmio = 0; diff --git a/lib/i915/gem_engine_topology.h b/lib/i915/gem_engine_topology.h index 4cfab560..b413aa8a 100644 --- a/lib/i915/gem_engine_topology.h +++ b/lib/i915/gem_engine_topology.h @@ -115,6 +115,15 @@ struct intel_execution_engine2 gem_eb_flags_to_engine(unsigned int flags); ((e__) = intel_get_current_physical_engine(&i__##e__)); \ intel_next_engine(&i__##e__)) +struct gem_engine_properties { + const struct intel_execution_engine2 *engine; + int preempt_timeout; + int heartbeat_interval; +}; + +void gem_engine_properties_configure(int fd, struct gem_engine_properties *params); +void gem_engine_properties_restore(int fd, const struct gem_engine_properties *saved); + __attribute__((format(scanf, 4, 5))) int gem_engine_property_scanf(int i915, const char *engine, const char *attr, const char *fmt, ...); |