diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-01-30 06:56:51 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-01-30 06:56:51 -0500 |
commit | e515b47e5646154448e46231d811919d93923da5 (patch) | |
tree | 1b10297d37170a1e00b4f2211f4296c2b0020f8d /drivers/gpu/drm/i915/i915_gpu_error.c | |
parent | c2c1d4912cd7028384d7f25d2faefefb8958f64d (diff) | |
parent | ef64cf9d06049e4e9df661f3be60b217e476bee1 (diff) |
Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next-queued
Backmerge drm-next - I need to backmerge drm-intel-fixes patches
touching the error capture code to be able to merge Ben's cleanup
patches.
Conflicts:
drivers/gpu/drm/i915/i915_gpu_error.c
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gpu_error.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 685f6ccbcc07..4cc916213362 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
@@ -239,6 +239,9 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m, | |||
239 | unsigned ring) | 239 | unsigned ring) |
240 | { | 240 | { |
241 | BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */ | 241 | BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */ |
242 | if (!error->ring[ring].valid) | ||
243 | return; | ||
244 | |||
242 | err_printf(m, "%s command stream:\n", ring_str(ring)); | 245 | err_printf(m, "%s command stream:\n", ring_str(ring)); |
243 | err_printf(m, " HEAD: 0x%08x\n", error->head[ring]); | 246 | err_printf(m, " HEAD: 0x%08x\n", error->head[ring]); |
244 | err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]); | 247 | err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]); |
@@ -294,7 +297,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, | |||
294 | struct drm_device *dev = error_priv->dev; | 297 | struct drm_device *dev = error_priv->dev; |
295 | drm_i915_private_t *dev_priv = dev->dev_private; | 298 | drm_i915_private_t *dev_priv = dev->dev_private; |
296 | struct drm_i915_error_state *error = error_priv->error; | 299 | struct drm_i915_error_state *error = error_priv->error; |
297 | struct intel_ring_buffer *ring; | ||
298 | int i, j, page, offset, elt; | 300 | int i, j, page, offset, elt; |
299 | 301 | ||
300 | if (!error) { | 302 | if (!error) { |
@@ -329,7 +331,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, | |||
329 | if (INTEL_INFO(dev)->gen == 7) | 331 | if (INTEL_INFO(dev)->gen == 7) |
330 | err_printf(m, "ERR_INT: 0x%08x\n", error->err_int); | 332 | err_printf(m, "ERR_INT: 0x%08x\n", error->err_int); |
331 | 333 | ||
332 | for_each_ring(ring, dev_priv, i) | 334 | for (i = 0; i < ARRAY_SIZE(error->ring); i++) |
333 | i915_ring_error_state(m, dev, error, i); | 335 | i915_ring_error_state(m, dev, error, i); |
334 | 336 | ||
335 | if (error->active_bo) | 337 | if (error->active_bo) |
@@ -402,8 +404,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, | |||
402 | } | 404 | } |
403 | } | 405 | } |
404 | 406 | ||
405 | obj = error->ring[i].ctx; | 407 | if ((obj = error->ring[i].ctx)) { |
406 | if (obj) { | ||
407 | err_printf(m, "%s --- HW Context = 0x%08x\n", | 408 | err_printf(m, "%s --- HW Context = 0x%08x\n", |
408 | dev_priv->ring[i].name, | 409 | dev_priv->ring[i].name, |
409 | obj->gtt_offset); | 410 | obj->gtt_offset); |
@@ -718,7 +719,8 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv, | |||
718 | return NULL; | 719 | return NULL; |
719 | 720 | ||
720 | obj = ring->scratch.obj; | 721 | obj = ring->scratch.obj; |
721 | if (acthd >= i915_gem_obj_ggtt_offset(obj) && | 722 | if (obj != NULL && |
723 | acthd >= i915_gem_obj_ggtt_offset(obj) && | ||
722 | acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size) | 724 | acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size) |
723 | return i915_error_ggtt_object_create(dev_priv, obj); | 725 | return i915_error_ggtt_object_create(dev_priv, obj); |
724 | } | 726 | } |
@@ -863,11 +865,17 @@ static void i915_gem_record_rings(struct drm_device *dev, | |||
863 | struct drm_i915_error_state *error) | 865 | struct drm_i915_error_state *error) |
864 | { | 866 | { |
865 | struct drm_i915_private *dev_priv = dev->dev_private; | 867 | struct drm_i915_private *dev_priv = dev->dev_private; |
866 | struct intel_ring_buffer *ring; | ||
867 | struct drm_i915_gem_request *request; | 868 | struct drm_i915_gem_request *request; |
868 | int i, count; | 869 | int i, count; |
869 | 870 | ||
870 | for_each_ring(ring, dev_priv, i) { | 871 | for (i = 0; i < I915_NUM_RINGS; i++) { |
872 | struct intel_ring_buffer *ring = &dev_priv->ring[i]; | ||
873 | |||
874 | if (ring->dev == NULL) | ||
875 | continue; | ||
876 | |||
877 | error->ring[i].valid = true; | ||
878 | |||
871 | i915_record_ring_state(dev, error, ring); | 879 | i915_record_ring_state(dev, error, ring); |
872 | 880 | ||
873 | error->ring[i].batchbuffer = | 881 | error->ring[i].batchbuffer = |