diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 66 | 
1 files changed, 26 insertions, 40 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index b918c8886b75..45795191de1f 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -198,7 +198,7 @@ static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring)  static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)  { -	struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); +	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);  	int i;  	for (i = 0; i < count; i++) @@ -218,9 +218,11 @@ static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)   * Schedule an IB in the DMA ring (CIK).   */  static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring, +				  struct amdgpu_job *job,  				  struct amdgpu_ib *ib, -				  unsigned vmid, bool ctx_switch) +				  bool ctx_switch)  { +	unsigned vmid = AMDGPU_JOB_GET_VMID(job);  	u32 extra_bits = vmid & 0xf;  	/* IB packet must end on a 8 DW boundary */ @@ -316,8 +318,8 @@ static void cik_sdma_gfx_stop(struct amdgpu_device *adev)  		WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], 0);  	} -	sdma0->ready = false; -	sdma1->ready = false; +	sdma0->sched.ready = false; +	sdma1->sched.ready = false;  }  /** @@ -494,18 +496,16 @@ static int cik_sdma_gfx_resume(struct amdgpu_device *adev)  		/* enable DMA IBs */  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); -		ring->ready = true; +		ring->sched.ready = true;  	}  	cik_sdma_enable(adev, true);  	for (i = 0; i < adev->sdma.num_instances; i++) {  		ring = &adev->sdma.instance[i].ring; -		r = amdgpu_ring_test_ring(ring); -		if (r) { -			ring->ready = false; +		r = amdgpu_ring_test_helper(ring); +		if (r)  			return r; -		}  		if (adev->mman.buffer_funcs_ring == ring)  			amdgpu_ttm_set_buffer_funcs_status(adev, true); @@ -618,21 +618,17 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)  	u64 gpu_addr;  	r = amdgpu_device_wb_get(adev, &index); -	if (r) { -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r); +	if (r)  		return r; -	}  	gpu_addr = adev->wb.gpu_addr + (index * 4);  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	r = amdgpu_ring_alloc(ring, 5); -	if (r) { -		DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); -		amdgpu_device_wb_free(adev, index); -		return r; -	} +	if (r) +		goto error_free_wb; +  	amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));  	amdgpu_ring_write(ring, lower_32_bits(gpu_addr));  	amdgpu_ring_write(ring, upper_32_bits(gpu_addr)); @@ -647,15 +643,11 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)  		DRM_UDELAY(1);  	} -	if (i < adev->usec_timeout) { -		DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); -	} else { -		DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n", -			  ring->idx, tmp); -		r = -EINVAL; -	} -	amdgpu_device_wb_free(adev, index); +	if (i >= adev->usec_timeout) +		r = -ETIMEDOUT; +error_free_wb: +	amdgpu_device_wb_free(adev, index);  	return r;  } @@ -678,20 +670,16 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	long r;  	r = amdgpu_device_wb_get(adev, &index); -	if (r) { -		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r); +	if (r)  		return r; -	}  	gpu_addr = adev->wb.gpu_addr + (index * 4);  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib));  	r = amdgpu_ib_get(adev, NULL, 256, &ib); -	if (r) { -		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r); +	if (r)  		goto err0; -	}  	ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE,  				SDMA_WRITE_SUB_OPCODE_LINEAR, 0); @@ -706,21 +694,16 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	r = dma_fence_wait_timeout(f, false, timeout);  	if (r == 0) { -		DRM_ERROR("amdgpu: IB test timed out\n");  		r = -ETIMEDOUT;  		goto err1;  	} 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_DEBUG("ib test on ring %d succeeded\n", ring->idx); +	if (tmp == 0xDEADBEEF)  		r = 0; -	} else { -		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); +	else  		r = -EINVAL; -	}  err1:  	amdgpu_ib_free(adev, &ib, NULL); @@ -822,7 +805,7 @@ static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,   */  static void cik_sdma_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)  { -	struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); +	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);  	u32 pad_count;  	int i; @@ -1214,8 +1197,11 @@ static int cik_sdma_process_illegal_inst_irq(struct amdgpu_device *adev,  					     struct amdgpu_irq_src *source,  					     struct amdgpu_iv_entry *entry)  { +	u8 instance_id; +  	DRM_ERROR("Illegal instruction in SDMA command stream\n"); -	schedule_work(&adev->reset_work); +	instance_id = (entry->ring_id & 0x3) >> 0; +	drm_sched_fault(&adev->sdma.instance[instance_id].ring.sched);  	return 0;  } | 
