diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 50 | 
1 files changed, 32 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c index 6f81ed4fb0d9..b07c000fc8ba 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c @@ -118,6 +118,10 @@ int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring)  	unsigned i;  	int r; +	/* JPEG in SRIOV does not support direct register read/write */ +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	WREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch, 0xCAFEDEAD);  	r = amdgpu_ring_alloc(ring, 3);  	if (r) @@ -202,17 +206,18 @@ int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	} else {  		r = 0;  	} +	if (!amdgpu_sriov_vf(adev)) { +		for (i = 0; i < adev->usec_timeout; i++) { +			tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch); +			if (tmp == 0xDEADBEEF) +				break; +			udelay(1); +		} -	for (i = 0; i < adev->usec_timeout; i++) { -		tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch); -		if (tmp == 0xDEADBEEF) -			break; -		udelay(1); +		if (i >= adev->usec_timeout) +			r = -ETIMEDOUT;  	} -	if (i >= adev->usec_timeout) -		r = -ETIMEDOUT; -  	dma_fence_put(fence);  error:  	return r; @@ -236,19 +241,28 @@ int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,  	return 0;  } -void jpeg_set_ras_funcs(struct amdgpu_device *adev) +int amdgpu_jpeg_ras_sw_init(struct amdgpu_device *adev)  { +	int err; +	struct amdgpu_jpeg_ras *ras; +  	if (!adev->jpeg.ras) -		return; +		return 0; -	amdgpu_ras_register_ras_block(adev, &adev->jpeg.ras->ras_block); +	ras = adev->jpeg.ras; +	err = amdgpu_ras_register_ras_block(adev, &ras->ras_block); +	if (err) { +		dev_err(adev->dev, "Failed to register jpeg ras block!\n"); +		return err; +	} + +	strcpy(ras->ras_block.ras_comm.name, "jpeg"); +	ras->ras_block.ras_comm.block = AMDGPU_RAS_BLOCK__JPEG; +	ras->ras_block.ras_comm.type = AMDGPU_RAS_ERROR__POISON; +	adev->jpeg.ras_if = &ras->ras_block.ras_comm; -	strcpy(adev->jpeg.ras->ras_block.ras_comm.name, "jpeg"); -	adev->jpeg.ras->ras_block.ras_comm.block = AMDGPU_RAS_BLOCK__JPEG; -	adev->jpeg.ras->ras_block.ras_comm.type = AMDGPU_RAS_ERROR__POISON; -	adev->jpeg.ras_if = &adev->jpeg.ras->ras_block.ras_comm; +	if (!ras->ras_block.ras_late_init) +		ras->ras_block.ras_late_init = amdgpu_ras_block_late_init; -	/* If don't define special ras_late_init function, use default ras_late_init */ -	if (!adev->jpeg.ras->ras_block.ras_late_init) -		adev->jpeg.ras->ras_block.ras_late_init = amdgpu_ras_block_late_init; +	return 0;  }  | 
