diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 35 | 
1 files changed, 20 insertions, 15 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c index 1493301b6a94..bde3ca3c21c1 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c @@ -124,8 +124,8 @@ static int xgpu_ai_poll_ack(struct amdgpu_device *adev)  			r = -ETIME;  			break;  		} -		msleep(1); -		timeout -= 1; +		mdelay(5); +		timeout -= 5;  		reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0,  						     mmBIF_BX_PF0_MAILBOX_CONTROL)); @@ -141,12 +141,12 @@ static int xgpu_ai_poll_msg(struct amdgpu_device *adev, enum idh_event event)  	r = xgpu_ai_mailbox_rcv_msg(adev, event);  	while (r) {  		if (timeout <= 0) { -			pr_err("Doesn't get ack from pf.\n"); +			pr_err("Doesn't get msg:%d from pf.\n", event);  			r = -ETIME;  			break;  		} -		msleep(1); -		timeout -= 1; +		mdelay(5); +		timeout -= 5;  		r = xgpu_ai_mailbox_rcv_msg(adev, event);  	} @@ -165,7 +165,7 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,  	/* start to poll ack */  	r = xgpu_ai_poll_ack(adev);  	if (r) -		return r; +		pr_err("Doesn't get ack from pf, continue\n");  	xgpu_ai_mailbox_set_valid(adev, false); @@ -174,8 +174,10 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,  		req == IDH_REQ_GPU_FINI_ACCESS ||  		req == IDH_REQ_GPU_RESET_ACCESS) {  		r = xgpu_ai_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); -		if (r) +		if (r) { +			pr_err("Doesn't get READY_TO_ACCESS_GPU from pf, give up\n");  			return r; +		}  	}  	return 0; @@ -241,7 +243,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)  	}  	/* Trigger recovery due to world switch failure */ -	amdgpu_sriov_gpu_reset(adev, false); +	amdgpu_sriov_gpu_reset(adev, NULL);  }  static int xgpu_ai_set_mailbox_rcv_irq(struct amdgpu_device *adev, @@ -264,12 +266,15 @@ static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev,  {  	int r; -	/* see what event we get */ -	r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); +	/* trigger gpu-reset by hypervisor only if TDR disbaled */ +	if (amdgpu_lockup_timeout == 0) { +		/* see what event we get */ +		r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); -	/* only handle FLR_NOTIFY now */ -	if (!r) -		schedule_work(&adev->virt.flr_work); +		/* only handle FLR_NOTIFY now */ +		if (!r) +			schedule_work(&adev->virt.flr_work); +	}  	return 0;  } @@ -296,11 +301,11 @@ int xgpu_ai_mailbox_add_irq_id(struct amdgpu_device *adev)  {  	int r; -	r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 135, &adev->virt.rcv_irq); +	r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_BIF, 135, &adev->virt.rcv_irq);  	if (r)  		return r; -	r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 138, &adev->virt.ack_irq); +	r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_BIF, 138, &adev->virt.ack_irq);  	if (r) {  		amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);  		return r; |