Commit 6013aa84 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Jacek Lawrynowicz

accel/ivpu: Cancel recovery work

Prevent running recovery_work after device is removed.

Fixes: 852be13f ("accel/ivpu: Add PM support")
Signed-off-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
Signed-off-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230323125504.2586442-3-stanislaw.gruszka@linux.intel.com
parent 4522ad76
...@@ -580,6 +580,8 @@ static void ivpu_dev_fini(struct ivpu_device *vdev) ...@@ -580,6 +580,8 @@ static void ivpu_dev_fini(struct ivpu_device *vdev)
ivpu_pm_disable(vdev); ivpu_pm_disable(vdev);
ivpu_shutdown(vdev); ivpu_shutdown(vdev);
ivpu_job_done_thread_fini(vdev); ivpu_job_done_thread_fini(vdev);
ivpu_pm_cancel_recovery(vdev);
ivpu_ipc_fini(vdev); ivpu_ipc_fini(vdev);
ivpu_fw_fini(vdev); ivpu_fw_fini(vdev);
ivpu_mmu_global_context_fini(vdev); ivpu_mmu_global_context_fini(vdev);
......
...@@ -98,12 +98,18 @@ static int ivpu_resume(struct ivpu_device *vdev) ...@@ -98,12 +98,18 @@ static int ivpu_resume(struct ivpu_device *vdev)
static void ivpu_pm_recovery_work(struct work_struct *work) static void ivpu_pm_recovery_work(struct work_struct *work)
{ {
struct ivpu_pm_info *pm = container_of(work, struct ivpu_pm_info, recovery_work); struct ivpu_pm_info *pm = container_of(work, struct ivpu_pm_info, recovery_work);
struct ivpu_device *vdev = pm->vdev; struct ivpu_device *vdev = pm->vdev;
char *evt[2] = {"IVPU_PM_EVENT=IVPU_RECOVER", NULL}; char *evt[2] = {"IVPU_PM_EVENT=IVPU_RECOVER", NULL};
int ret; int ret;
ret = pci_reset_function(to_pci_dev(vdev->drm.dev)); retry:
if (ret) ret = pci_try_reset_function(to_pci_dev(vdev->drm.dev));
if (ret == -EAGAIN && !drm_dev_is_unplugged(&vdev->drm)) {
cond_resched();
goto retry;
}
if (ret && ret != -EAGAIN)
ivpu_err(vdev, "Failed to reset VPU: %d\n", ret); ivpu_err(vdev, "Failed to reset VPU: %d\n", ret);
kobject_uevent_env(&vdev->drm.dev->kobj, KOBJ_CHANGE, evt); kobject_uevent_env(&vdev->drm.dev->kobj, KOBJ_CHANGE, evt);
...@@ -306,6 +312,11 @@ int ivpu_pm_init(struct ivpu_device *vdev) ...@@ -306,6 +312,11 @@ int ivpu_pm_init(struct ivpu_device *vdev)
return 0; return 0;
} }
void ivpu_pm_cancel_recovery(struct ivpu_device *vdev)
{
cancel_work_sync(&vdev->pm->recovery_work);
}
void ivpu_pm_enable(struct ivpu_device *vdev) void ivpu_pm_enable(struct ivpu_device *vdev)
{ {
struct device *dev = vdev->drm.dev; struct device *dev = vdev->drm.dev;
......
...@@ -21,6 +21,7 @@ struct ivpu_pm_info { ...@@ -21,6 +21,7 @@ struct ivpu_pm_info {
int ivpu_pm_init(struct ivpu_device *vdev); int ivpu_pm_init(struct ivpu_device *vdev);
void ivpu_pm_enable(struct ivpu_device *vdev); void ivpu_pm_enable(struct ivpu_device *vdev);
void ivpu_pm_disable(struct ivpu_device *vdev); void ivpu_pm_disable(struct ivpu_device *vdev);
void ivpu_pm_cancel_recovery(struct ivpu_device *vdev);
int ivpu_pm_suspend_cb(struct device *dev); int ivpu_pm_suspend_cb(struct device *dev);
int ivpu_pm_resume_cb(struct device *dev); int ivpu_pm_resume_cb(struct device *dev);
......
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