aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-10-27 10:11:53 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-10-27 18:29:39 -0400
commitc2c347a9eeda1b9b69c8fc393fd933747fbb2e11 (patch)
tree87892f436d057e19b9573ef27e0b6a4c85c24058 /drivers/gpu/drm/i915/i915_debugfs.c
parent893eead092f14e42cac054a394a86e3c6e016b68 (diff)
drm/i915/debugfs: Include info for the other rings
The render ring is not alone any more! And the other rings are just as troublesome... Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c134
1 files changed, 93 insertions, 41 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index c1b04b6056da..c5aa6bee3abb 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -48,6 +48,12 @@ enum {
48 DEFERRED_FREE_LIST, 48 DEFERRED_FREE_LIST,
49}; 49};
50 50
51enum {
52 RENDER_RING,
53 BSD_RING,
54 BLT_RING,
55};
56
51static const char *yesno(int v) 57static const char *yesno(int v)
52{ 58{
53 return v ? "yes" : "no"; 59 return v ? "yes" : "no";
@@ -265,21 +271,51 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
265 struct drm_device *dev = node->minor->dev; 271 struct drm_device *dev = node->minor->dev;
266 drm_i915_private_t *dev_priv = dev->dev_private; 272 drm_i915_private_t *dev_priv = dev->dev_private;
267 struct drm_i915_gem_request *gem_request; 273 struct drm_i915_gem_request *gem_request;
268 int ret; 274 int ret, count;
269 275
270 ret = mutex_lock_interruptible(&dev->struct_mutex); 276 ret = mutex_lock_interruptible(&dev->struct_mutex);
271 if (ret) 277 if (ret)
272 return ret; 278 return ret;
273 279
274 seq_printf(m, "Request:\n"); 280 count = 0;
275 list_for_each_entry(gem_request, &dev_priv->render_ring.request_list, 281 if (!list_empty(&dev_priv->render_ring.request_list)) {
276 list) { 282 seq_printf(m, "Render requests:\n");
277 seq_printf(m, " %d @ %d\n", 283 list_for_each_entry(gem_request,
278 gem_request->seqno, 284 &dev_priv->render_ring.request_list,
279 (int) (jiffies - gem_request->emitted_jiffies)); 285 list) {
286 seq_printf(m, " %d @ %d\n",
287 gem_request->seqno,
288 (int) (jiffies - gem_request->emitted_jiffies));
289 }
290 count++;
291 }
292 if (!list_empty(&dev_priv->bsd_ring.request_list)) {
293 seq_printf(m, "BSD requests:\n");
294 list_for_each_entry(gem_request,
295 &dev_priv->bsd_ring.request_list,
296 list) {
297 seq_printf(m, " %d @ %d\n",
298 gem_request->seqno,
299 (int) (jiffies - gem_request->emitted_jiffies));
300 }
301 count++;
302 }
303 if (!list_empty(&dev_priv->blt_ring.request_list)) {
304 seq_printf(m, "BLT requests:\n");
305 list_for_each_entry(gem_request,
306 &dev_priv->blt_ring.request_list,
307 list) {
308 seq_printf(m, " %d @ %d\n",
309 gem_request->seqno,
310 (int) (jiffies - gem_request->emitted_jiffies));
311 }
312 count++;
280 } 313 }
281 mutex_unlock(&dev->struct_mutex); 314 mutex_unlock(&dev->struct_mutex);
282 315
316 if (count == 0)
317 seq_printf(m, "No requests\n");
318
283 return 0; 319 return 0;
284} 320}
285 321
@@ -354,11 +390,17 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
354 } 390 }
355 seq_printf(m, "Interrupts received: %d\n", 391 seq_printf(m, "Interrupts received: %d\n",
356 atomic_read(&dev_priv->irq_received)); 392 atomic_read(&dev_priv->irq_received));
357 if (dev_priv->render_ring.status_page.page_addr != NULL) { 393 if (dev_priv->render_ring.get_seqno) {
358 seq_printf(m, "Current sequence: %d\n", 394 seq_printf(m, "Current sequence (render): %d\n",
359 dev_priv->render_ring.get_seqno(&dev_priv->render_ring)); 395 dev_priv->render_ring.get_seqno(&dev_priv->render_ring));
360 } else { 396 }
361 seq_printf(m, "Current sequence: hws uninitialized\n"); 397 if (dev_priv->bsd_ring.get_seqno) {
398 seq_printf(m, "Current sequence (BSD): %d\n",
399 dev_priv->bsd_ring.get_seqno(&dev_priv->bsd_ring));
400 }
401 if (dev_priv->blt_ring.get_seqno) {
402 seq_printf(m, "Current sequence (BLT): %d\n",
403 dev_priv->blt_ring.get_seqno(&dev_priv->blt_ring));
362 } 404 }
363 seq_printf(m, "Waiter sequence: %d\n", 405 seq_printf(m, "Waiter sequence: %d\n",
364 dev_priv->mm.waiting_gem_seqno); 406 dev_priv->mm.waiting_gem_seqno);
@@ -385,24 +427,12 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
385 for (i = 0; i < dev_priv->num_fence_regs; i++) { 427 for (i = 0; i < dev_priv->num_fence_regs; i++) {
386 struct drm_gem_object *obj = dev_priv->fence_regs[i].obj; 428 struct drm_gem_object *obj = dev_priv->fence_regs[i].obj;
387 429
388 if (obj == NULL) { 430 seq_printf(m, "Fenced object[%2d] = ", i);
389 seq_printf(m, "Fenced object[%2d] = unused\n", i); 431 if (obj == NULL)
390 } else { 432 seq_printf(m, "unused");
391 struct drm_i915_gem_object *obj_priv; 433 else
392 434 describe_obj(m, to_intel_bo(obj));
393 obj_priv = to_intel_bo(obj); 435 seq_printf(m, "\n");
394 seq_printf(m, "Fenced object[%2d] = %p: %s "
395 "%08x %08zx %08x %s %08x %08x %d",
396 i, obj, get_pin_flag(obj_priv),
397 obj_priv->gtt_offset,
398 obj->size, obj_priv->stride,
399 get_tiling_flag(obj_priv),
400 obj->read_domains, obj->write_domain,
401 obj_priv->last_rendering_seqno);
402 if (obj->name)
403 seq_printf(m, " (name: %d)", obj->name);
404 seq_printf(m, "\n");
405 }
406 } 436 }
407 mutex_unlock(&dev->struct_mutex); 437 mutex_unlock(&dev->struct_mutex);
408 438
@@ -477,19 +507,27 @@ static int i915_ringbuffer_data(struct seq_file *m, void *data)
477 struct drm_info_node *node = (struct drm_info_node *) m->private; 507 struct drm_info_node *node = (struct drm_info_node *) m->private;
478 struct drm_device *dev = node->minor->dev; 508 struct drm_device *dev = node->minor->dev;
479 drm_i915_private_t *dev_priv = dev->dev_private; 509 drm_i915_private_t *dev_priv = dev->dev_private;
510 struct intel_ring_buffer *ring;
480 int ret; 511 int ret;
481 512
513 switch ((uintptr_t)node->info_ent->data) {
514 case RENDER_RING: ring = &dev_priv->render_ring; break;
515 case BSD_RING: ring = &dev_priv->bsd_ring; break;
516 case BLT_RING: ring = &dev_priv->blt_ring; break;
517 default: return -EINVAL;
518 }
519
482 ret = mutex_lock_interruptible(&dev->struct_mutex); 520 ret = mutex_lock_interruptible(&dev->struct_mutex);
483 if (ret) 521 if (ret)
484 return ret; 522 return ret;
485 523
486 if (!dev_priv->render_ring.gem_object) { 524 if (!ring->gem_object) {
487 seq_printf(m, "No ringbuffer setup\n"); 525 seq_printf(m, "No ringbuffer setup\n");
488 } else { 526 } else {
489 u8 *virt = dev_priv->render_ring.virtual_start; 527 u8 *virt = ring->virtual_start;
490 uint32_t off; 528 uint32_t off;
491 529
492 for (off = 0; off < dev_priv->render_ring.size; off += 4) { 530 for (off = 0; off < ring->size; off += 4) {
493 uint32_t *ptr = (uint32_t *)(virt + off); 531 uint32_t *ptr = (uint32_t *)(virt + off);
494 seq_printf(m, "%08x : %08x\n", off, *ptr); 532 seq_printf(m, "%08x : %08x\n", off, *ptr);
495 } 533 }
@@ -504,15 +542,25 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data)
504 struct drm_info_node *node = (struct drm_info_node *) m->private; 542 struct drm_info_node *node = (struct drm_info_node *) m->private;
505 struct drm_device *dev = node->minor->dev; 543 struct drm_device *dev = node->minor->dev;
506 drm_i915_private_t *dev_priv = dev->dev_private; 544 drm_i915_private_t *dev_priv = dev->dev_private;
507 unsigned int head, tail; 545 struct intel_ring_buffer *ring;
546
547 switch ((uintptr_t)node->info_ent->data) {
548 case RENDER_RING: ring = &dev_priv->render_ring; break;
549 case BSD_RING: ring = &dev_priv->bsd_ring; break;
550 case BLT_RING: ring = &dev_priv->blt_ring; break;
551 default: return -EINVAL;
552 }
508 553
509 head = I915_READ(PRB0_HEAD) & HEAD_ADDR; 554 if (ring->size == 0)
510 tail = I915_READ(PRB0_TAIL) & TAIL_ADDR; 555 return 0;
511 556
512 seq_printf(m, "RingHead : %08x\n", head); 557 seq_printf(m, "Ring %s:\n", ring->name);
513 seq_printf(m, "RingTail : %08x\n", tail); 558 seq_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR);
514 seq_printf(m, "RingSize : %08lx\n", dev_priv->render_ring.size); 559 seq_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR);
515 seq_printf(m, "Acthd : %08x\n", I915_READ(INTEL_INFO(dev)->gen >= 4 ? ACTHD_I965 : ACTHD)); 560 seq_printf(m, " Size : %08x\n", ring->size);
561 seq_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring));
562 seq_printf(m, " Control : %08x\n", I915_READ_CTL(ring));
563 seq_printf(m, " Start : %08x\n", I915_READ_START(ring));
516 564
517 return 0; 565 return 0;
518} 566}
@@ -1029,8 +1077,12 @@ static struct drm_info_list i915_debugfs_list[] = {
1029 {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0}, 1077 {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
1030 {"i915_gem_interrupt", i915_interrupt_info, 0}, 1078 {"i915_gem_interrupt", i915_interrupt_info, 0},
1031 {"i915_gem_hws", i915_hws_info, 0}, 1079 {"i915_gem_hws", i915_hws_info, 0},
1032 {"i915_ringbuffer_data", i915_ringbuffer_data, 0}, 1080 {"i915_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RENDER_RING},
1033 {"i915_ringbuffer_info", i915_ringbuffer_info, 0}, 1081 {"i915_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RENDER_RING},
1082 {"i915_bsd_ringbuffer_data", i915_ringbuffer_data, 0, (void *)BSD_RING},
1083 {"i915_bsd_ringbuffer_info", i915_ringbuffer_info, 0, (void *)BSD_RING},
1084 {"i915_blt_ringbuffer_data", i915_ringbuffer_data, 0, (void *)BLT_RING},
1085 {"i915_blt_ringbuffer_info", i915_ringbuffer_info, 0, (void *)BLT_RING},
1034 {"i915_batchbuffers", i915_batchbuffer_info, 0}, 1086 {"i915_batchbuffers", i915_batchbuffer_info, 0},
1035 {"i915_error_state", i915_error_state, 0}, 1087 {"i915_error_state", i915_error_state, 0},
1036 {"i915_rstdby_delays", i915_rstdby_delays, 0}, 1088 {"i915_rstdby_delays", i915_rstdby_delays, 0},