Lines Matching full:engine
28 ipehr_is_semaphore_wait(struct intel_engine_cs *engine, u32 ipehr) in ipehr_is_semaphore_wait() argument
36 semaphore_wait_to_signaller_ring(struct intel_engine_cs *engine, u32 ipehr, in semaphore_wait_to_signaller_ring() argument
39 struct drm_i915_private *dev_priv = engine->i915; in semaphore_wait_to_signaller_ring()
45 if (engine == signaller) in semaphore_wait_to_signaller_ring()
48 if (sync_bits == signaller->semaphore.mbox.wait[engine->hw_id]) in semaphore_wait_to_signaller_ring()
53 engine->name, ipehr); in semaphore_wait_to_signaller_ring()
59 semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno) in semaphore_waits_for() argument
61 struct drm_i915_private *dev_priv = engine->i915; in semaphore_waits_for()
84 if (engine->buffer == NULL) in semaphore_waits_for()
87 ipehr = I915_READ(RING_IPEHR(engine->mmio_base)); in semaphore_waits_for()
88 if (!ipehr_is_semaphore_wait(engine, ipehr)) in semaphore_waits_for()
99 head = I915_READ_HEAD(engine) & HEAD_ADDR; in semaphore_waits_for()
101 vaddr = (void __iomem *)engine->buffer->vaddr; in semaphore_waits_for()
109 head &= engine->buffer->size - 1; in semaphore_waits_for()
123 return semaphore_wait_to_signaller_ring(engine, ipehr, offset); in semaphore_waits_for()
126 static int semaphore_passed(struct intel_engine_cs *engine) in semaphore_passed() argument
128 struct drm_i915_private *dev_priv = engine->i915; in semaphore_passed()
132 engine->hangcheck.deadlock++; in semaphore_passed()
134 signaller = semaphore_waits_for(engine, &seqno); in semaphore_passed()
158 struct intel_engine_cs *engine; in semaphore_clear_deadlocks() local
161 for_each_engine(engine, dev_priv, id) in semaphore_clear_deadlocks()
162 engine->hangcheck.deadlock = 0; in semaphore_clear_deadlocks()
176 static bool subunits_stuck(struct intel_engine_cs *engine) in subunits_stuck() argument
178 struct drm_i915_private *dev_priv = engine->i915; in subunits_stuck()
180 struct intel_instdone *accu_instdone = &engine->hangcheck.instdone; in subunits_stuck()
185 if (engine->id != RCS) in subunits_stuck()
188 intel_engine_get_instdone(engine, &instdone); in subunits_stuck()
211 head_stuck(struct intel_engine_cs *engine, u64 acthd) in head_stuck() argument
213 if (acthd != engine->hangcheck.acthd) { in head_stuck()
216 memset(&engine->hangcheck.instdone, 0, in head_stuck()
217 sizeof(engine->hangcheck.instdone)); in head_stuck()
222 if (!subunits_stuck(engine)) in head_stuck()
229 engine_stuck(struct intel_engine_cs *engine, u64 acthd) in engine_stuck() argument
231 struct drm_i915_private *dev_priv = engine->i915; in engine_stuck()
235 ha = head_stuck(engine, acthd); in engine_stuck()
247 tmp = I915_READ_CTL(engine); in engine_stuck()
249 i915_handle_error(dev_priv, BIT(engine->id), 0, in engine_stuck()
250 "stuck wait on %s", engine->name); in engine_stuck()
251 I915_WRITE_CTL(engine, tmp); in engine_stuck()
256 switch (semaphore_passed(engine)) { in engine_stuck()
262 engine->name); in engine_stuck()
263 I915_WRITE_CTL(engine, tmp); in engine_stuck()
273 static void hangcheck_load_sample(struct intel_engine_cs *engine, in hangcheck_load_sample() argument
283 if (engine->irq_seqno_barrier) in hangcheck_load_sample()
284 engine->irq_seqno_barrier(engine); in hangcheck_load_sample()
286 hc->acthd = intel_engine_get_active_head(engine); in hangcheck_load_sample()
287 hc->seqno = intel_engine_get_seqno(engine); in hangcheck_load_sample()
290 static void hangcheck_store_sample(struct intel_engine_cs *engine, in hangcheck_store_sample() argument
293 engine->hangcheck.acthd = hc->acthd; in hangcheck_store_sample()
294 engine->hangcheck.seqno = hc->seqno; in hangcheck_store_sample()
295 engine->hangcheck.action = hc->action; in hangcheck_store_sample()
296 engine->hangcheck.stalled = hc->stalled; in hangcheck_store_sample()
297 engine->hangcheck.wedged = hc->wedged; in hangcheck_store_sample()
301 hangcheck_get_action(struct intel_engine_cs *engine, in hangcheck_get_action() argument
304 if (engine->hangcheck.seqno != hc->seqno) in hangcheck_get_action()
307 if (intel_engine_is_idle(engine)) in hangcheck_get_action()
310 return engine_stuck(engine, hc->acthd); in hangcheck_get_action()
313 static void hangcheck_accumulate_sample(struct intel_engine_cs *engine, in hangcheck_accumulate_sample() argument
318 hc->action = hangcheck_get_action(engine, hc); in hangcheck_accumulate_sample()
321 * if the engine is busy and still processing in hangcheck_accumulate_sample()
326 * engine is in a legitimate wait for another in hangcheck_accumulate_sample()
327 * engine. In that case the waiting engine is a in hangcheck_accumulate_sample()
332 * will catch the hanging engine. in hangcheck_accumulate_sample()
341 memset(&engine->hangcheck.instdone, 0, in hangcheck_accumulate_sample()
342 sizeof(engine->hangcheck.instdone)); in hangcheck_accumulate_sample()
347 engine->hangcheck.action_timestamp = jiffies; in hangcheck_accumulate_sample()
353 * Seqno stuck with still active engine gets leeway, in hangcheck_accumulate_sample()
362 intel_engine_dump(engine, &p, "%s\n", engine->name); in hangcheck_accumulate_sample()
371 engine->hangcheck.action_timestamp + timeout); in hangcheck_accumulate_sample()
373 engine->hangcheck.action_timestamp + in hangcheck_accumulate_sample()
381 struct intel_engine_cs *engine; in hangcheck_declare_hang() local
393 for_each_engine_masked(engine, i915, hung, tmp) in hangcheck_declare_hang()
395 "%s, ", engine->name); in hangcheck_declare_hang()
414 struct intel_engine_cs *engine; in i915_hangcheck_elapsed() local
433 for_each_engine(engine, dev_priv, id) { in i915_hangcheck_elapsed()
438 hangcheck_load_sample(engine, &hc); in i915_hangcheck_elapsed()
439 hangcheck_accumulate_sample(engine, &hc); in i915_hangcheck_elapsed()
440 hangcheck_store_sample(engine, &hc); in i915_hangcheck_elapsed()
442 if (engine->hangcheck.stalled) { in i915_hangcheck_elapsed()
443 hung |= intel_engine_flag(engine); in i915_hangcheck_elapsed()
445 stuck |= intel_engine_flag(engine); in i915_hangcheck_elapsed()
448 if (engine->hangcheck.wedged) in i915_hangcheck_elapsed()
449 wedged |= intel_engine_flag(engine); in i915_hangcheck_elapsed()
467 void intel_engine_init_hangcheck(struct intel_engine_cs *engine) in intel_engine_init_hangcheck() argument
469 memset(&engine->hangcheck, 0, sizeof(engine->hangcheck)); in intel_engine_init_hangcheck()
470 engine->hangcheck.action_timestamp = jiffies; in intel_engine_init_hangcheck()