diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 23 | 
3 files changed, 41 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 7c65ab83914..c92ae7ff471 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -772,6 +772,23 @@ static int i915_error_state(struct seq_file *m, void *unused)  				}  			}  		} + +		obj = error->ring[i].ctx; +		if (obj) { +			seq_printf(m, "%s --- HW Context = 0x%08x\n", +				   dev_priv->ring[i].name, +				   obj->gtt_offset); +			offset = 0; +			for (elt = 0; elt < PAGE_SIZE/16; elt += 4) { +				seq_printf(m, "[%04x] %08x %08x %08x %08x\n", +					   offset, +					   obj->pages[0][elt], +					   obj->pages[0][elt+1], +					   obj->pages[0][elt+2], +					   obj->pages[0][elt+3]); +					offset += 16; +			} +		}  	}  	if (error->overlay) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 669a535e82f..ca6b215c090 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -243,7 +243,7 @@ struct drm_i915_error_state {  			int page_count;  			u32 gtt_offset;  			u32 *pages[0]; -		} *ringbuffer, *batchbuffer; +		} *ringbuffer, *batchbuffer, *ctx;  		struct drm_i915_error_request {  			long jiffies;  			u32 seqno; diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 12561f2f7fd..2139714b2a6 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -1242,6 +1242,26 @@ static void i915_record_ring_state(struct drm_device *dev,  	error->cpu_ring_tail[ring->id] = ring->tail;  } + +static void i915_gem_record_active_context(struct intel_ring_buffer *ring, +					   struct drm_i915_error_state *error, +					   struct drm_i915_error_ring *ering) +{ +	struct drm_i915_private *dev_priv = ring->dev->dev_private; +	struct drm_i915_gem_object *obj; + +	/* Currently render ring is the only HW context user */ +	if (ring->id != RCS || !error->ccid) +		return; + +	list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list) { +		if ((error->ccid & PAGE_MASK) == obj->gtt_offset) { +			ering->ctx = i915_error_object_create_sized(dev_priv, +								    obj, 1); +		} +	} +} +  static void i915_gem_record_rings(struct drm_device *dev,  				  struct drm_i915_error_state *error)  { @@ -1259,6 +1279,9 @@ static void i915_gem_record_rings(struct drm_device *dev,  		error->ring[i].ringbuffer =  			i915_error_object_create(dev_priv, ring->obj); + +		i915_gem_record_active_context(ring, error, &error->ring[i]); +  		count = 0;  		list_for_each_entry(request, &ring->request_list, list)  			count++;  |