Commit 480da262 authored by Monk Liu's avatar Monk Liu Committed by Alex Deucher

drm/amdgpu:use work instead of delay-work

no need to use a delay work since we don't know how
much time hypervisor takes on FLR, so just polling
and waiting in a work.
Signed-off-by: default avatarMonk Liu <Monk.Liu@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarXiangliang Yu <Xiangliang.Yu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4a370955
...@@ -50,7 +50,7 @@ struct amdgpu_virt { ...@@ -50,7 +50,7 @@ struct amdgpu_virt {
struct mutex lock_reset; struct mutex lock_reset;
struct amdgpu_irq_src ack_irq; struct amdgpu_irq_src ack_irq;
struct amdgpu_irq_src rcv_irq; struct amdgpu_irq_src rcv_irq;
struct delayed_work flr_work; struct work_struct flr_work;
const struct amdgpu_virt_ops *ops; const struct amdgpu_virt_ops *ops;
}; };
......
...@@ -501,17 +501,19 @@ static int xgpu_vi_set_mailbox_ack_irq(struct amdgpu_device *adev, ...@@ -501,17 +501,19 @@ static int xgpu_vi_set_mailbox_ack_irq(struct amdgpu_device *adev,
static void xgpu_vi_mailbox_flr_work(struct work_struct *work) static void xgpu_vi_mailbox_flr_work(struct work_struct *work)
{ {
struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, flr_work);
struct amdgpu_virt, flr_work.work); struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt);
struct amdgpu_device *adev = container_of(virt,
struct amdgpu_device, virt); /* wait until RCV_MSG become 3 */
int r = 0; if (!xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL))
adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;
r = xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL); else {
if (r) pr_err("failed to recieve FLR_CMPL\n");
DRM_ERROR("failed to get flr cmpl msg from hypervior.\n"); return;
}
/* TODO: need to restore gfx states */ /* Trigger recovery due to world switch failure */
amdgpu_sriov_gpu_reset(adev, false);
} }
static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev, static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev,
...@@ -534,15 +536,12 @@ static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device *adev, ...@@ -534,15 +536,12 @@ static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device *adev,
{ {
int r; int r;
adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; /* see what event we get */
r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION); r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION);
/* do nothing for other msg */
if (r)
return 0;
/* TODO: need to save gfx states */ /* only handle FLR_NOTIFY now */
schedule_delayed_work(&adev->virt.flr_work, if (!r)
msecs_to_jiffies(VI_MAILBOX_RESET_TIME)); schedule_work(&adev->virt.flr_work);
return 0; return 0;
} }
...@@ -595,14 +594,13 @@ int xgpu_vi_mailbox_get_irq(struct amdgpu_device *adev) ...@@ -595,14 +594,13 @@ int xgpu_vi_mailbox_get_irq(struct amdgpu_device *adev)
return r; return r;
} }
INIT_DELAYED_WORK(&adev->virt.flr_work, xgpu_vi_mailbox_flr_work); INIT_WORK(&adev->virt.flr_work, xgpu_vi_mailbox_flr_work);
return 0; return 0;
} }
void xgpu_vi_mailbox_put_irq(struct amdgpu_device *adev) void xgpu_vi_mailbox_put_irq(struct amdgpu_device *adev)
{ {
cancel_delayed_work_sync(&adev->virt.flr_work);
amdgpu_irq_put(adev, &adev->virt.ack_irq, 0); amdgpu_irq_put(adev, &adev->virt.ack_irq, 0);
amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment