aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-08-08 06:22:43 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-09-20 13:10:39 -0400
commit9b40e5d8427f12567749978f66e86e5e8fced5ab (patch)
treeb4353bad316dc1e0d5a8e57d9acfcf7d3991770d
parentf82cbddddbd368f391d45738601fa29a75cfbe3b (diff)
drm/radeon: make VM flushs a ring operation
Move flushing the VMs as function into the rings. First step to make VM operations async. Signed-off-by: Christian König <deathsimple@vodafone.de> Reviewed-by: Jerome Glisse <jglisse@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/ni.c31
-rw-r--r--drivers/gpu/drm/radeon/radeon.h6
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c12
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c8
-rw-r--r--drivers/gpu/drm/radeon/si.c15
8 files changed, 42 insertions, 38 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 7786c4a60d6c..8e3d70c7c9b7 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1502,24 +1502,9 @@ int cayman_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm, int id)
1502 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (id << 2), 0); 1502 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (id << 2), 0);
1503 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (id << 2), vm->last_pfn); 1503 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (id << 2), vm->last_pfn);
1504 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (id << 2), vm->pt_gpu_addr >> 12); 1504 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (id << 2), vm->pt_gpu_addr >> 12);
1505 /* flush hdp cache */
1506 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1507 /* bits 0-7 are the VM contexts0-7 */
1508 WREG32(VM_INVALIDATE_REQUEST, 1 << id);
1509 return 0; 1505 return 0;
1510} 1506}
1511 1507
1512void cayman_vm_tlb_flush(struct radeon_device *rdev, struct radeon_vm *vm)
1513{
1514 if (vm->id == -1)
1515 return;
1516
1517 /* flush hdp cache */
1518 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1519 /* bits 0-7 are the VM contexts0-7 */
1520 WREG32(VM_INVALIDATE_REQUEST, 1 << vm->id);
1521}
1522
1523#define R600_PTE_VALID (1 << 0) 1508#define R600_PTE_VALID (1 << 0)
1524#define R600_PTE_SYSTEM (1 << 1) 1509#define R600_PTE_SYSTEM (1 << 1)
1525#define R600_PTE_SNOOPED (1 << 2) 1510#define R600_PTE_SNOOPED (1 << 2)
@@ -1551,3 +1536,19 @@ void cayman_vm_set_page(struct radeon_device *rdev, struct radeon_vm *vm,
1551 addr |= flags; 1536 addr |= flags;
1552 writeq(addr, ptr + (pfn * 8)); 1537 writeq(addr, ptr + (pfn * 8));
1553} 1538}
1539
1540void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib)
1541{
1542 struct radeon_ring *ring = &rdev->ring[ib->ring];
1543
1544 if (!ib->vm || ib->vm->id == -1)
1545 return;
1546
1547 /* flush hdp cache */
1548 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
1549 radeon_ring_write(ring, 0x1);
1550
1551 /* bits 0-7 are the VM contexts0-7 */
1552 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
1553 radeon_ring_write(ring, 1 << ib->vm->id);
1554}
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 19a29db7c1f5..320355de9c54 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -639,6 +639,8 @@ struct radeon_vm {
639 struct mutex mutex; 639 struct mutex mutex;
640 /* last fence for cs using this vm */ 640 /* last fence for cs using this vm */
641 struct radeon_fence *fence; 641 struct radeon_fence *fence;
642 /* last flush or NULL if we still need to flush */
643 struct radeon_fence *last_flush;
642}; 644};
643 645
644struct radeon_vm_manager { 646struct radeon_vm_manager {
@@ -1116,7 +1118,6 @@ struct radeon_asic {
1116 int (*init)(struct radeon_device *rdev); 1118 int (*init)(struct radeon_device *rdev);
1117 void (*fini)(struct radeon_device *rdev); 1119 void (*fini)(struct radeon_device *rdev);
1118 int (*bind)(struct radeon_device *rdev, struct radeon_vm *vm, int id); 1120 int (*bind)(struct radeon_device *rdev, struct radeon_vm *vm, int id);
1119 void (*tlb_flush)(struct radeon_device *rdev, struct radeon_vm *vm);
1120 uint32_t (*page_flags)(struct radeon_device *rdev, 1121 uint32_t (*page_flags)(struct radeon_device *rdev,
1121 struct radeon_vm *vm, 1122 struct radeon_vm *vm,
1122 uint32_t flags); 1123 uint32_t flags);
@@ -1135,6 +1136,7 @@ struct radeon_asic {
1135 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); 1136 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1136 int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp); 1137 int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1137 bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp); 1138 bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp);
1139 void (*vm_flush)(struct radeon_device *rdev, struct radeon_ib *ib);
1138 } ring[RADEON_NUM_RINGS]; 1140 } ring[RADEON_NUM_RINGS];
1139 /* irqs */ 1141 /* irqs */
1140 struct { 1142 struct {
@@ -1733,7 +1735,6 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
1733#define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) 1735#define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev))
1734#define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) 1736#define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev))
1735#define radeon_asic_vm_bind(rdev, v, id) (rdev)->asic->vm.bind((rdev), (v), (id)) 1737#define radeon_asic_vm_bind(rdev, v, id) (rdev)->asic->vm.bind((rdev), (v), (id))
1736#define radeon_asic_vm_tlb_flush(rdev, v) (rdev)->asic->vm.tlb_flush((rdev), (v))
1737#define radeon_asic_vm_page_flags(rdev, v, flags) (rdev)->asic->vm.page_flags((rdev), (v), (flags)) 1738#define radeon_asic_vm_page_flags(rdev, v, flags) (rdev)->asic->vm.page_flags((rdev), (v), (flags))
1738#define radeon_asic_vm_set_page(rdev, v, pfn, addr, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (addr), (flags)) 1739#define radeon_asic_vm_set_page(rdev, v, pfn, addr, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (addr), (flags))
1739#define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) 1740#define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp))
@@ -1742,6 +1743,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
1742#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)].ib_execute((rdev), (ib)) 1743#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)].ib_execute((rdev), (ib))
1743#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)].ib_parse((rdev), (ib)) 1744#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)].ib_parse((rdev), (ib))
1744#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)].is_lockup((rdev), (cp)) 1745#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)].is_lockup((rdev), (cp))
1746#define radeon_ring_vm_flush(rdev, r, ib) (rdev)->asic->ring[(r)].vm_flush((rdev), (ib))
1745#define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev)) 1747#define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev))
1746#define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) 1748#define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev))
1747#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) 1749#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc))
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index f524735f05ad..4a6e39f7ffd1 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -1376,7 +1376,6 @@ static struct radeon_asic cayman_asic = {
1376 .init = &cayman_vm_init, 1376 .init = &cayman_vm_init,
1377 .fini = &cayman_vm_fini, 1377 .fini = &cayman_vm_fini,
1378 .bind = &cayman_vm_bind, 1378 .bind = &cayman_vm_bind,
1379 .tlb_flush = &cayman_vm_tlb_flush,
1380 .page_flags = &cayman_vm_page_flags, 1379 .page_flags = &cayman_vm_page_flags,
1381 .set_page = &cayman_vm_set_page, 1380 .set_page = &cayman_vm_set_page,
1382 }, 1381 },
@@ -1390,6 +1389,7 @@ static struct radeon_asic cayman_asic = {
1390 .ring_test = &r600_ring_test, 1389 .ring_test = &r600_ring_test,
1391 .ib_test = &r600_ib_test, 1390 .ib_test = &r600_ib_test,
1392 .is_lockup = &evergreen_gpu_is_lockup, 1391 .is_lockup = &evergreen_gpu_is_lockup,
1392 .vm_flush = &cayman_vm_flush,
1393 }, 1393 },
1394 [CAYMAN_RING_TYPE_CP1_INDEX] = { 1394 [CAYMAN_RING_TYPE_CP1_INDEX] = {
1395 .ib_execute = &cayman_ring_ib_execute, 1395 .ib_execute = &cayman_ring_ib_execute,
@@ -1400,6 +1400,7 @@ static struct radeon_asic cayman_asic = {
1400 .ring_test = &r600_ring_test, 1400 .ring_test = &r600_ring_test,
1401 .ib_test = &r600_ib_test, 1401 .ib_test = &r600_ib_test,
1402 .is_lockup = &evergreen_gpu_is_lockup, 1402 .is_lockup = &evergreen_gpu_is_lockup,
1403 .vm_flush = &cayman_vm_flush,
1403 }, 1404 },
1404 [CAYMAN_RING_TYPE_CP2_INDEX] = { 1405 [CAYMAN_RING_TYPE_CP2_INDEX] = {
1405 .ib_execute = &cayman_ring_ib_execute, 1406 .ib_execute = &cayman_ring_ib_execute,
@@ -1410,6 +1411,7 @@ static struct radeon_asic cayman_asic = {
1410 .ring_test = &r600_ring_test, 1411 .ring_test = &r600_ring_test,
1411 .ib_test = &r600_ib_test, 1412 .ib_test = &r600_ib_test,
1412 .is_lockup = &evergreen_gpu_is_lockup, 1413 .is_lockup = &evergreen_gpu_is_lockup,
1414 .vm_flush = &cayman_vm_flush,
1413 } 1415 }
1414 }, 1416 },
1415 .irq = { 1417 .irq = {
@@ -1479,7 +1481,6 @@ static struct radeon_asic trinity_asic = {
1479 .init = &cayman_vm_init, 1481 .init = &cayman_vm_init,
1480 .fini = &cayman_vm_fini, 1482 .fini = &cayman_vm_fini,
1481 .bind = &cayman_vm_bind, 1483 .bind = &cayman_vm_bind,
1482 .tlb_flush = &cayman_vm_tlb_flush,
1483 .page_flags = &cayman_vm_page_flags, 1484 .page_flags = &cayman_vm_page_flags,
1484 .set_page = &cayman_vm_set_page, 1485 .set_page = &cayman_vm_set_page,
1485 }, 1486 },
@@ -1493,6 +1494,7 @@ static struct radeon_asic trinity_asic = {
1493 .ring_test = &r600_ring_test, 1494 .ring_test = &r600_ring_test,
1494 .ib_test = &r600_ib_test,