aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/radeon/ni.c
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-08-11 15:00:30 +0200
committerAlex Deucher <alexander.deucher@amd.com>2012-09-20 13:10:40 -0400
commit2a6f1abbb48f1d90f20b8198c4894c0469468405 (patch)
treed32ccec823f7a6939689ec87b7a1cdb074291100 /drivers/gpu/drm/radeon/ni.c
parent3e8970f96ba2539539059736039f09624da9fe11 (diff)
drm/radeon: make page table updates async v2
Currently doing the update with the CP. v2: Rebased on Jeromes bugfix. Make validity comparison more human readable. Signed-off-by: Christian König <deathsimple@vodafone.de>
Diffstat (limited to 'drivers/gpu/drm/radeon/ni.c')
-rw-r--r--drivers/gpu/drm/radeon/ni.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 8bec8113d3a..c803328c0cf 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1521,20 +1521,24 @@ void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm,
unsigned pfn, struct ttm_mem_reg *mem,
unsigned npages, uint32_t flags)
{
- void __iomem *ptr = (void *)vm->pt;
- uint64_t addr;
+ struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index];
+ uint64_t addr, pt = vm->pt_gpu_addr + pfn * 8;
int i;
addr = flags = cayman_vm_page_flags(rdev, flags);
- for (i = 0; i < npages; ++i, ++pfn) {
- if (mem) {
- addr = radeon_vm_get_addr(rdev, mem, i);
+ radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, 1 + npages * 2));
+ radeon_ring_write(ring, pt & 0xffffffff);
+ radeon_ring_write(ring, (pt >> 32) & 0xff);
+ for (i = 0; i < npages; ++i) {
+ if (mem) {
+ addr = radeon_vm_get_addr(rdev, mem, i);
addr = addr & 0xFFFFFFFFFFFFF000ULL;
addr |= flags;
- }
- writeq(addr, ptr + (pfn * 8));
- }
+ }
+ radeon_ring_write(ring, addr & 0xffffffff);
+ radeon_ring_write(ring, (addr >> 32) & 0xffffffff);
+ }
}
void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib)