Commit 3d8b2727 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Jacek Lawrynowicz

accel/ivpu: Disable buttress on device removal

Use pci_set_power_state() to disable buttress when device is removed.
This is workaround of hardware bug that hangs the system.

Additionally not disabling buttress prevents CPU enter deeper Pkg-C
states when the driver is unloaded or fail to probe.

Fixes: 35b13763 ("accel/ivpu: Introduce a new DRM driver for Intel VPU")
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-6-stanislaw.gruszka@linux.intel.com
parent a8fed6d1
...@@ -569,6 +569,8 @@ static int ivpu_dev_init(struct ivpu_device *vdev) ...@@ -569,6 +569,8 @@ static int ivpu_dev_init(struct ivpu_device *vdev)
ivpu_mmu_global_context_fini(vdev); ivpu_mmu_global_context_fini(vdev);
err_power_down: err_power_down:
ivpu_hw_power_down(vdev); ivpu_hw_power_down(vdev);
if (IVPU_WA(d3hot_after_power_off))
pci_set_power_state(to_pci_dev(vdev->drm.dev), PCI_D3hot);
err_xa_destroy: err_xa_destroy:
xa_destroy(&vdev->submitted_jobs_xa); xa_destroy(&vdev->submitted_jobs_xa);
xa_destroy(&vdev->context_xa); xa_destroy(&vdev->context_xa);
...@@ -579,6 +581,8 @@ static void ivpu_dev_fini(struct ivpu_device *vdev) ...@@ -579,6 +581,8 @@ static void ivpu_dev_fini(struct ivpu_device *vdev)
{ {
ivpu_pm_disable(vdev); ivpu_pm_disable(vdev);
ivpu_shutdown(vdev); ivpu_shutdown(vdev);
if (IVPU_WA(d3hot_after_power_off))
pci_set_power_state(to_pci_dev(vdev->drm.dev), PCI_D3hot);
ivpu_job_done_thread_fini(vdev); ivpu_job_done_thread_fini(vdev);
ivpu_pm_cancel_recovery(vdev); ivpu_pm_cancel_recovery(vdev);
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
struct ivpu_wa_table { struct ivpu_wa_table {
bool punit_disabled; bool punit_disabled;
bool clear_runtime_mem; bool clear_runtime_mem;
bool d3hot_after_power_off;
}; };
struct ivpu_hw_info; struct ivpu_hw_info;
......
...@@ -101,6 +101,7 @@ static void ivpu_hw_wa_init(struct ivpu_device *vdev) ...@@ -101,6 +101,7 @@ static void ivpu_hw_wa_init(struct ivpu_device *vdev)
{ {
vdev->wa.punit_disabled = ivpu_is_fpga(vdev); vdev->wa.punit_disabled = ivpu_is_fpga(vdev);
vdev->wa.clear_runtime_mem = false; vdev->wa.clear_runtime_mem = false;
vdev->wa.d3hot_after_power_off = true;
} }
static void ivpu_hw_timeouts_init(struct ivpu_device *vdev) static void ivpu_hw_timeouts_init(struct ivpu_device *vdev)
......
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