mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
drm/i915/gen8: Factor out display interrupt handling
Tidy quite long interrupt service routine by factoring out the display part. This simplifies the exit path a little bit, makes the code a bit more readable, and potentialy makes code reuse in the future easier. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Link: http://patchwork.freedesktop.org/patch/msgid/1452614647-13973-2-git-send-email-tvrtko.ursulin@linux.intel.com
This commit is contained in:
parent
e32192e1ae
commit
f11a0f46a2
1 changed files with 31 additions and 22 deletions
|
@ -2264,31 +2264,14 @@ static void bxt_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger,
|
||||||
intel_hpd_irq_handler(dev, pin_mask, long_mask);
|
intel_hpd_irq_handler(dev, pin_mask, long_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t gen8_irq_handler(int irq, void *arg)
|
static irqreturn_t
|
||||||
|
gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = arg;
|
struct drm_device *dev = dev_priv->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
u32 master_ctl, iir;
|
|
||||||
irqreturn_t ret = IRQ_NONE;
|
irqreturn_t ret = IRQ_NONE;
|
||||||
|
u32 iir;
|
||||||
enum pipe pipe;
|
enum pipe pipe;
|
||||||
|
|
||||||
if (!intel_irqs_enabled(dev_priv))
|
|
||||||
return IRQ_NONE;
|
|
||||||
|
|
||||||
/* IRQs are synced during runtime_suspend, we don't require a wakeref */
|
|
||||||
disable_rpm_wakeref_asserts(dev_priv);
|
|
||||||
|
|
||||||
master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
|
|
||||||
master_ctl &= ~GEN8_MASTER_IRQ_CONTROL;
|
|
||||||
if (!master_ctl)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
|
|
||||||
|
|
||||||
/* Find, clear, then process each source of interrupt */
|
|
||||||
|
|
||||||
ret = gen8_gt_irq_handler(dev_priv, master_ctl);
|
|
||||||
|
|
||||||
if (master_ctl & GEN8_DE_MISC_IRQ) {
|
if (master_ctl & GEN8_DE_MISC_IRQ) {
|
||||||
iir = I915_READ(GEN8_DE_MISC_IIR);
|
iir = I915_READ(GEN8_DE_MISC_IIR);
|
||||||
if (iir) {
|
if (iir) {
|
||||||
|
@ -2422,10 +2405,36 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static irqreturn_t gen8_irq_handler(int irq, void *arg)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = arg;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
u32 master_ctl;
|
||||||
|
irqreturn_t ret;
|
||||||
|
|
||||||
|
if (!intel_irqs_enabled(dev_priv))
|
||||||
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
|
||||||
|
master_ctl &= ~GEN8_MASTER_IRQ_CONTROL;
|
||||||
|
if (!master_ctl)
|
||||||
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
|
||||||
|
|
||||||
|
/* IRQs are synced during runtime_suspend, we don't require a wakeref */
|
||||||
|
disable_rpm_wakeref_asserts(dev_priv);
|
||||||
|
|
||||||
|
/* Find, clear, then process each source of interrupt */
|
||||||
|
ret = gen8_gt_irq_handler(dev_priv, master_ctl);
|
||||||
|
ret |= gen8_de_irq_handler(dev_priv, master_ctl);
|
||||||
|
|
||||||
I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
|
I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
|
||||||
POSTING_READ_FW(GEN8_MASTER_IRQ);
|
POSTING_READ_FW(GEN8_MASTER_IRQ);
|
||||||
|
|
||||||
out:
|
|
||||||
enable_rpm_wakeref_asserts(dev_priv);
|
enable_rpm_wakeref_asserts(dev_priv);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Reference in a new issue