diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 50 | 
1 files changed, 18 insertions, 32 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 9dc4e24e31e7..ee6466912497 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -224,17 +224,6 @@ static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,  				  unsigned vm_id, bool ctx_switch)  {  	u32 extra_bits = vm_id & 0xf; -	u32 next_rptr = ring->wptr + 5; - -	while ((next_rptr & 7) != 4) -		next_rptr++; - -	next_rptr += 4; -	amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0)); -	amdgpu_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); -	amdgpu_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff); -	amdgpu_ring_write(ring, 1); /* number of DWs to follow */ -	amdgpu_ring_write(ring, next_rptr);  	/* IB packet must end on a 8 DW boundary */  	cik_sdma_ring_insert_nop(ring, (12 - (ring->wptr & 7)) % 8); @@ -365,7 +354,7 @@ static void cik_sdma_enable(struct amdgpu_device *adev, bool enable)  	u32 me_cntl;  	int i; -	if (enable == false) { +	if (!enable) {  		cik_sdma_gfx_stop(adev);  		cik_sdma_rlc_stop(adev);  	} @@ -628,20 +617,19 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)   * Test a simple IB in the DMA ring (CIK).   * Returns 0 on success, error on failure.   */ -static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring) +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; -	unsigned i;  	unsigned index; -	int r;  	u32 tmp = 0;  	u64 gpu_addr; +	long r;  	r = amdgpu_wb_get(adev, &index);  	if (r) { -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r); +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);  		return r;  	} @@ -651,11 +639,12 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)  	memset(&ib, 0, sizeof(ib));  	r = amdgpu_ib_get(adev, NULL, 256, &ib);  	if (r) { -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);  		goto err0;  	} -	ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); +	ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, +				SDMA_WRITE_SUB_OPCODE_LINEAR, 0);  	ib.ptr[1] = lower_32_bits(gpu_addr);  	ib.ptr[2] = upper_32_bits(gpu_addr);  	ib.ptr[3] = 1; @@ -665,28 +654,25 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)  	if (r)  		goto err1; -	r = fence_wait(f, false); -	if (r) { -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); +	r = fence_wait_timeout(f, false, timeout); +	if (r == 0) { +		DRM_ERROR("amdgpu: IB test timed out\n"); +		r = -ETIMEDOUT;  		goto err1; -	} -	for (i = 0; i < adev->usec_timeout; i++) { -		tmp = le32_to_cpu(adev->wb.wb[index]); -		if (tmp == 0xDEADBEEF) -			break; -		DRM_UDELAY(1); -	} -	if (i < adev->usec_timeout) { -		DRM_INFO("ib test on ring %d succeeded in %u usecs\n", -			 ring->idx, i); +	} else if (r < 0) { +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);  		goto err1; +	} +	tmp = le32_to_cpu(adev->wb.wb[index]); +	if (tmp == 0xDEADBEEF) { +		DRM_INFO("ib test on ring %d succeeded\n", ring->idx); +		r = 0;  	} else {  		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);  		r = -EINVAL;  	}  err1: -	fence_put(f);  	amdgpu_ib_free(adev, &ib, NULL);  	fence_put(f);  err0: | 
