From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?Christian_K=F6nig?= Subject: Re: [PATCH 15/16] drm/radeon: implement ring commit tracking Date: Mon, 09 Jul 2012 17:48:56 +0200 Message-ID: <4FFAFD68.8030205@vodafone.de> References: <1341830523-30320-1-git-send-email-deathsimple@vodafone.de> <1341830523-30320-16-git-send-email-deathsimple@vodafone.de> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1"; Format="flowed" Content-Transfer-Encoding: quoted-printable Return-path: Received: from outgoing.email.vodafone.de (outgoing.email.vodafone.de [139.7.28.128]) by gabe.freedesktop.org (Postfix) with ESMTP id F34A39E7E6 for ; Mon, 9 Jul 2012 08:48:58 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: Jerome Glisse Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On 09.07.2012 17:36, Jerome Glisse wrote: > On Mon, Jul 9, 2012 at 6:42 AM, Christian K=F6nig wrote: >> Signed-off-by: Christian K=F6nig > Bit too complex to my taste, what about attached patch, it's lot > simpler. (Haven't tested > the patch but it should work) Cool idea! Depending on the writeback mechanism might not be the best = part of it, but in general speaking all rings should have more than = enough scratch registers for that!!! Going to change it. Thanks, Christian. > > Cheers, > Jerome > >> --- >> 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/ra= deon.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/rade= on/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) & ri= ng->ptr_reg_mask); >> (void)RREG32(ring->wptr_reg); >> + ring->track_back[ring->track_ptr++] =3D ring->wptr_old; >> + ring->track_ptr &=3D ring->track_mask; >> } >> >> void radeon_ring_unlock_commit(struct radeon_device *rdev, struct rade= on_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 =3D ring->track_ptr; >> + i =3D ring->track_ptr - 1; >> + while (i !=3D ring->track_ptr) { >> + i &=3D ring->track_mask; >> + c =3D ring->track_back[i]; >> + >> + if (ring->wptr >=3D ring->rptr) { >> + if (c < ring->rptr || c >=3D ring->wptr) >> + break; >> + } else { >> + if (c < ring->rptr && c >=3D ring->wptr) >> + break; >> + } >> + >> + result =3D i--; >> + } >> + return result; >> +} >> + >> int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *r= ing, >> unsigned ring_size, unsigned align, >> unsigned rptr_offs, unsigned rptr_reg, unsigned wp= tr_reg, >> @@ -403,6 +426,10 @@ int radeon_ring_init(struct radeon_device *rdev, st= ruct radeon_ring *ring, >> dev_err(rdev->dev, "(%d) ring map failed\n", r); >> return r; >> } >> + ring->track_back =3D kmalloc(ring_size / align, GFP_KERN= EL); >> + memset(ring->track_back, 0, ring_size / align); >> + ring->track_ptr =3D 0; >> + ring->track_mask =3D ((ring->ring_size / 4) / align) - 1; >> } >> ring->ptr_mask =3D (ring->ring_size / 4) - 1; >> ring->ring_free_dw =3D ring->ring_size / 4; >> @@ -422,6 +449,7 @@ void radeon_ring_fini(struct radeon_device *rdev, st= ruct radeon_ring *ring) >> ring->ready =3D false; >> ring->ring =3D NULL; >> ring->ring_obj =3D 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 =3D dev->dev_private; >> int ridx =3D *(int*)node->info_ent->data; >> struct radeon_ring *ring =3D &rdev->ring[ridx]; >> - unsigned count, i, j; >> + unsigned count, i, j, commit; >> >> radeon_ring_free_size(rdev, ring); >> count =3D (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 =3D radeon_ring_first_valid_commit(ring); >> i =3D ring->rptr; >> for (j =3D 0; j <=3D count; j++) { >> - seq_printf(m, "r[%04d]=3D0x%08x\n", i, ring->ring[i]); >> + seq_printf(m, "r[%04x]=3D0x%08x", i, ring->ring[i]); >> + if (commit !=3D ring->track_ptr && ring->track_back[comm= it] =3D=3D i) { >> + seq_printf(m, " <-"); >> + ++commit; >> + commit &=3D ring->track_mask; >> + } >> + seq_printf(m, "\n"); >> i =3D (i + 1) & ring->ptr_mask; >> } >> return 0; >> -- >> 1.7.9.5 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/dri-devel