diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-27 10:11:53 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-27 18:29:39 -0400 |
commit | c2c347a9eeda1b9b69c8fc393fd933747fbb2e11 (patch) | |
tree | 87892f436d057e19b9573ef27e0b6a4c85c24058 /drivers/gpu/drm/i915/i915_debugfs.c | |
parent | 893eead092f14e42cac054a394a86e3c6e016b68 (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.c | 134 |
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 | ||
51 | enum { | ||
52 | RENDER_RING, | ||
53 | BSD_RING, | ||
54 | BLT_RING, | ||
55 | }; | ||
56 | |||
51 | static const char *yesno(int v) | 57 | static 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}, |