dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <deathsimple@vodafone.de>
To: dri-devel@lists.freedesktop.org
Cc: "Christian König" <deathsimple@vodafone.de>
Subject: [PATCH 24/26] drm/radeon: extend ring debugfs files with fence info
Date: Wed, 25 Apr 2012 14:46:41 +0200	[thread overview]
Message-ID: <1335358003-2987-25-git-send-email-deathsimple@vodafone.de> (raw)
In-Reply-To: <1335358003-2987-1-git-send-email-deathsimple@vodafone.de>

That should aid in debugging multi ring lockups.

Signed-off-by: Christian König <deathsimple@vodafone.de>
---
 drivers/gpu/drm/radeon/radeon.h       |    1 +
 drivers/gpu/drm/radeon/radeon_fence.c |    1 +
 drivers/gpu/drm/radeon/radeon_ring.c  |   43 ++++++++++++++++++++++++++++++++-
 3 files changed, 44 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index b2d72e2..21b9a75 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -233,6 +233,7 @@ struct radeon_fence {
 	bool				signaled;
 	/* RB, DMA, etc. */
 	int				ring;
+	unsigned			emitted_at;
 	struct radeon_semaphore		*semaphore;
 	struct radeon_ib		*ib;
 };
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index 09e13e3..f8bdef5 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -71,6 +71,7 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
 		return 0;
 	}
 	fence->seq = atomic_add_return(1, &rdev->fence_drv[fence->ring].seq);
+	fence->emitted_at = rdev->ring[fence->ring].wptr;
 	radeon_fence_ring_emit(rdev, fence->ring, fence);
 	trace_radeon_fence_emit(rdev->ddev, fence->seq);
 	fence->emitted = true;
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 4d1987d..992a615 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -485,8 +485,12 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
 	struct radeon_device *rdev = dev->dev_private;
 	int ridx = *(int*)node->info_ent->data;
 	struct radeon_ring *ring = &rdev->ring[ridx];
+	struct radeon_fence *fence = NULL;
 	unsigned count, i, j;
+	unsigned long flags;
 
+	mutex_lock(&ring->mutex);
+	read_lock_irqsave(&rdev->fence_lock, flags);
 	radeon_ring_free_size(rdev, ring);
 	count = (ring->ring_size / 4) - ring->ring_free_dw;
 	seq_printf(m, "wptr(0x%04x): 0x%08x\n", ring->wptr_reg, RREG32(ring->wptr_reg));
@@ -496,10 +500,47 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)
 	seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
 	seq_printf(m, "%u dwords in ring\n", count);
 	i = ring->rptr;
+	if (!list_empty(&rdev->fence_drv[ridx].emitted)) {
+		fence = list_first_entry(&rdev->fence_drv[ridx].emitted, 
+					 struct radeon_fence, list);
+
+		if (fence->emitted_at < ring->rptr && (
+		    ring->wptr >= ring->rptr || fence->emitted_at > ring->wptr)) {
+
+			/* if first emitted fence is before current
+			   read pointer, then print that content also */
+			count = (fence->emitted_at + (ring->ring_size / 4));
+			count -= ring->wptr;
+			count &= ring->ptr_mask;
+			count = (ring->ring_size / 4) - count;
+			i = fence->emitted_at;
+		}
+	} else {
+		fence = NULL;
+	}
 	for (j = 0; j <= count; j++) {
-		seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]);
+		seq_printf(m, "r[%04d]=0x%08x", i, ring->ring[i]);
+		if (i == ring->rptr) {
+			seq_printf(m, " <- RPTR ");
+		}
+		if (fence && fence->emitted_at == i) {
+			seq_printf(m, " <- seq 0x%08x", fence->seq);
+			if (fence->semaphore) {
+				seq_printf(m, " sem @ 0x%09Lx ",
+					   (long long)fence->semaphore->gpu_addr);
+			}
+			if (fence->list.next != &rdev->fence_drv[ridx].emitted) {
+				fence = list_entry(fence->list.next,
+						   struct radeon_fence, list);
+			} else {
+				fence = NULL;
+			}
+		}
+		seq_printf(m, "\n");
 		i = (i + 1) & ring->ptr_mask;
 	}
