Sample output: ... waiting: yes ring->head: 0x00000000 ring->tail: 0x00000c50 ring->next_context_status_buffer: 0x5 CSB Pointer: 0x00000405 Context 0 Status: 0x0000000000000001 Context 1 Status: 0x0000009d00000018 Context 2 Status: 0x0000000000000001 Context 3 Status: 0x0000000100000018 Context 4 Status: 0x0000000000000001 Context 5 Status: 0x0000009d00000018 hangcheck: hung [40] bsd command stream: START: 0x00039000 HEAD: 0x00000018 ... Signed-off-by: Ben Widawsky <benjamin.widawsky@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 7 ++++++- drivers/gpu/drm/i915/i915_gpu_error.c | 23 +++++++++++++++++++++++ drivers/gpu/drm/i915/intel_lrc.c | 10 +++++----- drivers/gpu/drm/i915/intel_lrc.h | 4 ++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index c6dd4db..c79e869 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -526,6 +526,7 @@ struct drm_i915_error_state { u32 cpu_ring_tail; u32 semaphore_seqno[I915_NUM_RINGS - 1]; + u32 semaphore_mboxes[I915_NUM_RINGS - 1]; /* Register state */ u32 start; @@ -545,7 +546,11 @@ struct drm_i915_error_state { u32 fault_reg; u64 faddr; u32 rc_psmi; /* sleep state */ - u32 semaphore_mboxes[I915_NUM_RINGS - 1]; + + /* execlist state */ + u32 csb_ptr; + u8 next_context_status_buffer; + u64 context_status[GEN8_CSB_ENTRIES]; struct drm_i915_error_object { int page_count; diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 06ca408..20a5daa 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -301,6 +301,18 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m, err_printf(m, " waiting: %s\n", yesno(ring->waiting)); err_printf(m, " ring->head: 0x%08x\n", ring->cpu_ring_head); err_printf(m, " ring->tail: 0x%08x\n", ring->cpu_ring_tail); + + if (i915.enable_execlists) { + int j; + err_printf(m, " ring->next_context_status_buffer: 0x%d\n", + ring->next_context_status_buffer); + err_printf(m, " CSB Pointer: 0x%08x\n", ring->csb_ptr); + for (j = 0; j < GEN8_CSB_ENTRIES; j++) { + err_printf(m, " Context %d Status: 0x%016llx\n", + j, ring->context_status[j]); + } + } + err_printf(m, " hangcheck: %s [%d]\n", hangcheck_action_to_str(ring->hangcheck_action), ring->hangcheck_score); @@ -1042,6 +1054,8 @@ static void i915_gem_record_rings(struct drm_device *dev, } if (i915.enable_execlists) { + int j; + /* TODO: This is only a small fix to keep basic error * capture working, but we need to add more information * for it to be useful (e.g. dump the context being @@ -1051,6 +1065,15 @@ static void i915_gem_record_rings(struct drm_device *dev, rbuf = request->ctx->engine[ring->id].ringbuf; else rbuf = ring->default_context->engine[ring->id].ringbuf; + + error->ring[i].csb_ptr = I915_READ(RING_CONTEXT_STATUS_PTR(ring)); + error->ring[i].next_context_status_buffer = ring->next_context_status_buffer; + for (j = 0; j < GEN8_CSB_ENTRIES; j++) { + u32 status, id; + intel_lrc_get_context_status(ring, j, &status, &id); + error->ring[i].context_status[j] = ((__u64)id<<32)|(__u64)status; + } + } else rbuf = ring->buffer; diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 23839ff..a118146 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -496,9 +496,9 @@ static bool execlists_check_remove_request(struct intel_engine_cs *ring, return false; } -static void get_context_status(struct intel_engine_cs *ring, - u8 read_pointer, - u32 *status, u32 *context_id) +void intel_lrc_get_context_status(struct intel_engine_cs *ring, + u8 read_pointer, + u32 *status, u32 *context_id) { struct drm_i915_private *dev_priv = ring->dev->dev_private; @@ -537,8 +537,8 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) while (read_pointer < write_pointer) { - get_context_status(ring, ++read_pointer % GEN8_CSB_ENTRIES, - &status, &status_id); + intel_lrc_get_context_status(ring, ++read_pointer % GEN8_CSB_ENTRIES, + &status, &status_id); if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) continue; diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h index de41ad6..82c87f9 100644 --- a/drivers/gpu/drm/i915/intel_lrc.h +++ b/drivers/gpu/drm/i915/intel_lrc.h @@ -118,4 +118,8 @@ u32 intel_execlists_ctx_id(struct drm_i915_gem_object *ctx_obj); void intel_lrc_irq_handler(struct intel_engine_cs *ring); void intel_execlists_retire_requests(struct intel_engine_cs *ring); +void intel_lrc_get_context_status(struct intel_engine_cs *ring, + u8 read_pointer, + u32 *status, u32 *context_id); + #endif /* _INTEL_LRC_H_ */ -- 2.6.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx