|
@@ -239,6 +239,9 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
|
|
unsigned ring)
|
|
unsigned ring)
|
|
{
|
|
{
|
|
BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */
|
|
BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */
|
|
|
|
+ if (!error->ring[ring].valid)
|
|
|
|
+ return;
|
|
|
|
+
|
|
err_printf(m, "%s command stream:\n", ring_str(ring));
|
|
err_printf(m, "%s command stream:\n", ring_str(ring));
|
|
err_printf(m, " HEAD: 0x%08x\n", error->head[ring]);
|
|
err_printf(m, " HEAD: 0x%08x\n", error->head[ring]);
|
|
err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]);
|
|
err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]);
|
|
@@ -293,7 +296,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
|
|
struct drm_device *dev = error_priv->dev;
|
|
struct drm_device *dev = error_priv->dev;
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
struct drm_i915_error_state *error = error_priv->error;
|
|
struct drm_i915_error_state *error = error_priv->error;
|
|
- struct intel_ring_buffer *ring;
|
|
|
|
int i, j, page, offset, elt;
|
|
int i, j, page, offset, elt;
|
|
|
|
|
|
if (!error) {
|
|
if (!error) {
|
|
@@ -328,7 +330,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
|
|
if (INTEL_INFO(dev)->gen == 7)
|
|
if (INTEL_INFO(dev)->gen == 7)
|
|
err_printf(m, "ERR_INT: 0x%08x\n", error->err_int);
|
|
err_printf(m, "ERR_INT: 0x%08x\n", error->err_int);
|
|
|
|
|
|
- for_each_ring(ring, dev_priv, i)
|
|
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(error->ring); i++)
|
|
i915_ring_error_state(m, dev, error, i);
|
|
i915_ring_error_state(m, dev, error, i);
|
|
|
|
|
|
if (error->active_bo)
|
|
if (error->active_bo)
|
|
@@ -385,8 +387,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- obj = error->ring[i].ctx;
|
|
|
|
- if (obj) {
|
|
|
|
|
|
+ if ((obj = error->ring[i].ctx)) {
|
|
err_printf(m, "%s --- HW Context = 0x%08x\n",
|
|
err_printf(m, "%s --- HW Context = 0x%08x\n",
|
|
dev_priv->ring[i].name,
|
|
dev_priv->ring[i].name,
|
|
obj->gtt_offset);
|
|
obj->gtt_offset);
|
|
@@ -667,7 +668,8 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
obj = ring->scratch.obj;
|
|
obj = ring->scratch.obj;
|
|
- if (acthd >= i915_gem_obj_ggtt_offset(obj) &&
|
|
|
|
|
|
+ if (obj != NULL &&
|
|
|
|
+ acthd >= i915_gem_obj_ggtt_offset(obj) &&
|
|
acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size)
|
|
acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size)
|
|
return i915_error_object_create(dev_priv, obj);
|
|
return i915_error_object_create(dev_priv, obj);
|
|
}
|
|
}
|
|
@@ -775,11 +777,17 @@ static void i915_gem_record_rings(struct drm_device *dev,
|
|
struct drm_i915_error_state *error)
|
|
struct drm_i915_error_state *error)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- struct intel_ring_buffer *ring;
|
|
|
|
struct drm_i915_gem_request *request;
|
|
struct drm_i915_gem_request *request;
|
|
int i, count;
|
|
int i, count;
|
|
|
|
|
|
- for_each_ring(ring, dev_priv, i) {
|
|
|
|
|
|
+ for (i = 0; i < I915_NUM_RINGS; i++) {
|
|
|
|
+ struct intel_ring_buffer *ring = &dev_priv->ring[i];
|
|
|
|
+
|
|
|
|
+ if (ring->dev == NULL)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ error->ring[i].valid = true;
|
|
|
|
+
|
|
i915_record_ring_state(dev, error, ring);
|
|
i915_record_ring_state(dev, error, ring);
|
|
|
|
|
|
error->ring[i].batchbuffer =
|
|
error->ring[i].batchbuffer =
|