diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 152 | 
1 files changed, 63 insertions, 89 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index a64715d90503..fbe74a33899c 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c @@ -190,12 +190,8 @@ out:   */  static uint32_t sdma_v2_4_ring_get_rptr(struct amdgpu_ring *ring)  { -	u32 rptr; -  	/* XXX check if swapping is necessary on BE */ -	rptr = ring->adev->wb.wb[ring->rptr_offs] >> 2; - -	return rptr; +	return ring->adev->wb.wb[ring->rptr_offs] >> 2;  }  /** @@ -236,10 +232,10 @@ static void sdma_v2_4_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_PKT_NOP_HEADER_COUNT(count - 1));  		else -			amdgpu_ring_write(ring, ring->nop); +			amdgpu_ring_write(ring, ring->funcs->nop);  }  /** @@ -672,7 +668,7 @@ static int sdma_v2_4_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; @@ -709,7 +705,7 @@ static int sdma_v2_4_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; @@ -729,7 +725,7 @@ static int sdma_v2_4_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; @@ -749,24 +745,16 @@ static void sdma_v2_4_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; - -		ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | -			SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); -		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); +	unsigned bytes = count * 8; -		pe += bytes; -		src += bytes; -		count -= bytes / 8; -	} +	ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | +		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); +	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);  }  /** @@ -774,39 +762,27 @@ static void sdma_v2_4_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 sdma_v2_4_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 sdma_v2_4_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_PKT_HEADER_OP(SDMA_OP_WRITE) | -			SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); -		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_PKT_HEADER_OP(SDMA_OP_WRITE) | +		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR); +	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) { +		ib->ptr[ib->length_dw++] = lower_32_bits(value); +		ib->ptr[ib->length_dw++] = upper_32_bits(value); +		value += incr;  	}  } @@ -822,40 +798,21 @@ static void sdma_v2_4_vm_write_pte(struct amdgpu_ib *ib,   *   * Update the page tables using sDMA (CIK).   */ -static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib, -				     uint64_t pe, +static void sdma_v2_4_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_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE); -		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_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE); +	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 */  }  /** @@ -992,11 +949,10 @@ static int sdma_v2_4_sw_init(void *handle)  		ring->use_doorbell = false;  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, -				     SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 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;  	} @@ -1231,7 +1187,7 @@ static int sdma_v2_4_set_powergating_state(void *handle,  	return 0;  } -const struct amd_ip_funcs sdma_v2_4_ip_funcs = { +static const struct amd_ip_funcs sdma_v2_4_ip_funcs = {  	.name = "sdma_v2_4",  	.early_init = sdma_v2_4_early_init,  	.late_init = NULL, @@ -1249,10 +1205,19 @@ const struct amd_ip_funcs sdma_v2_4_ip_funcs = {  };  static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = { +	.type = AMDGPU_RING_TYPE_SDMA, +	.align_mask = 0xf, +	.nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP),  	.get_rptr = sdma_v2_4_ring_get_rptr,  	.get_wptr = sdma_v2_4_ring_get_wptr,  	.set_wptr = sdma_v2_4_ring_set_wptr, -	.parse_cs = NULL, +	.emit_frame_size = +		6 + /* sdma_v2_4_ring_emit_hdp_flush */ +		3 + /* sdma_v2_4_ring_emit_hdp_invalidate */ +		6 + /* sdma_v2_4_ring_emit_pipeline_sync */ +		12 + /* sdma_v2_4_ring_emit_vm_flush */ +		10 + 10 + 10, /* sdma_v2_4_ring_emit_fence x3 for user fence, vm fence */ +	.emit_ib_size = 7 + 6, /* sdma_v2_4_ring_emit_ib */  	.emit_ib = sdma_v2_4_ring_emit_ib,  	.emit_fence = sdma_v2_4_ring_emit_fence,  	.emit_pipeline_sync = sdma_v2_4_ring_emit_pipeline_sync, @@ -1375,3 +1340,12 @@ static void sdma_v2_4_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 sdma_v2_4_ip_block = +{ +	.type = AMD_IP_BLOCK_TYPE_SDMA, +	.major = 2, +	.minor = 4, +	.rev = 0, +	.funcs = &sdma_v2_4_ip_funcs, +};  | 
