From patchwork Mon Jul 9 10:42:02 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Christian_K=C3=B6nig?= X-Patchwork-Id: 1172521 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork1.kernel.org (Postfix) with ESMTP id DF80C40B18 for ; Mon, 9 Jul 2012 11:00:54 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AE0BF9F3B3 for ; Mon, 9 Jul 2012 03:55:54 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from outgoing.email.vodafone.de (outgoing.email.vodafone.de [139.7.28.128]) by gabe.freedesktop.org (Postfix) with ESMTP id 492599F4E2 for ; Mon, 9 Jul 2012 03:42:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=vodafone.de; h=from:to:subject:date:message-id:in-reply-to:references:mime-version:content-type:content-transfer-encoding; s=out; bh=j8Bk7sDjGOgP0NCj3pIWj15wIfs8GC521cQBswV5jes=; b=ThcmhHA+8u/b/AFmNeP3VXSJBz/b/CI5oJr1sZj9hea54OwgqwUd0VW1ebwzrL12iuIm3AW9Rxx2q0cIJcviFlFBE6/x2bIBPsjuJFphgVALrIh2PTBu3OQt+jhHMUbMayAi8U8HDEmT14+a1JvjOIE3DgMRTvPPADnnlr9UDeY= X-Authentication-Info: Sender authenticated as deathsimple@vodafone.de (using DIGEST-MD5) Received: from dslb-084-060-204-186.pools.arcor-ip.net ([84.60.204.186] helo=localhost.localdomain envelope-sender=) by SMTPIN-02.smtp.email.vodafone.de with ESMTPA id 4FFAB587.25863.574856; Mon, 09 Jul 2012 12:42:15 +0200 From: =?UTF-8?q?Christian=20K=C3=B6nig?= To: dri-devel@lists.freedesktop.org Subject: [PATCH 15/16] drm/radeon: implement ring commit tracking Date: Mon, 9 Jul 2012 12:42:02 +0200 Message-Id: <1341830523-30320-16-git-send-email-deathsimple@vodafone.de> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1341830523-30320-1-git-send-email-deathsimple@vodafone.de> References: <1341830523-30320-1-git-send-email-deathsimple@vodafone.de> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Signed-off-by: Christian König --- drivers/gpu/drm/radeon/radeon.h | 3 +++ drivers/gpu/drm/radeon/radeon_ring.c | 39 ++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index fef4257..9c11be8 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -637,6 +637,9 @@ struct radeon_ring { u32 ptr_reg_shift; u32 ptr_reg_mask; u32 nop; + unsigned *track_back; + unsigned track_ptr; + unsigned track_mask; }; /* diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index d9b2e45..994c98c 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -276,6 +276,8 @@ void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring) DRM_MEMORYBARRIER(); WREG32(ring->wptr_reg, (ring->wptr << ring->ptr_reg_shift) & ring->ptr_reg_mask); (void)RREG32(ring->wptr_reg); + ring->track_back[ring->track_ptr++] = ring->wptr_old; + ring->track_ptr &= ring->track_mask; } void radeon_ring_unlock_commit(struct radeon_device *rdev, struct radeon_ring *ring) @@ -362,6 +364,27 @@ bool radeon_ring_test_lockup(struct radeon_device *rdev, struct radeon_ring *rin return false; } +static unsigned radeon_ring_first_valid_commit(struct radeon_ring *ring) +{ + unsigned i, c, result = ring->track_ptr; + i = ring->track_ptr - 1; + while (i != ring->track_ptr) { + i &= ring->track_mask; + c = ring->track_back[i]; + + if (ring->wptr >= ring->rptr) { + if (c < ring->rptr || c >= ring->wptr) + break; + } else { + if (c < ring->rptr && c >= ring->wptr) + break; + } + + result = i--; + } + return result; +} + int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size, unsigned align, unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, @@ -403,6 +426,10 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, dev_err(rdev->dev, "(%d) ring map failed\n", r); return r; } + ring->track_back = kmalloc(ring_size / align, GFP_KERNEL); + memset(ring->track_back, 0, ring_size / align); + ring->track_ptr = 0; + ring->track_mask = ((ring->ring_size / 4) / align) - 1; } ring->ptr_mask = (ring->ring_size / 4) - 1; ring->ring_free_dw = ring->ring_size / 4; @@ -422,6 +449,7 @@ void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *ring) ring->ready = false; ring->ring = NULL; ring->ring_obj = NULL; + kfree(ring->track_back); mutex_unlock(&rdev->ring_lock); if (ring_obj) { @@ -447,7 +475,7 @@ 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]; - unsigned count, i, j; + unsigned count, i, j, commit; radeon_ring_free_size(rdev, ring); count = (ring->ring_size / 4) - ring->ring_free_dw; @@ -457,9 +485,16 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) seq_printf(m, "driver's copy of the rptr: 0x%08x\n", ring->rptr); seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); seq_printf(m, "%u dwords in ring\n", count); + commit = radeon_ring_first_valid_commit(ring); i = ring->rptr; for (j = 0; j <= count; j++) { - seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); + seq_printf(m, "r[%04x]=0x%08x", i, ring->ring[i]); + if (commit != ring->track_ptr && ring->track_back[commit] == i) { + seq_printf(m, " <-"); + ++commit; + commit &= ring->track_mask; + } + seq_printf(m, "\n"); i = (i + 1) & ring->ptr_mask; } return 0;