diff options
author | Christian König <christian.koenig@amd.com> | 2014-11-19 08:01:19 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-11-20 13:00:14 -0500 |
commit | faffaf620f32c6e907d06570f8f75845ecb1349f (patch) | |
tree | 70d38ec4143afdab79e5e16f66c4f28e2401206f | |
parent | d967be9b80a5aa3ba228a9c2d3fea91ae99e4a07 (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.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni_dma.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_vm.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si_dma.c | 19 |
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 | */ |
5985 | void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 5985 | void 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 | */ |
904 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 904 | void 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 | */ |
2505 | void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 2505 | void 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 | ||
449 | void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 449 | void 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); | |||
599 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 599 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
600 | int cayman_vm_init(struct radeon_device *rdev); | 600 | int cayman_vm_init(struct radeon_device *rdev); |
601 | void cayman_vm_fini(struct radeon_device *rdev); | 601 | void cayman_vm_fini(struct radeon_device *rdev); |
602 | void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 602 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
603 | unsigned vm_id, uint64_t pd_addr); | ||
603 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); | 604 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); |
604 | int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 605 | int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
605 | int evergreen_dma_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 606 | int 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); |
625 | void cayman_dma_vm_pad_ib(struct radeon_ib *ib); | 626 | void cayman_dma_vm_pad_ib(struct radeon_ib *ib); |
626 | 627 | ||
627 | void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 628 | void cayman_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
629 | unsigned vm_id, uint64_t pd_addr); | ||
628 | 630 | ||
629 | u32 cayman_gfx_get_rptr(struct radeon_device *rdev, | 631 | u32 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); | |||
699 | int si_irq_process(struct radeon_device *rdev); | 701 | int si_irq_process(struct radeon_device *rdev); |
700 | int si_vm_init(struct radeon_device *rdev); | 702 | int si_vm_init(struct radeon_device *rdev); |
701 | void si_vm_fini(struct radeon_device *rdev); | 703 | void si_vm_fini(struct radeon_device *rdev); |
702 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 704 | void si_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
705 | unsigned vm_id, uint64_t pd_addr); | ||
703 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 706 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
704 | struct radeon_fence *si_copy_dma(struct radeon_device *rdev, | 707 | struct 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 | ||
724 | void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 727 | void si_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
728 | unsigned vm_id, uint64_t pd_addr); | ||
725 | u32 si_get_xclk(struct radeon_device *rdev); | 729 | u32 si_get_xclk(struct radeon_device *rdev); |
726 | uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev); | 730 | uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev); |
727 | int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); | 731 | int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); |
@@ -793,7 +797,8 @@ int cik_irq_set(struct radeon_device *rdev); | |||
793 | int cik_irq_process(struct radeon_device *rdev); | 797 | int cik_irq_process(struct radeon_device *rdev); |
794 | int cik_vm_init(struct radeon_device *rdev); | 798 | int cik_vm_init(struct radeon_device *rdev); |
795 | void cik_vm_fini(struct radeon_device *rdev); | 799 | void cik_vm_fini(struct radeon_device *rdev); |
796 | void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 800 | void cik_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
801 | unsigned vm_id, uint64_t pd_addr); | ||
797 | 802 | ||
798 | void cik_sdma_vm_copy_pages(struct radeon_device *rdev, | 803 | void 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); |
812 | void cik_sdma_vm_pad_ib(struct radeon_ib *ib); | 817 | void cik_sdma_vm_pad_ib(struct radeon_ib *ib); |
813 | 818 | ||
814 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 819 | void cik_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
820 | unsigned vm_id, uint64_t pd_addr); | ||
815 | int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 821 | int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
816 | u32 cik_gfx_get_rptr(struct radeon_device *rdev, | 822 | u32 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 | ||
5023 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 5023 | void 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 | ||
188 | void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 188 | void 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 | /** |