Lines Matching full:engine

18  * While the engine is active, we send a periodic pulse along the engine
20 * is stuck, and we fail to preempt it, we declare the engine hung and
24 static bool next_heartbeat(struct intel_engine_cs *engine) in next_heartbeat() argument
28 delay = READ_ONCE(engine->props.heartbeat_interval_ms); in next_heartbeat()
35 mod_delayed_work(system_highpri_wq, &engine->heartbeat.work, delay); in next_heartbeat()
40 static void idle_pulse(struct intel_engine_cs *engine, struct i915_request *rq) in idle_pulse() argument
42 engine->wakeref_serial = READ_ONCE(engine->serial) + 1; in idle_pulse()
47 struct intel_engine_cs *engine) in show_heartbeat() argument
51 intel_engine_dump(engine, &p, in show_heartbeat()
53 engine->name, in show_heartbeat()
64 struct intel_engine_cs *engine = in heartbeat() local
65 container_of(wrk, typeof(*engine), heartbeat.work.work); in heartbeat()
66 struct intel_context *ce = engine->kernel_context; in heartbeat()
71 intel_engine_flush_submission(engine); in heartbeat()
73 rq = engine->heartbeat.systole; in heartbeat()
76 engine->heartbeat.systole = NULL; in heartbeat()
79 if (!intel_engine_pm_get_if_awake(engine)) in heartbeat()
82 if (intel_gt_is_wedged(engine->gt)) in heartbeat()
85 if (engine->heartbeat.systole) { in heartbeat()
97 } else if (engine->schedule && in heartbeat()
112 engine->schedule(rq, &attr); in heartbeat()
116 show_heartbeat(rq, engine); in heartbeat()
118 intel_gt_handle_error(engine->gt, engine->mask, in heartbeat()
121 engine->name); in heartbeat()
126 serial = READ_ONCE(engine->serial); in heartbeat()
127 if (engine->wakeref_serial == serial) in heartbeat()
131 /* Unable to lock the kernel timeline, is the engine stuck? */ in heartbeat()
132 if (xchg(&engine->heartbeat.blocked, serial) == serial) in heartbeat()
133 intel_gt_handle_error(engine->gt, engine->mask, in heartbeat()
136 engine->name); in heartbeat()
146 idle_pulse(engine, rq); in heartbeat()
147 if (engine->i915->params.enable_hangcheck) in heartbeat()
148 engine->heartbeat.systole = i915_request_get(rq); in heartbeat()
156 if (!next_heartbeat(engine)) in heartbeat()
157 i915_request_put(fetch_and_zero(&engine->heartbeat.systole)); in heartbeat()
158 intel_engine_pm_put(engine); in heartbeat()
161 void intel_engine_unpark_heartbeat(struct intel_engine_cs *engine) in intel_engine_unpark_heartbeat() argument
166 next_heartbeat(engine); in intel_engine_unpark_heartbeat()
169 void intel_engine_park_heartbeat(struct intel_engine_cs *engine) in intel_engine_park_heartbeat() argument
171 if (cancel_delayed_work(&engine->heartbeat.work)) in intel_engine_park_heartbeat()
172 i915_request_put(fetch_and_zero(&engine->heartbeat.systole)); in intel_engine_park_heartbeat()
175 void intel_engine_init_heartbeat(struct intel_engine_cs *engine) in intel_engine_init_heartbeat() argument
177 INIT_DELAYED_WORK(&engine->heartbeat.work, heartbeat); in intel_engine_init_heartbeat()
180 static int __intel_engine_pulse(struct intel_engine_cs *engine) in __intel_engine_pulse() argument
183 struct intel_context *ce = engine->kernel_context; in __intel_engine_pulse()
187 GEM_BUG_ON(!intel_engine_has_preemption(engine)); in __intel_engine_pulse()
188 GEM_BUG_ON(!intel_engine_pm_is_awake(engine)); in __intel_engine_pulse()
197 idle_pulse(engine, rq); in __intel_engine_pulse()
206 static unsigned long set_heartbeat(struct intel_engine_cs *engine, in set_heartbeat() argument
211 old = xchg(&engine->props.heartbeat_interval_ms, delay); in set_heartbeat()
213 intel_engine_unpark_heartbeat(engine); in set_heartbeat()
215 intel_engine_park_heartbeat(engine); in set_heartbeat()
220 int intel_engine_set_heartbeat(struct intel_engine_cs *engine, in intel_engine_set_heartbeat() argument
223 struct intel_context *ce = engine->kernel_context; in intel_engine_set_heartbeat()
226 if (!delay && !intel_engine_has_preempt_reset(engine)) in intel_engine_set_heartbeat()
229 intel_engine_pm_get(engine); in intel_engine_set_heartbeat()
235 if (delay != engine->props.heartbeat_interval_ms) { in intel_engine_set_heartbeat()
236 unsigned long saved = set_heartbeat(engine, delay); in intel_engine_set_heartbeat()
239 if (intel_engine_has_preemption(engine)) { in intel_engine_set_heartbeat()
240 err = __intel_engine_pulse(engine); in intel_engine_set_heartbeat()
242 set_heartbeat(engine, saved); in intel_engine_set_heartbeat()
249 intel_engine_pm_put(engine); in intel_engine_set_heartbeat()
253 int intel_engine_pulse(struct intel_engine_cs *engine) in intel_engine_pulse() argument
255 struct intel_context *ce = engine->kernel_context; in intel_engine_pulse()
258 if (!intel_engine_has_preemption(engine)) in intel_engine_pulse()
261 if (!intel_engine_pm_get_if_awake(engine)) in intel_engine_pulse()
266 err = __intel_engine_pulse(engine); in intel_engine_pulse()
270 intel_engine_pm_put(engine); in intel_engine_pulse()
274 int intel_engine_flush_barriers(struct intel_engine_cs *engine) in intel_engine_flush_barriers() argument
279 if (llist_empty(&engine->barrier_tasks)) in intel_engine_flush_barriers()
282 if (!intel_engine_pm_get_if_awake(engine)) in intel_engine_flush_barriers()
285 rq = i915_request_create(engine->kernel_context); in intel_engine_flush_barriers()
291 idle_pulse(engine, rq); in intel_engine_flush_barriers()
295 intel_engine_pm_put(engine); in intel_engine_flush_barriers()