Commit 25dc89d5 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gt: Scrub HW state on remove

Currently we do a final scrub of the HW state upon release. However,
when rebinding the device, this is too late as the device may either
have been partially rebound or the device is no longer accessible. If
the device has been removed before release, the reset goes astray
leaving the device in an inconsistent state, unlikely to work without a
full PCI reset. Furthermore, if the device is partially rebound before
the HW scrubbing, there may be leftover HW state that should have been
scrubbed. Either way, we need to push the scrubbing earlier before the
removal, so into unregister. The danger is that on older machines,
resetting the GPU also impact the display engine and so the reset should
be after modesetting is disabled (and before reuse we need to recover
modesetting).

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2508
Testcase: igt/core_hotunplug
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200929112639.24223-1-chris@chris-wilson.co.uk
parent a6c5e2ae
...@@ -614,6 +614,8 @@ void intel_gt_driver_remove(struct intel_gt *gt) ...@@ -614,6 +614,8 @@ void intel_gt_driver_remove(struct intel_gt *gt)
void intel_gt_driver_unregister(struct intel_gt *gt) void intel_gt_driver_unregister(struct intel_gt *gt)
{ {
intel_wakeref_t wakeref;
intel_rps_driver_unregister(&gt->rps); intel_rps_driver_unregister(&gt->rps);
/* /*
...@@ -622,16 +624,15 @@ void intel_gt_driver_unregister(struct intel_gt *gt) ...@@ -622,16 +624,15 @@ void intel_gt_driver_unregister(struct intel_gt *gt)
* resources. * resources.
*/ */
intel_gt_set_wedged(gt); intel_gt_set_wedged(gt);
/* Scrub all HW state upon release */
with_intel_runtime_pm(gt->uncore->rpm, wakeref)
__intel_gt_reset(gt, ALL_ENGINES);
} }
void intel_gt_driver_release(struct intel_gt *gt) void intel_gt_driver_release(struct intel_gt *gt)
{ {
struct i915_address_space *vm; struct i915_address_space *vm;
intel_wakeref_t wakeref;
/* Scrub all HW state upon release */
with_intel_runtime_pm(gt->uncore->rpm, wakeref)
__intel_gt_reset(gt, ALL_ENGINES);
vm = fetch_and_zero(&gt->vm); vm = fetch_and_zero(&gt->vm);
if (vm) /* FIXME being called twice on error paths :( */ if (vm) /* FIXME being called twice on error paths :( */
......
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