Skip to content

Commit 320ad34

Browse files
Thomas Zimmermannrodrigovivi
authored andcommitted
drm/i915: Use the correct IRQ during resume
The code in xcs_resume() probably didn't work as intended. It uses struct drm_device.irq, which is allocated to 0, but never initialized by i915 to the device's interrupt number. Change all calls to synchronize_hardirq() to intel_synchronize_irq(), which uses the correct interrupt. _hardirq() functions are not needed in this context. v5: * go back to _hardirq() after PCI probe reported wrong context; add rsp comment v4: * switch everything to intel_synchronize_irq() (Daniel) v3: * also use intel_synchronize_hardirq() at another callsite v2: * wrap irq code in intel_synchronize_hardirq() (Ville) Signed-off-by: Thomas Zimmermann <[email protected]> Fixes: 536f77b ("drm/i915/gt: Call stop_ring() from ring resume, again") Cc: Chris Wilson <[email protected]> Cc: Mika Kuoppala <[email protected]> Cc: Daniel Vetter <[email protected]> Cc: Rodrigo Vivi <[email protected]> Cc: Joonas Lahtinen <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Lucas De Marchi <[email protected]> Signed-off-by: Daniel Vetter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 27e4b46) Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 995e9bc commit 320ad34

File tree

4 files changed

+12
-3
lines changed

4 files changed

+12
-3
lines changed

drivers/gpu/drm/i915/gt/intel_engine_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,7 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
12791279
return true;
12801280

12811281
/* Waiting to drain ELSP? */
1282-
synchronize_hardirq(to_pci_dev(engine->i915->drm.dev)->irq);
1282+
intel_synchronize_hardirq(engine->i915);
12831283
intel_engine_flush_submission(engine);
12841284

12851285
/* ELSP is empty, but there are ready requests? E.g. after reset */

drivers/gpu/drm/i915/gt/intel_ring_submission.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,11 @@ static int xcs_resume(struct intel_engine_cs *engine)
184184
ENGINE_TRACE(engine, "ring:{HEAD:%04x, TAIL:%04x}\n",
185185
ring->head, ring->tail);
186186

187-
/* Double check the ring is empty & disabled before we resume */
188-
synchronize_hardirq(engine->i915->drm.irq);
187+
/*
188+
* Double check the ring is empty & disabled before we resume. Called
189+
* from atomic context during PCI probe, so _hardirq().
190+
*/
191+
intel_synchronize_hardirq(engine->i915);
189192
if (!stop_ring(engine))
190193
goto err;
191194

drivers/gpu/drm/i915/i915_irq.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4575,3 +4575,8 @@ void intel_synchronize_irq(struct drm_i915_private *i915)
45754575
{
45764576
synchronize_irq(to_pci_dev(i915->drm.dev)->irq);
45774577
}
4578+
4579+
void intel_synchronize_hardirq(struct drm_i915_private *i915)
4580+
{
4581+
synchronize_hardirq(to_pci_dev(i915->drm.dev)->irq);
4582+
}

drivers/gpu/drm/i915/i915_irq.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv);
9494
void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv);
9595
bool intel_irqs_enabled(struct drm_i915_private *dev_priv);
9696
void intel_synchronize_irq(struct drm_i915_private *i915);
97+
void intel_synchronize_hardirq(struct drm_i915_private *i915);
9798

9899
int intel_get_crtc_scanline(struct intel_crtc *crtc);
99100
void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,

0 commit comments

Comments
 (0)