diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 33 | 
1 files changed, 32 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 7f2c314581d4..d7e39827f22a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -322,14 +322,45 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)  {  	unsigned i;  	int r, ret = 0; +	long tmo_gfx, tmo_mm; + +	tmo_mm = tmo_gfx = AMDGPU_IB_TEST_TIMEOUT; +	if (amdgpu_sriov_vf(adev)) { +		/* for MM engines in hypervisor side they are not scheduled together +		 * with CP and SDMA engines, so even in exclusive mode MM engine could +		 * still running on other VF thus the IB TEST TIMEOUT for MM engines +		 * under SR-IOV should be set to a long time. 8 sec should be enough +		 * for the MM comes back to this VF. +		 */ +		tmo_mm = 8 * AMDGPU_IB_TEST_TIMEOUT; +	} + +	if (amdgpu_sriov_runtime(adev)) { +		/* for CP & SDMA engines since they are scheduled together so +		 * need to make the timeout width enough to cover the time +		 * cost waiting for it coming back under RUNTIME only +		*/ +		tmo_gfx = 8 * AMDGPU_IB_TEST_TIMEOUT; +	}  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {  		struct amdgpu_ring *ring = adev->rings[i]; +		long tmo;  		if (!ring || !ring->ready)  			continue; -		r = amdgpu_ring_test_ib(ring, AMDGPU_IB_TEST_TIMEOUT); +		/* MM engine need more time */ +		if (ring->funcs->type == AMDGPU_RING_TYPE_UVD || +			ring->funcs->type == AMDGPU_RING_TYPE_VCE || +			ring->funcs->type == AMDGPU_RING_TYPE_UVD_ENC || +			ring->funcs->type == AMDGPU_RING_TYPE_VCN_DEC || +			ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) +			tmo = tmo_mm; +		else +			tmo = tmo_gfx; + +		r = amdgpu_ring_test_ib(ring, tmo);  		if (r) {  			ring->ready = false; | 
