Subversion Repositories Kolibri OS

Rev

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));