Message ID | 1471272599-14586-14-git-send-email-akash.goel@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 15/08/16 15:49, akash.goel@intel.com wrote: > From: Akash Goel <akash.goel@intel.com> > > Added the dump of GuC log buffer to i915 error state, as the contents of > GuC log buffer would also be useful to determine that why the GPU reset > was triggered. > > v2: > - For uniformity use existing helper function print_error_obj() to > dump out contents of GuC log buffer, pretty printing is better left > to userspace. (Chris) > - Skip the dumping of GuC log buffer when logging is disabled as it > won't be of any use. > - Rebase. > > Suggested-by: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Akash Goel <akash.goel@intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/i915_gpu_error.c | 20 ++++++++++++++++++++ > 2 files changed, 21 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 08553b9..de89596 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -734,6 +734,7 @@ struct drm_i915_error_state { > struct intel_overlay_error_state *overlay; > struct intel_display_error_state *display; > struct drm_i915_error_object *semaphore; > + struct drm_i915_error_object *guc_log; > > struct drm_i915_error_engine { > int engine_id; > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c > index 0c3f30c..94297aa 100644 > --- a/drivers/gpu/drm/i915/i915_gpu_error.c > +++ b/drivers/gpu/drm/i915/i915_gpu_error.c > @@ -572,6 +572,13 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, > } > } > > + obj = error->guc_log; > + if (obj) { > + err_printf(m, "GuC log buffer = 0x%08x\n", > + lower_32_bits(obj->gtt_offset)); > + print_error_obj(m, obj); > + } > + > if (error->overlay) > intel_overlay_print_error_state(m, error->overlay); > > @@ -651,6 +658,7 @@ static void i915_error_state_free(struct kref *error_ref) > } > > i915_error_object_free(error->semaphore); > + i915_error_object_free(error->guc_log); > > for (i = 0; i < ARRAY_SIZE(error->active_bo); i++) > kfree(error->active_bo[i]); > @@ -1286,6 +1294,17 @@ static void i915_capture_pinned_buffers(struct drm_i915_private *dev_priv, > error->pinned_bo = bo; > } > > +static void i915_gem_capture_guc_log_buffer(struct drm_i915_private *dev_priv, > + struct drm_i915_error_state *error) > +{ > + /* Capturing log buf contents won't be useful if logging was disabled */ > + if (!dev_priv->guc.log.vma || (i915.guc_log_level < 0)) > + return; > + > + error->guc_log = i915_error_object_create(dev_priv, > + dev_priv->guc.log.vma); > +} > + > /* Capture all registers which don't fit into another category. */ > static void i915_capture_reg_state(struct drm_i915_private *dev_priv, > struct drm_i915_error_state *error) > @@ -1437,6 +1456,7 @@ void i915_capture_error_state(struct drm_i915_private *dev_priv, > i915_gem_record_rings(dev_priv, error); > i915_capture_active_buffers(dev_priv, error); > i915_capture_pinned_buffers(dev_priv, error); > + i915_gem_capture_guc_log_buffer(dev_priv, error); > > do_gettimeofday(&error->time); > > Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Regards, Tvrtko
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 08553b9..de89596 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -734,6 +734,7 @@ struct drm_i915_error_state { struct intel_overlay_error_state *overlay; struct intel_display_error_state *display; struct drm_i915_error_object *semaphore; + struct drm_i915_error_object *guc_log; struct drm_i915_error_engine { int engine_id; diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 0c3f30c..94297aa 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -572,6 +572,13 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, } } + obj = error->guc_log; + if (obj) { + err_printf(m, "GuC log buffer = 0x%08x\n", + lower_32_bits(obj->gtt_offset)); + print_error_obj(m, obj); + } + if (error->overlay) intel_overlay_print_error_state(m, error->overlay); @@ -651,6 +658,7 @@ static void i915_error_state_free(struct kref *error_ref) } i915_error_object_free(error->semaphore); + i915_error_object_free(error->guc_log); for (i = 0; i < ARRAY_SIZE(error->active_bo); i++) kfree(error->active_bo[i]); @@ -1286,6 +1294,17 @@ static void i915_capture_pinned_buffers(struct drm_i915_private *dev_priv, error->pinned_bo = bo; } +static void i915_gem_capture_guc_log_buffer(struct drm_i915_private *dev_priv, + struct drm_i915_error_state *error) +{ + /* Capturing log buf contents won't be useful if logging was disabled */ + if (!dev_priv->guc.log.vma || (i915.guc_log_level < 0)) + return; + + error->guc_log = i915_error_object_create(dev_priv, + dev_priv->guc.log.vma); +} + /* Capture all registers which don't fit into another category. */ static void i915_capture_reg_state(struct drm_i915_private *dev_priv, struct drm_i915_error_state *error) @@ -1437,6 +1456,7 @@ void i915_capture_error_state(struct drm_i915_private *dev_priv, i915_gem_record_rings(dev_priv, error); i915_capture_active_buffers(dev_priv, error); i915_capture_pinned_buffers(dev_priv, error); + i915_gem_capture_guc_log_buffer(dev_priv, error); do_gettimeofday(&error->time);