aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-11-19 08:01:19 -0500
committerAlex Deucher <alexander.deucher@amd.com>2014-11-20 13:00:14 -0500
commitfaffaf620f32c6e907d06570f8f75845ecb1349f (patch)
tree70d38ec4143afdab79e5e16f66c4f28e2401206f
parentd967be9b80a5aa3ba228a9c2d3fea91ae99e4a07 (diff)
drm/radeon: rework vm_flush parameters
Use ring structure instead of index and provide vm_id and pd_addr separately. Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/cik.c23
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c22
-rw-r--r--drivers/gpu/drm/radeon/ni.c14
-rw-r--r--drivers/gpu/drm/radeon/ni_dma.c14
-rw-r--r--drivers/gpu/drm/radeon/radeon.h5
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h18
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c3
-rw-r--r--drivers/gpu/drm/radeon/si.c18
-rw-r--r--drivers/gpu/drm/radeon/si_dma.c19
9 files changed, 61 insertions, 75 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index cef4cb7e5438..3dc2be07dcde 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -5982,26 +5982,23 @@ static void cik_vm_decode_fault(struct radeon_device *rdev,
5982 * Update the page table base and flush the VM TLB 5982 * Update the page table base and flush the VM TLB
5983 * using the CP (CIK). 5983 * using the CP (CIK).
5984 */ 5984 */
5985void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 5985void cik_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
5986 unsigned vm_id, uint64_t pd_addr)
5986{ 5987{
5987 struct radeon_ring *ring = &rdev->ring[ridx]; 5988 int usepfp = (ring->idx == RADEON_RING_TYPE_GFX_INDEX);
5988 int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX);
5989
5990 if (vm == NULL)
5991 return;
5992 5989
5993 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 5990 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5994 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 5991 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
5995 WRITE_DATA_DST_SEL(0))); 5992 WRITE_DATA_DST_SEL(0)));
5996 if (vm->id < 8) { 5993 if (vm_id < 8) {
5997 radeon_ring_write(ring, 5994 radeon_ring_write(ring,
5998 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2); 5995 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2);
5999 } else { 5996 } else {
6000 radeon_ring_write(ring, 5997 radeon_ring_write(ring,
6001 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2); 5998 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm_id - 8) << 2)) >> 2);
6002 } 5999 }
6003 radeon_ring_write(ring, 0); 6000 radeon_ring_write(ring, 0);
6004 radeon_ring_write(ring, vm->pd_gpu_addr >> 12); 6001 radeon_ring_write(ring, pd_addr >> 12);
6005 6002
6006 /* update SH_MEM_* regs */ 6003 /* update SH_MEM_* regs */
6007 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 6004 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
@@ -6009,7 +6006,7 @@ void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
6009 WRITE_DATA_DST_SEL(0))); 6006 WRITE_DATA_DST_SEL(0)));
6010 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2); 6007 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
6011 radeon_ring_write(ring, 0); 6008 radeon_ring_write(ring, 0);
6012 radeon_ring_write(ring, VMID(vm->id)); 6009 radeon_ring_write(ring, VMID(vm_id));
6013 6010
6014 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6)); 6011 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 6));
6015 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 6012 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
@@ -6030,7 +6027,7 @@ void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
6030 radeon_ring_write(ring, VMID(0)); 6027 radeon_ring_write(ring, VMID(0));
6031 6028
6032 /* HDP flush */ 6029 /* HDP flush */
6033 cik_hdp_flush_cp_ring_emit(rdev, ridx); 6030 cik_hdp_flush_cp_ring_emit(rdev, ring->idx);
6034 6031
6035 /* bits 0-15 are the VM contexts0-15 */ 6032 /* bits 0-15 are the VM contexts0-15 */
6036 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 6033 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
@@ -6038,7 +6035,7 @@ void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
6038 WRITE_DATA_DST_SEL(0))); 6035 WRITE_DATA_DST_SEL(0)));
6039 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 6036 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
6040 radeon_ring_write(ring, 0); 6037 radeon_ring_write(ring, 0);
6041 radeon_ring_write(ring, 1 << vm->id); 6038 radeon_ring_write(ring, 1 << vm_id);
6042 6039
6043 /* compute doesn't have PFP */ 6040 /* compute doesn't have PFP */
6044 if (usepfp) { 6041 if (usepfp) {
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index 4e8432d07f15..7470a2ee83bd 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -901,25 +901,21 @@ void cik_sdma_vm_pad_ib(struct radeon_ib *ib)
901 * Update the page table base and flush the VM TLB 901 * Update the page table base and flush the VM TLB
902 * using sDMA (CIK). 902 * using sDMA (CIK).
903 */ 903 */
904void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 904void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
905 unsigned vm_id, uint64_t pd_addr)
905{ 906{
906 struct radeon_ring *ring = &rdev->ring[ridx];
907
908 if (vm == NULL)
909 return;
910
911 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); 907 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
912 if (vm->id < 8) { 908 if (vm_id < 8) {
913 radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2); 909 radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2);
914 } else { 910 } else {
915 radeon_ring_write(ring, (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2); 911 radeon_ring_write(ring, (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm_id - 8) << 2)) >> 2);
916 } 912 }
917 radeon_ring_write(ring, vm->pd_gpu_addr >> 12); 913 radeon_ring_write(ring, pd_addr >> 12);
918 914
919 /* update SH_MEM_* regs */ 915 /* update SH_MEM_* regs */
920 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); 916 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
921 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2); 917 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
922 radeon_ring_write(ring, VMID(vm->id)); 918 radeon_ring_write(ring, VMID(vm_id));
923 919
924 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); 920 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
925 radeon_ring_write(ring, SH_MEM_BASES >> 2); 921 radeon_ring_write(ring, SH_MEM_BASES >> 2);
@@ -942,11 +938,11 @@ void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm
942 radeon_ring_write(ring, VMID(0)); 938 radeon_ring_write(ring, VMID(0));
943 939
944 /* flush HDP */ 940 /* flush HDP */
945 cik_sdma_hdp_flush_ring_emit(rdev, ridx); 941 cik_sdma_hdp_flush_ring_emit(rdev, ring->idx);
946 942
947 /* flush TLB */ 943 /* flush TLB */
948 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); 944 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
949 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 945 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
950 radeon_ring_write(ring, 1 << vm->id); 946 radeon_ring_write(ring, 1 << vm_id);
951} 947}
952 948
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 3faee58946dd..bee432d3dd30 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -2502,15 +2502,11 @@ void cayman_vm_decode_fault(struct radeon_device *rdev,
2502 * Update the page table base and flush the VM TLB 2502 * Update the page table base and flush the VM TLB
2503 * using the CP (cayman-si). 2503 * using the CP (cayman-si).
2504 */ 2504 */
2505void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 2505void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
2506 unsigned vm_id, uint64_t pd_addr)
2506{ 2507{
2507 struct radeon_ring *ring = &rdev->ring[ridx]; 2508 radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
2508 2509 radeon_ring_write(ring, pd_addr >> 12);
2509 if (vm == NULL)
2510 return;
2511
2512 radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0));
2513 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
2514 2510
2515 /* flush hdp cache */ 2511 /* flush hdp cache */
2516 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0)); 2512 radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
@@ -2518,7 +2514,7 @@ void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2518 2514
2519 /* bits 0-7 are the VM contexts0-7 */ 2515 /* bits 0-7 are the VM contexts0-7 */
2520 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); 2516 radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2521 radeon_ring_write(ring, 1 << vm->id); 2517 radeon_ring_write(ring, 1 << vm_id);
2522 2518
2523 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 2519 /* sync PFP to ME, otherwise we might get invalid PFP reads */
2524 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2520 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c
index f26f0a9fb522..5a72404c9d5e 100644
--- a/drivers/gpu/drm/radeon/ni_dma.c
+++ b/drivers/gpu/drm/radeon/ni_dma.c
@@ -446,16 +446,12 @@ void cayman_dma_vm_pad_ib(struct radeon_ib *ib)
446 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); 446 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
447} 447}
448 448
449void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 449void cayman_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
450 unsigned vm_id, uint64_t pd_addr)
450{ 451{
451 struct radeon_ring *ring = &rdev->ring[ridx];
452
453 if (vm == NULL)
454 return;
455
456 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); 452 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
457 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2)); 453 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2));
458 radeon_ring_write(ring, vm->pd_gpu_addr >> 12); 454 radeon_ring_write(ring, pd_addr >> 12);
459 455
460 /* flush hdp cache */ 456 /* flush hdp cache */
461 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); 457 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
@@ -465,6 +461,6 @@ void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm
465 /* bits 0-7 are the VM contexts0-7 */ 461 /* bits 0-7 are the VM contexts0-7 */
466 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); 462 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
467 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); 463 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
468 radeon_ring_write(ring, 1 << vm->id); 464 radeon_ring_write(ring, 1 << vm_id);
469} 465}
470 466
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 5aabbe0a43f5..39f7716343a4 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1798,7 +1798,8 @@ struct radeon_asic_ring {
1798 void (*hdp_flush)(struct radeon_device *rdev, struct radeon_ring *ring); 1798 void (*hdp_flush)(struct radeon_device *rdev, struct radeon_ring *ring);
1799 bool (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, 1799 bool (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp,
1800 struct radeon_semaphore *semaphore, bool emit_wait); 1800 struct radeon_semaphore *semaphore, bool emit_wait);
1801 void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 1801 void (*vm_flush)(struct radeon_device *rdev, struct radeon_ring *ring,
1802 unsigned vm_id, uint64_t pd_addr);
1802 1803
1803 /* testing functions */ 1804 /* testing functions */
1804 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); 1805 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp);
@@ -2850,7 +2851,7 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
2850#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_execute((rdev), (ib)) 2851#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_execute((rdev), (ib))
2851#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_parse((rdev), (ib)) 2852#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_parse((rdev), (ib))
2852#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)]->is_lockup((rdev), (cp)) 2853#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)]->is_lockup((rdev), (cp))
2853#define radeon_ring_vm_flush(rdev, r, vm) (rdev)->asic->ring[(r)]->vm_flush((rdev), (r), (vm)) 2854#define radeon_ring_vm_flush(rdev, r, vm_id, pd_addr) (rdev)->asic->ring[(r)->idx]->vm_flush((rdev), (r), (vm_id), (pd_addr))
2854#define radeon_ring_get_rptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_rptr((rdev), (r)) 2855#define radeon_ring_get_rptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_rptr((rdev), (r))
2855#define radeon_ring_get_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_wptr((rdev), (r)) 2856#define radeon_ring_get_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_wptr((rdev), (r))
2856#define radeon_ring_set_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->set_wptr((rdev), (r)) 2857#define radeon_ring_set_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->set_wptr((rdev), (r))
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index d8ace5b28a5b..2a45d548d5ec 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -599,7 +599,8 @@ int cayman_asic_reset(struct radeon_device *rdev);
599void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 599void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
600int cayman_vm_init(struct radeon_device *rdev); 600int cayman_vm_init(struct radeon_device *rdev);
601void cayman_vm_fini(struct radeon_device *rdev); 601void cayman_vm_fini(struct radeon_device *rdev);
602void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 602void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
603 unsigned vm_id, uint64_t pd_addr);
603uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); 604uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags);
604int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 605int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
605int evergreen_dma_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 606int evergreen_dma_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
@@ -624,7 +625,8 @@ void cayman_dma_vm_set_pages(struct radeon_device *rdev,
624 uint32_t incr, uint32_t flags); 625 uint32_t incr, uint32_t flags);
625void cayman_dma_vm_pad_ib(struct radeon_ib *ib); 626void cayman_dma_vm_pad_ib(struct radeon_ib *ib);
626 627
627void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 628void cayman_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
629 unsigned vm_id, uint64_t pd_addr);
628 630
629u32 cayman_gfx_get_rptr(struct radeon_device *rdev, 631u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
630 struct radeon_ring *ring); 632 struct radeon_ring *ring);
@@ -699,7 +701,8 @@ int si_irq_set(struct radeon_device *rdev);
699int si_irq_process(struct radeon_device *rdev); 701int si_irq_process(struct radeon_device *rdev);
700int si_vm_init(struct radeon_device *rdev); 702int si_vm_init(struct radeon_device *rdev);
701void si_vm_fini(struct radeon_device *rdev); 703void si_vm_fini(struct radeon_device *rdev);
702void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 704void si_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
705 unsigned vm_id, uint64_t pd_addr);
703int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 706int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
704struct radeon_fence *si_copy_dma(struct radeon_device *rdev, 707struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
705 uint64_t src_offset, uint64_t dst_offset, 708 uint64_t src_offset, uint64_t dst_offset,
@@ -721,7 +724,8 @@ void si_dma_vm_set_pages(struct radeon_device *rdev,
721 uint64_t addr, unsigned count, 724 uint64_t addr, unsigned count,
722 uint32_t incr, uint32_t flags); 725 uint32_t incr, uint32_t flags);
723 726
724void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 727void si_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
728 unsigned vm_id, uint64_t pd_addr);
725u32 si_get_xclk(struct radeon_device *rdev); 729u32 si_get_xclk(struct radeon_device *rdev);
726uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev); 730uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev);
727int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 731int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
@@ -793,7 +797,8 @@ int cik_irq_set(struct radeon_device *rdev);
793int cik_irq_process(struct radeon_device *rdev); 797int cik_irq_process(struct radeon_device *rdev);
794int cik_vm_init(struct radeon_device *rdev); 798int cik_vm_init(struct radeon_device *rdev);
795void cik_vm_fini(struct radeon_device *rdev); 799void cik_vm_fini(struct radeon_device *rdev);
796void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 800void cik_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
801 unsigned vm_id, uint64_t pd_addr);
797 802
798void cik_sdma_vm_copy_pages(struct radeon_device *rdev, 803void cik_sdma_vm_copy_pages(struct radeon_device *rdev,
799 struct radeon_ib *ib, 804 struct radeon_ib *ib,
@@ -811,7 +816,8 @@ void cik_sdma_vm_set_pages(struct radeon_device *rdev,
811 uint32_t incr, uint32_t flags); 816 uint32_t incr, uint32_t flags);
812void cik_sdma_vm_pad_ib(struct radeon_ib *ib); 817void cik_sdma_vm_pad_ib(struct radeon_ib *ib);
813 818
814void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 819void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
820 unsigned vm_id, uint64_t pd_addr);
815int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 821int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
816u32 cik_gfx_get_rptr(struct radeon_device *rdev, 822u32 cik_gfx_get_rptr(struct radeon_device *rdev,
817 struct radeon_ring *ring); 823 struct radeon_ring *ring);
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index dfde266529e2..9d0f87be6fa0 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -243,7 +243,8 @@ void radeon_vm_flush(struct radeon_device *rdev,
243 if (!vm->last_flush || pd_addr != vm->pd_gpu_addr) { 243 if (!vm->last_flush || pd_addr != vm->pd_gpu_addr) {
244 trace_radeon_vm_flush(pd_addr, ring, vm->id); 244 trace_radeon_vm_flush(pd_addr, ring, vm->id);
245 vm->pd_gpu_addr = pd_addr; 245 vm->pd_gpu_addr = pd_addr;
246 radeon_ring_vm_flush(rdev, ring, vm); 246 radeon_ring_vm_flush(rdev, &rdev->ring[ring],
247 vm->id, vm->pd_gpu_addr);
247 } 248 }
248} 249}
249 250
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index eeea5b6a1775..e91968b04154 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -5020,27 +5020,23 @@ static void si_vm_decode_fault(struct radeon_device *rdev,
5020 block, mc_id); 5020 block, mc_id);
5021} 5021}
5022 5022
5023void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 5023void si_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
5024 unsigned vm_id, uint64_t pd_addr)
5024{ 5025{
5025 struct radeon_ring *ring = &rdev->ring[ridx];
5026
5027 if (vm == NULL)
5028 return;
5029
5030 /* write new base address */ 5026 /* write new base address */
5031 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 5027 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5032 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) | 5028 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
5033 WRITE_DATA_DST_SEL(0))); 5029 WRITE_DATA_DST_SEL(0)));
5034 5030
5035 if (vm->id < 8) { 5031 if (vm_id < 8) {
5036 radeon_ring_write(ring, 5032 radeon_ring_write(ring,
5037 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2); 5033 (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2);
5038 } else { 5034 } else {
5039 radeon_ring_write(ring, 5035 radeon_ring_write(ring,
5040 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2); 5036 (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm_id - 8) << 2)) >> 2);
5041 } 5037 }
5042 radeon_ring_write(ring, 0); 5038 radeon_ring_write(ring, 0);
5043 radeon_ring_write(ring, vm->pd_gpu_addr >> 12); 5039 radeon_ring_write(ring, pd_addr >> 12);
5044 5040
5045 /* flush hdp cache */ 5041 /* flush hdp cache */
5046 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 5042 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
@@ -5056,7 +5052,7 @@ void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
5056 WRITE_DATA_DST_SEL(0))); 5052 WRITE_DATA_DST_SEL(0)));
5057 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 5053 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5058 radeon_ring_write(ring, 0); 5054 radeon_ring_write(ring, 0);
5059 radeon_ring_write(ring, 1 << vm->id); 5055 radeon_ring_write(ring, 1 << vm_id);
5060 5056
5061 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 5057 /* sync PFP to ME, otherwise we might get invalid PFP reads */
5062 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 5058 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
index b58f12b762d7..e8bc0a516b57 100644
--- a/drivers/gpu/drm/radeon/si_dma.c
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -185,20 +185,17 @@ void si_dma_vm_set_pages(struct radeon_device *rdev,
185 } 185 }
186} 186}
187 187
188void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 188void si_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
189{ 189 unsigned vm_id, uint64_t pd_addr)
190 struct radeon_ring *ring = &rdev->ring[ridx];
191
192 if (vm == NULL)
193 return;
194 190
191{
195 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); 192 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
196 if (vm->id < 8) { 193 if (vm_id < 8) {
197 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2)); 194 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2));
198 } else { 195 } else {
199 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2)); 196 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm_id - 8) << 2)) >> 2));
200 } 197 }
201 radeon_ring_write(ring, vm->pd_gpu_addr >> 12); 198 radeon_ring_write(ring, pd_addr >> 12);
202 199
203 /* flush hdp cache */ 200 /* flush hdp cache */
204 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); 201 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
@@ -208,7 +205,7 @@ void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
208 /* bits 0-7 are the VM contexts0-7 */ 205 /* bits 0-7 are the VM contexts0-7 */
209 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0)); 206 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
210 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2)); 207 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
211 radeon_ring_write(ring, 1 << vm->id); 208 radeon_ring_write(ring, 1 << vm_id);
212} 209}
213 210
214/** 211/**