diff options
| author | Christian König <deathsimple@vodafone.de> | 2012-08-08 06:22:43 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2012-09-20 13:10:39 -0400 |
| commit | 9b40e5d8427f12567749978f66e86e5e8fced5ab (patch) | |
| tree | b4353bad316dc1e0d5a8e57d9acfcf7d3991770d | |
| parent | f82cbddddbd368f391d45738601fa29a75cfbe3b (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.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 15 |
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 | ||
| 1512 | void 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 | |||
| 1540 | void 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 | ||
| 644 | struct radeon_vm_manager { | 646 | struct 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, | ||
