[PATCH 2/5] drm/radeon: fix cayman_vm_set_page
Alex Deucher
alexdeucher at gmail.com
Mon Oct 22 08:12:45 PDT 2012
On Mon, Oct 22, 2012 at 4:55 AM, Christian König
<deathsimple at vodafone.de> wrote:
> Handle requests that won't fit into a single packet.
>
> Signed-off-by: Christian König <deathsimple at vodafone.de>
> ---
> 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 *rdev, uint64_t pe,
> {
> struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index];
> uint32_t r600_flags = 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 = 0; i < count; ++i) {
> - uint64_t value = 0;
> - if (flags & RADEON_VM_PAGE_SYSTEM) {
> - value = radeon_vm_map_gart(rdev, addr);
> - value &= 0xFFFFFFFFFFFFF000ULL;
> - addr += incr;
> -
> - } else if (flags & RADEON_VM_PAGE_VALID) {
> - value = addr;
> - addr += incr;
> - }
> + while (count) {
> + unsigned ndw = 1 + count * 2;
> + if (ndw > 0x3FFF)
> + ndw = 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.
Alex
> + for (; ndw > 1; ndw -= 2, --count) {
> + uint64_t value = 0;
> + if (flags & RADEON_VM_PAGE_SYSTEM) {
> + value = radeon_vm_map_gart(rdev, addr);
> + value &= 0xFFFFFFFFFFFFF000ULL;
> + addr += incr;
> +
> + } else if (flags & RADEON_VM_PAGE_VALID) {
> + value = addr;
> + addr += incr;
> + }
>
> - value |= r600_flags;
> - radeon_ring_write(ring, value);
> - radeon_ring_write(ring, upper_32_bits(value));
> + value |= r600_flags;
> + radeon_ring_write(ring, value);
> + radeon_ring_write(ring, upper_32_bits(value));
> + }
> }
> }
>
> --
> 1.7.9.5
>
More information about the dri-devel
mailing list