Rev 5139 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5139 | Rev 5271 | ||
---|---|---|---|
Line 121... | Line 121... | ||
121 | */ |
121 | */ |
122 | void cayman_dma_ring_ib_execute(struct radeon_device *rdev, |
122 | void cayman_dma_ring_ib_execute(struct radeon_device *rdev, |
123 | struct radeon_ib *ib) |
123 | struct radeon_ib *ib) |
124 | { |
124 | { |
125 | struct radeon_ring *ring = &rdev->ring[ib->ring]; |
125 | struct radeon_ring *ring = &rdev->ring[ib->ring]; |
- | 126 | unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0; |
|
Line 126... | Line 127... | ||
126 | 127 | ||
127 | if (rdev->wb.enabled) { |
128 | if (rdev->wb.enabled) { |
128 | u32 next_rptr = ring->wptr + 4; |
129 | u32 next_rptr = ring->wptr + 4; |
129 | while ((next_rptr & 7) != 5) |
130 | while ((next_rptr & 7) != 5) |
Line 138... | Line 139... | ||
138 | /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring. |
139 | /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring. |
139 | * Pad as necessary with NOPs. |
140 | * Pad as necessary with NOPs. |
140 | */ |
141 | */ |
141 | while ((ring->wptr & 7) != 5) |
142 | while ((ring->wptr & 7) != 5) |
142 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
143 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
143 | radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, ib->vm ? ib->vm->id : 0, 0)); |
144 | radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, vm_id, 0)); |
144 | radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0)); |
145 | radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0)); |
145 | radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF)); |
146 | radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF)); |
Line 146... | Line 147... | ||
146 | 147 | ||
Line 444... | Line 445... | ||
444 | { |
445 | { |
445 | while (ib->length_dw & 0x7) |
446 | while (ib->length_dw & 0x7) |
446 | ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); |
447 | ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); |
447 | } |
448 | } |
Line 448... | Line 449... | ||
448 | 449 | ||
- | 450 | void cayman_dma_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, |
|
449 | void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) |
451 | unsigned vm_id, uint64_t pd_addr) |
450 | { |
- | |
451 | struct radeon_ring *ring = &rdev->ring[ridx]; |
- | |
452 | - | ||
453 | if (vm == NULL) |
- | |
454 | return; |
- | |
455 | 452 | { |
|
456 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
453 | 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)); |
454 | radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2)) >> 2)); |
Line 458... | Line 455... | ||
458 | radeon_ring_write(ring, vm->pd_gpu_addr >> 12); |
455 | radeon_ring_write(ring, pd_addr >> 12); |
459 | 456 | ||
460 | /* flush hdp cache */ |
457 | /* flush hdp cache */ |
461 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
458 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
Line 462... | Line 459... | ||
462 | radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2)); |
459 | radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2)); |
463 | radeon_ring_write(ring, 1); |
460 | radeon_ring_write(ring, 1); |
464 | 461 | ||
465 | /* bits 0-7 are the VM contexts0-7 */ |
462 | /* bits 0-7 are the VM contexts0-7 */ |
466 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |
463 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); |