drm/i915: extract and improve gen8_irq_power_well_post_enable
Move it from hsw_power_well_post_enable() (intel_pm.c) to i915_irq.c so we can reuse the nice IRQ macros we have there. The main difference is that now we're going to check if the IIR register is non-zero when we try to re-enable the interrupts. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
c5107b875a
commit
d49bdb0e10
|
@ -3478,6 +3478,18 @@ static void gen8_irq_reset(struct drm_device *dev)
|
||||||
ibx_irq_reset(dev);
|
ibx_irq_reset(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
unsigned long irqflags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||||
|
GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B, dev_priv->de_irq_mask[PIPE_B],
|
||||||
|
~dev_priv->de_irq_mask[PIPE_B]);
|
||||||
|
GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C, dev_priv->de_irq_mask[PIPE_C],
|
||||||
|
~dev_priv->de_irq_mask[PIPE_C]);
|
||||||
|
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||||
|
}
|
||||||
|
|
||||||
static void cherryview_irq_preinstall(struct drm_device *dev)
|
static void cherryview_irq_preinstall(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
|
@ -693,6 +693,7 @@ void intel_runtime_pm_disable_interrupts(struct drm_device *dev);
|
||||||
void intel_runtime_pm_restore_interrupts(struct drm_device *dev);
|
void intel_runtime_pm_restore_interrupts(struct drm_device *dev);
|
||||||
int intel_get_crtc_scanline(struct intel_crtc *crtc);
|
int intel_get_crtc_scanline(struct intel_crtc *crtc);
|
||||||
void i9xx_check_fifo_underruns(struct drm_device *dev);
|
void i9xx_check_fifo_underruns(struct drm_device *dev);
|
||||||
|
void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv);
|
||||||
|
|
||||||
|
|
||||||
/* intel_crt.c */
|
/* intel_crt.c */
|
||||||
|
|
|
@ -5998,7 +5998,6 @@ bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
|
||||||
static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
|
static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = dev_priv->dev;
|
struct drm_device *dev = dev_priv->dev;
|
||||||
unsigned long irqflags;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After we re-enable the power well, if we touch VGA register 0x3d5
|
* After we re-enable the power well, if we touch VGA register 0x3d5
|
||||||
|
@ -6014,21 +6013,8 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
|
||||||
outb(inb(VGA_MSR_READ), VGA_MSR_WRITE);
|
outb(inb(VGA_MSR_READ), VGA_MSR_WRITE);
|
||||||
vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
|
vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
|
||||||
|
|
||||||
if (IS_BROADWELL(dev)) {
|
if (IS_BROADWELL(dev))
|
||||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
gen8_irq_power_well_post_enable(dev_priv);
|
||||||
I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B),
|
|
||||||
dev_priv->de_irq_mask[PIPE_B]);
|
|
||||||
I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B),
|
|
||||||
~dev_priv->de_irq_mask[PIPE_B] |
|
|
||||||
GEN8_PIPE_VBLANK);
|
|
||||||
I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C),
|
|
||||||
dev_priv->de_irq_mask[PIPE_C]);
|
|
||||||
I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C),
|
|
||||||
~dev_priv->de_irq_mask[PIPE_C] |
|
|
||||||
GEN8_PIPE_VBLANK);
|
|
||||||
POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C));
|
|
||||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hsw_set_power_well(struct drm_i915_private *dev_priv,
|
static void hsw_set_power_well(struct drm_i915_private *dev_priv,
|
||||||
|
|
Loading…
Reference in New Issue