|
@@ -1750,6 +1750,57 @@ static int i915_context_status(struct seq_file *m, void *unused)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int i915_dump_lrc(struct seq_file *m, void *unused)
|
|
|
+{
|
|
|
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
|
|
|
+ struct drm_device *dev = node->minor->dev;
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ struct intel_engine_cs *ring;
|
|
|
+ struct intel_context *ctx;
|
|
|
+ int ret, i;
|
|
|
+
|
|
|
+ if (!i915.enable_execlists) {
|
|
|
+ seq_printf(m, "Logical Ring Contexts are disabled\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = mutex_lock_interruptible(&dev->struct_mutex);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ list_for_each_entry(ctx, &dev_priv->context_list, link) {
|
|
|
+ for_each_ring(ring, dev_priv, i) {
|
|
|
+ struct drm_i915_gem_object *ctx_obj = ctx->engine[i].state;
|
|
|
+
|
|
|
+ if (ring->default_context == ctx)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (ctx_obj) {
|
|
|
+ struct page *page = i915_gem_object_get_page(ctx_obj, 1);
|
|
|
+ uint32_t *reg_state = kmap_atomic(page);
|
|
|
+ int j;
|
|
|
+
|
|
|
+ seq_printf(m, "CONTEXT: %s %u\n", ring->name,
|
|
|
+ intel_execlists_ctx_id(ctx_obj));
|
|
|
+
|
|
|
+ for (j = 0; j < 0x600 / sizeof(u32) / 4; j += 4) {
|
|
|
+ seq_printf(m, "\t[0x%08lx] 0x%08x 0x%08x 0x%08x 0x%08x\n",
|
|
|
+ i915_gem_obj_ggtt_offset(ctx_obj) + 4096 + (j * 4),
|
|
|
+ reg_state[j], reg_state[j + 1],
|
|
|
+ reg_state[j + 2], reg_state[j + 3]);
|
|
|
+ }
|
|
|
+ kunmap_atomic(reg_state);
|
|
|
+
|
|
|
+ seq_putc(m, '\n');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int i915_execlists(struct seq_file *m, void *data)
|
|
|
{
|
|
|
struct drm_info_node *node = (struct drm_info_node *)m->private;
|
|
@@ -4083,6 +4134,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
|
|
|
{"i915_opregion", i915_opregion, 0},
|
|
|
{"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
|
|
|
{"i915_context_status", i915_context_status, 0},
|
|
|
+ {"i915_dump_lrc", i915_dump_lrc, 0},
|
|
|
{"i915_execlists", i915_execlists, 0},
|
|
|
{"i915_gen6_forcewake_count", i915_gen6_forcewake_count_info, 0},
|
|
|
{"i915_swizzle_info", i915_swizzle_info, 0},
|