Lines Matching full:engine

17  * While the engine is active, we send a periodic pulse along the engine
19 * is stuck, and we fail to preempt it, we declare the engine hung and
23 static bool next_heartbeat(struct intel_engine_cs *engine) in next_heartbeat() argument
27 delay = READ_ONCE(engine->props.heartbeat_interval_ms); in next_heartbeat()
34 mod_delayed_work(system_highpri_wq, &engine->heartbeat.work, delay + 1); in next_heartbeat()
51 static void idle_pulse(struct intel_engine_cs *engine, struct i915_request *rq) in idle_pulse() argument
53 engine->wakeref_serial = READ_ONCE(engine->serial) + 1; in idle_pulse()
55 if (!engine->heartbeat.systole && intel_engine_has_heartbeat(engine)) in idle_pulse()
56 engine->heartbeat.systole = i915_request_get(rq); in idle_pulse()
62 idle_pulse(rq->engine, rq); in heartbeat_commit()
69 struct intel_engine_cs *engine) in show_heartbeat() argument
74 intel_engine_dump(engine, &p, in show_heartbeat()
76 engine->name); in show_heartbeat()
78 intel_engine_dump(engine, &p, in show_heartbeat()
80 engine->name, in show_heartbeat()
88 reset_engine(struct intel_engine_cs *engine, struct i915_request *rq) in reset_engine() argument
91 show_heartbeat(rq, engine); in reset_engine()
93 if (intel_engine_uses_guc(engine)) in reset_engine()
99 intel_guc_find_hung_context(engine); in reset_engine()
101 intel_gt_handle_error(engine->gt, engine->mask, in reset_engine()
104 engine->name); in reset_engine()
110 struct intel_engine_cs *engine = in heartbeat() local
111 container_of(wrk, typeof(*engine), heartbeat.work.work); in heartbeat()
112 struct intel_context *ce = engine->kernel_context; in heartbeat()
117 intel_engine_flush_submission(engine); in heartbeat()
119 rq = engine->heartbeat.systole; in heartbeat()
122 engine->heartbeat.systole = NULL; in heartbeat()
125 if (!intel_engine_pm_get_if_awake(engine)) in heartbeat()
128 if (intel_gt_is_wedged(engine->gt)) in heartbeat()
131 if (i915_sched_engine_disabled(engine->sched_engine)) { in heartbeat()
132 reset_engine(engine, engine->heartbeat.systole); in heartbeat()
136 if (engine->heartbeat.systole) { in heartbeat()
137 long delay = READ_ONCE(engine->props.heartbeat_interval_ms); in heartbeat()
155 } else if (engine->sched_engine->schedule && in heartbeat()
170 engine->sched_engine->schedule(rq, &attr); in heartbeat()
173 reset_engine(engine, rq); in heartbeat()
180 serial = READ_ONCE(engine->serial); in heartbeat()
181 if (engine->wakeref_serial == serial) in heartbeat()
185 /* Unable to lock the kernel timeline, is the engine stuck? */ in heartbeat()
186 if (xchg(&engine->heartbeat.blocked, serial) == serial) in heartbeat()
187 intel_gt_handle_error(engine->gt, engine->mask, in heartbeat()
190 engine->name); in heartbeat()
203 if (!engine->i915->params.enable_hangcheck || !next_heartbeat(engine)) in heartbeat()
204 i915_request_put(fetch_and_zero(&engine->heartbeat.systole)); in heartbeat()
205 intel_engine_pm_put(engine); in heartbeat()
208 void intel_engine_unpark_heartbeat(struct intel_engine_cs *engine) in intel_engine_unpark_heartbeat() argument
213 next_heartbeat(engine); in intel_engine_unpark_heartbeat()
216 void intel_engine_park_heartbeat(struct intel_engine_cs *engine) in intel_engine_park_heartbeat() argument
218 if (cancel_delayed_work(&engine->heartbeat.work)) in intel_engine_park_heartbeat()
219 i915_request_put(fetch_and_zero(&engine->heartbeat.systole)); in intel_engine_park_heartbeat()
224 struct intel_engine_cs *engine; in intel_gt_unpark_heartbeats() local
227 for_each_engine(engine, gt, id) in intel_gt_unpark_heartbeats()
228 if (intel_engine_pm_is_awake(engine)) in intel_gt_unpark_heartbeats()
229 intel_engine_unpark_heartbeat(engine); in intel_gt_unpark_heartbeats()
234 struct intel_engine_cs *engine; in intel_gt_park_heartbeats() local
237 for_each_engine(engine, gt, id) in intel_gt_park_heartbeats()
238 intel_engine_park_heartbeat(engine); in intel_gt_park_heartbeats()
241 void intel_engine_init_heartbeat(struct intel_engine_cs *engine) in intel_engine_init_heartbeat() argument
243 INIT_DELAYED_WORK(&engine->heartbeat.work, heartbeat); in intel_engine_init_heartbeat()
246 static int __intel_engine_pulse(struct intel_engine_cs *engine) in __intel_engine_pulse() argument
249 struct intel_context *ce = engine->kernel_context; in __intel_engine_pulse()
253 GEM_BUG_ON(!intel_engine_has_preemption(engine)); in __intel_engine_pulse()
254 GEM_BUG_ON(!intel_engine_pm_is_awake(engine)); in __intel_engine_pulse()
268 static unsigned long set_heartbeat(struct intel_engine_cs *engine, in set_heartbeat() argument
273 old = xchg(&engine->props.heartbeat_interval_ms, delay); in set_heartbeat()
275 intel_engine_unpark_heartbeat(engine); in set_heartbeat()
277 intel_engine_park_heartbeat(engine); in set_heartbeat()
282 int intel_engine_set_heartbeat(struct intel_engine_cs *engine, in intel_engine_set_heartbeat() argument
285 struct intel_context *ce = engine->kernel_context; in intel_engine_set_heartbeat()
288 if (!delay && !intel_engine_has_preempt_reset(engine)) in intel_engine_set_heartbeat()
291 intel_engine_pm_get(engine); in intel_engine_set_heartbeat()
297 if (delay != engine->props.heartbeat_interval_ms) { in intel_engine_set_heartbeat()
298 unsigned long saved = set_heartbeat(engine, delay); in intel_engine_set_heartbeat()
301 if (intel_engine_has_preemption(engine)) { in intel_engine_set_heartbeat()
302 err = __intel_engine_pulse(engine); in intel_engine_set_heartbeat()
304 set_heartbeat(engine, saved); in intel_engine_set_heartbeat()
311 intel_engine_pm_put(engine); in intel_engine_set_heartbeat()
315 int intel_engine_pulse(struct intel_engine_cs *engine) in intel_engine_pulse() argument
317 struct intel_context *ce = engine->kernel_context; in intel_engine_pulse()
320 if (!intel_engine_has_preemption(engine)) in intel_engine_pulse()
323 if (!intel_engine_pm_get_if_awake(engine)) in intel_engine_pulse()
328 err = __intel_engine_pulse(engine); in intel_engine_pulse()
332 intel_engine_flush_submission(engine); in intel_engine_pulse()
333 intel_engine_pm_put(engine); in intel_engine_pulse()
337 int intel_engine_flush_barriers(struct intel_engine_cs *engine) in intel_engine_flush_barriers() argument
340 struct intel_context *ce = engine->kernel_context; in intel_engine_flush_barriers()
344 if (llist_empty(&engine->barrier_tasks)) in intel_engine_flush_barriers()
347 if (!intel_engine_pm_get_if_awake(engine)) in intel_engine_flush_barriers()
367 intel_engine_pm_put(engine); in intel_engine_flush_barriers()