diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 146 | 
1 files changed, 62 insertions, 84 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 77fdd9911c3c..4c34dbc7a254 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -206,10 +206,10 @@ static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)  	for (i = 0; i < count; i++)  		if (sdma && sdma->burst_nop && (i == 0)) -			amdgpu_ring_write(ring, ring->nop | +			amdgpu_ring_write(ring, ring->funcs->nop |  					  SDMA_NOP_COUNT(count - 1));  		else -			amdgpu_ring_write(ring, ring->nop); +			amdgpu_ring_write(ring, ring->funcs->nop);  }  /** @@ -622,7 +622,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  {  	struct amdgpu_device *adev = ring->adev;  	struct amdgpu_ib ib; -	struct fence *f = NULL; +	struct dma_fence *f = NULL;  	unsigned index;  	u32 tmp = 0;  	u64 gpu_addr; @@ -655,7 +655,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	if (r)  		goto err1; -	r = fence_wait_timeout(f, false, timeout); +	r = dma_fence_wait_timeout(f, false, timeout);  	if (r == 0) {  		DRM_ERROR("amdgpu: IB test timed out\n");  		r = -ETIMEDOUT; @@ -675,7 +675,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  err1:  	amdgpu_ib_free(adev, &ib, NULL); -	fence_put(f); +	dma_fence_put(f);  err0:  	amdgpu_wb_free(adev, index);  	return r; @@ -695,24 +695,16 @@ static void cik_sdma_vm_copy_pte(struct amdgpu_ib *ib,  				 uint64_t pe, uint64_t src,  				 unsigned count)  { -	while (count) { -		unsigned bytes = count * 8; -		if (bytes > 0x1FFFF8) -			bytes = 0x1FFFF8; +	unsigned bytes = count * 8; -		ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, -			SDMA_WRITE_SUB_OPCODE_LINEAR, 0); -		ib->ptr[ib->length_dw++] = bytes; -		ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ -		ib->ptr[ib->length_dw++] = lower_32_bits(src); -		ib->ptr[ib->length_dw++] = upper_32_bits(src); -		ib->ptr[ib->length_dw++] = lower_32_bits(pe); -		ib->ptr[ib->length_dw++] = upper_32_bits(pe); - -		pe += bytes; -		src += bytes; -		count -= bytes / 8; -	} +	ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, +		SDMA_WRITE_SUB_OPCODE_LINEAR, 0); +	ib->ptr[ib->length_dw++] = bytes; +	ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ +	ib->ptr[ib->length_dw++] = lower_32_bits(src); +	ib->ptr[ib->length_dw++] = upper_32_bits(src); +	ib->ptr[ib->length_dw++] = lower_32_bits(pe); +	ib->ptr[ib->length_dw++] = upper_32_bits(pe);  }  /** @@ -720,39 +712,27 @@ static void cik_sdma_vm_copy_pte(struct amdgpu_ib *ib,   *   * @ib: indirect buffer to fill with commands   * @pe: addr of the page entry - * @addr: dst addr to write into pe + * @value: dst addr to write into pe   * @count: number of page entries to update   * @incr: increase next addr by incr bytes - * @flags: access flags   *   * Update PTEs by writing them manually using sDMA (CIK).   */ -static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib, -				  const dma_addr_t *pages_addr, uint64_t pe, -				  uint64_t addr, unsigned count, -				  uint32_t incr, uint32_t flags) +static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib, uint64_t pe, +				  uint64_t value, unsigned count, +				  uint32_t incr)  { -	uint64_t value; -	unsigned ndw; +	unsigned ndw = count * 2; -	while (count) { -		ndw = count * 2; -		if (ndw > 0xFFFFE) -			ndw = 0xFFFFE; - -		/* for non-physically contiguous pages (system) */ -		ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, -			SDMA_WRITE_SUB_OPCODE_LINEAR, 0); -		ib->ptr[ib->length_dw++] = pe; -		ib->ptr[ib->length_dw++] = upper_32_bits(pe); -		ib->ptr[ib->length_dw++] = ndw; -		for (; ndw > 0; ndw -= 2, --count, pe += 8) { -			value = amdgpu_vm_map_gart(pages_addr, addr); -			addr += incr; -			value |= flags; -			ib->ptr[ib->length_dw++] = value; -			ib->ptr[ib->length_dw++] = upper_32_bits(value); -		} +	ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, +		SDMA_WRITE_SUB_OPCODE_LINEAR, 0); +	ib->ptr[ib->length_dw++] = lower_32_bits(pe); +	ib->ptr[ib->length_dw++] = upper_32_bits(pe); +	ib->ptr[ib->length_dw++] = ndw; +	for (; ndw > 0; ndw -= 2) { +		ib->ptr[ib->length_dw++] = lower_32_bits(value); +		ib->ptr[ib->length_dw++] = upper_32_bits(value); +		value += incr;  	}  } @@ -768,40 +748,21 @@ static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib,   *   * Update the page tables using sDMA (CIK).   */ -static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, -				    uint64_t pe, +static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,  				    uint64_t addr, unsigned count,  				    uint32_t incr, uint32_t flags)  { -	uint64_t value; -	unsigned ndw; - -	while (count) { -		ndw = count; -		if (ndw > 0x7FFFF) -			ndw = 0x7FFFF; - -		if (flags & AMDGPU_PTE_VALID) -			value = addr; -		else -			value = 0; - -		/* for physically contiguous pages (vram) */ -		ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0); -		ib->ptr[ib->length_dw++] = pe; /* dst addr */ -		ib->ptr[ib->length_dw++] = upper_32_bits(pe); -		ib->ptr[ib->length_dw++] = flags; /* mask */ -		ib->ptr[ib->length_dw++] = 0; -		ib->ptr[ib->length_dw++] = value; /* value */ -		ib->ptr[ib->length_dw++] = upper_32_bits(value); -		ib->ptr[ib->length_dw++] = incr; /* increment size */ -		ib->ptr[ib->length_dw++] = 0; -		ib->ptr[ib->length_dw++] = ndw; /* number of entries */ - -		pe += ndw * 8; -		addr += ndw * incr; -		count -= ndw; -	} +	/* for physically contiguous pages (vram) */ +	ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0); +	ib->ptr[ib->length_dw++] = lower_32_bits(pe); /* dst addr */ +	ib->ptr[ib->length_dw++] = upper_32_bits(pe); +	ib->ptr[ib->length_dw++] = flags; /* mask */ +	ib->ptr[ib->length_dw++] = 0; +	ib->ptr[ib->length_dw++] = lower_32_bits(addr); /* value */ +	ib->ptr[ib->length_dw++] = upper_32_bits(addr); +	ib->ptr[ib->length_dw++] = incr; /* increment size */ +	ib->ptr[ib->length_dw++] = 0; +	ib->ptr[ib->length_dw++] = count; /* number of entries */  }  /** @@ -982,11 +943,10 @@ static int cik_sdma_sw_init(void *handle)  		ring->ring_obj = NULL;  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, -				     SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf,  				     &adev->sdma.trap_irq,  				     (i == 0) ? -				     AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1, -				     AMDGPU_RING_TYPE_SDMA); +				     AMDGPU_SDMA_IRQ_TRAP0 : +				     AMDGPU_SDMA_IRQ_TRAP1);  		if (r)  			return r;  	} @@ -1230,7 +1190,7 @@ static int cik_sdma_set_powergating_state(void *handle,  	return 0;  } -const struct amd_ip_funcs cik_sdma_ip_funcs = { +static const struct amd_ip_funcs cik_sdma_ip_funcs = {  	.name = "cik_sdma",  	.early_init = cik_sdma_early_init,  	.late_init = NULL, @@ -1248,10 +1208,19 @@ const struct amd_ip_funcs cik_sdma_ip_funcs = {  };  static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = { +	.type = AMDGPU_RING_TYPE_SDMA, +	.align_mask = 0xf, +	.nop = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0),  	.get_rptr = cik_sdma_ring_get_rptr,  	.get_wptr = cik_sdma_ring_get_wptr,  	.set_wptr = cik_sdma_ring_set_wptr, -	.parse_cs = NULL, +	.emit_frame_size = +		6 + /* cik_sdma_ring_emit_hdp_flush */ +		3 + /* cik_sdma_ring_emit_hdp_invalidate */ +		6 + /* cik_sdma_ring_emit_pipeline_sync */ +		12 + /* cik_sdma_ring_emit_vm_flush */ +		9 + 9 + 9, /* cik_sdma_ring_emit_fence x3 for user fence, vm fence */ +	.emit_ib_size = 7 + 4, /* cik_sdma_ring_emit_ib */  	.emit_ib = cik_sdma_ring_emit_ib,  	.emit_fence = cik_sdma_ring_emit_fence,  	.emit_pipeline_sync = cik_sdma_ring_emit_pipeline_sync, @@ -1373,3 +1342,12 @@ static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev)  		adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances;  	}  } + +const struct amdgpu_ip_block_version cik_sdma_ip_block = +{ +	.type = AMD_IP_BLOCK_TYPE_SDMA, +	.major = 2, +	.minor = 0, +	.rev = 0, +	.funcs = &cik_sdma_ip_funcs, +};  | 
