static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev, struct amdgpu_irq_src *source, struct amdgpu_iv_entry *entry) { int r; /* trigger gpu-reset by hypervisor only if TDR disbaled */ if (!amdgpu_gpu_recovery) { /* see what event we get */ r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); /* sometimes the interrupt is delayed to inject to VM, so under such case * the IDH_FLR_NOTIFICATION is overwritten by VF FLR from GIM side, thus * above recieve message could be failed, we should schedule the flr_work * anyway */ if (r) { DRM_ERROR("FLR_NOTIFICATION is missed\n"); xgpu_ai_mailbox_send_ack(adev); } schedule_work(&adev->virt.flr_work); } return 0; }
static int xgpu_ai_poll_msg(struct amdgpu_device *adev, enum idh_event event) { int r = 0, timeout = AI_MAILBOX_TIMEDOUT; r = xgpu_ai_mailbox_rcv_msg(adev, event); while (r) { if (timeout <= 0) { pr_err("Doesn't get msg:%d from pf.\n", event); r = -ETIME; break; } mdelay(5); timeout -= 5; r = xgpu_ai_mailbox_rcv_msg(adev, event); } return r; }
static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev, struct amdgpu_irq_src *source, struct amdgpu_iv_entry *entry) { int r; /* 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); return 0; }
static int xgpu_ai_poll_msg(struct amdgpu_device *adev, enum idh_event event) { int r, timeout = AI_MAILBOX_POLL_MSG_TIMEDOUT; do { r = xgpu_ai_mailbox_rcv_msg(adev, event); if (!r) return 0; msleep(10); timeout -= 10; } while (timeout > 1); pr_err("Doesn't get msg:%d from pf, error=%d\n", event, r); return -ETIME; }