drm/i915: Restore interrupt enabling after a reset
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 18 Feb 2019 15:31:06 +0000 (15:31 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 18 Feb 2019 16:19:35 +0000 (16:19 +0000)
At least on i965g and i965gm, performing a device reset clobbers the IER
resulting in loss of interrupts thereafter. So, run the irq_postinstall
hook to restore them.

v2: Ville pointed out that he already attempted to solve this problem by
reinstalling the interrupts in intel_reset_finish() (part of the display
handling around reset). However, reinstalling the irq clobbers the
i915->irq_mask which we need for handling MI_USER_INTERRUPTS, and does
so too late to handle any interrupts generated from resuming the rings.
The simple solution to both is to pull the interrupt reenabling from
afterwards to around the device reset.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190218153106.16768-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_reset.c
drivers/gpu/drm/i915/intel_display.c

index 1911e00d258100a585eaca20245a0afb6d91fa9d..4df4c674223d52e87808ce7a4ee68a5e04ff8091 100644 (file)
@@ -995,11 +995,17 @@ void i915_reset(struct drm_i915_private *i915,
                goto error;
        }
 
+       if (INTEL_INFO(i915)->gpu_reset_clobbers_display)
+               intel_runtime_pm_disable_interrupts(i915);
+
        if (do_reset(i915, stalled_mask)) {
                dev_err(i915->drm.dev, "Failed to reset chip\n");
                goto taint;
        }
 
+       if (INTEL_INFO(i915)->gpu_reset_clobbers_display)
+               intel_runtime_pm_enable_interrupts(i915);
+
        intel_overlay_reset(i915);
 
        /*
index 4f66f578b857205712649aeb4de66d03e265486d..21b3a6c9582651d91788f7a7732bf1962083bcdb 100644 (file)
@@ -3922,9 +3922,6 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
                 * The display has been reset as well,
                 * so need a full re-initialization.
                 */
-               intel_runtime_pm_disable_interrupts(dev_priv);
-               intel_runtime_pm_enable_interrupts(dev_priv);
-
                intel_pps_unlock_regs_wa(dev_priv);
                intel_modeset_init_hw(dev);
                intel_init_clock_gating(dev_priv);