From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?Christian_K=F6nig?= Subject: Re: [PATCH 2/5] drm/radeon: fix cayman_vm_set_page Date: Mon, 22 Oct 2012 17:24:27 +0200 Message-ID: <5085652B.50909@vodafone.de> References: <1350896143-4730-1-git-send-email-deathsimple@vodafone.de> <1350896143-4730-2-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 5DA2E9E962 for ; Mon, 22 Oct 2012 08:24:30 -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: Alex Deucher Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On 22.10.2012 17:12, Alex Deucher wrote: > On Mon, Oct 22, 2012 at 4:55 AM, Christian K=F6nig > wrote: >> Handle requests that won't fit into a single packet. >> >> Signed-off-by: Christian K=F6nig >> --- >> drivers/gpu/drm/radeon/ni.c | 41 +++++++++++++++++++++++------------= ------ >> 1 file changed, 23 insertions(+), 18 deletions(-) >> >> diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c >> index 19b7fe1..ae6d087 100644 >> --- a/drivers/gpu/drm/radeon/ni.c >> +++ b/drivers/gpu/drm/radeon/ni.c >> @@ -1538,26 +1538,31 @@ void cayman_vm_set_page(struct radeon_device *rd= ev, uint64_t pe, >> { >> struct radeon_ring *ring =3D &rdev->ring[rdev->asic->vm.pt_ring= _index]; >> uint32_t r600_flags =3D cayman_vm_page_flags(rdev, flags); >> - int i; >> >> - radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, 1 + count * 2)= ); >> - radeon_ring_write(ring, pe); >> - radeon_ring_write(ring, upper_32_bits(pe) & 0xff); >> - for (i =3D 0; i < count; ++i) { >> - uint64_t value =3D 0; >> - if (flags & RADEON_VM_PAGE_SYSTEM) { >> - value =3D radeon_vm_map_gart(rdev, addr); >> - value &=3D 0xFFFFFFFFFFFFF000ULL; >> - addr +=3D incr; >> - >> - } else if (flags & RADEON_VM_PAGE_VALID) { >> - value =3D addr; >> - addr +=3D incr; >> - } >> + while (count) { >> + unsigned ndw =3D 1 + count * 2; >> + if (ndw > 0x3FFF) >> + ndw =3D 0x3FFF; >> + >> + radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, ndw)); >> + radeon_ring_write(ring, pe); >> + radeon_ring_write(ring, upper_32_bits(pe) & 0xff); > We need to adjust the the value of pe here if we are doing multiple loops. Oh yes indeed, missed that cause my test code didn't actually accessed = the pages. Going to send out a v2 soon. Christian. > > Alex > >> + for (; ndw > 1; ndw -=3D 2, --count) { >> + uint64_t value =3D 0; >> + if (flags & RADEON_VM_PAGE_SYSTEM) { >> + value =3D radeon_vm_map_gart(rdev, addr); >> + value &=3D 0xFFFFFFFFFFFFF000ULL; >> + addr +=3D incr; >> + >> + } else if (flags & RADEON_VM_PAGE_VALID) { >> + value =3D addr; >> + addr +=3D incr; >> + } >> >> - value |=3D r600_flags; >> - radeon_ring_write(ring, value); >> - radeon_ring_write(ring, upper_32_bits(value)); >> + value |=3D r600_flags; >> + radeon_ring_write(ring, value); >> + radeon_ring_write(ring, upper_32_bits(value)); >> + } >> } >> } >> >> -- >> 1.7.9.5 >>