+	read_unlock_irqrestore(&rdev->fence_lock, flags);
+	mutex_unlock(&ring->mutex);
 	return 0;
 }
 
-- 
1.7.5.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2012-04-25 12:46 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-25 12:46 Reworking of GPU reset logic Christian König
2012-04-25 12:46 ` [PATCH 01/26] drm/radeon: make radeon_gpu_is_lockup a per ring function Christian König
2012-04-25 12:46 ` [PATCH 02/26] drm/radeon: replace gpu_lockup with ring->ready flag Christian König
2012-04-25 12:46 ` [PATCH 03/26] drm/radeon: register ring debugfs handlers on init Christian König
2012-04-25 12:46 ` [PATCH 04/26] drm/radeon: use central function for IB testing Christian König
2012-04-25 12:46 ` [PATCH 05/26] drm/radeon: rework gpu lockup detection and processing Christian König
2012-04-25 12:46 ` [PATCH 06/26] drm/radeon: fix a critical bug in the SA code Christian König
2012-04-25 13:19   ` Michel Dänzer
2012-04-25 13:36     ` Christian König
2012-04-25 13:40     ` Alex Deucher
2012-04-25 14:34       ` Jerome Glisse
2012-04-25 15:38         ` Christian König
2012-04-25 12:46 ` [PATCH 07/26] drm/radeon: add proper locking to the SA v2 Christian König
2012-04-25 12:46 ` [PATCH 08/26] drm/radeon: add sub allocator debugfs file Christian König
2012-04-25 12:46 ` [PATCH 09/26] drm/radeon: add biggest hole tracking and wakequeue to the sa v3 Christian König
2012-04-25 12:46 ` [PATCH 10/26] drm/radeon: simplify semaphore handling Christian König
2012-04-25 12:46 ` [PATCH 11/26] drm/radeon: return -ENOENT in fence_wait_next v2 Christian König
2012-04-25 12:56   ` Michel Dänzer
2012-04-25 12:46 ` [PATCH 12/26] drm/radeon: rename fence_wait_last to fence_wait_empty Christian König
2012-04-25 12:57   ` Michel Dänzer
2012-04-25 12:46 ` [PATCH 13/26] drm/radeon: rip out the ib pool Christian König
2012-04-25 12:46 ` [PATCH 14/26] drm/radeon: fix a bug with the ring syncing code Christian König
2012-04-25 12:46 ` [PATCH 15/26] drm/radeon: rework recursive gpu reset handling Christian König
2012-04-25 12:46 ` [PATCH 16/26] drm/radeon: remove recursive mutex implementation Christian König
2012-04-25 12:46 ` [PATCH 17/26] drm/radeon: move lockup detection code into radeon_ring.c Christian König
2012-04-25 12:46 ` [PATCH 18/26] drm/radeon: make lockup timeout a module param Christian König
2012-04-25 12:46 ` [PATCH 19/26] drm/radeon: unlock the ring mutex while waiting for the next fence Christian König
2012-04-25 12:46 ` [PATCH 20/26] drm/radeon: make forcing ring activity a common function Christian König
2012-04-25 12:46 ` [PATCH 21/26] drm/radeon: remove r300_gpu_is_lockup Christian König
2012-04-25 12:46 ` [PATCH 22/26] drm/radeon: remove cayman_gpu_is_lockup Christian König
2012-04-25 12:46 ` [PATCH 23/26] drm/radeon: add missing locking to fence debugfs function Christian König
2012-04-25 12:46 ` Christian König [this message]
2012-04-25 12:46 ` [PATCH 25/26] drm/radeon: keep the cs relocs inside the ib Christian König
2012-04-25 12:46 ` [PATCH 26/26] drm/radeon: add the ib content and relocs to the ring debugfs file Christian König
2012-04-25 14:36   ` Jerome Glisse
2012-04-25 15:47     ` Christian König
2012-04-25 16:15       ` Jerome Glisse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1335358003-2987-25-git-send-email-deathsimple@vodafone.de \
    --to=deathsimple@vodafone.de \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox