On Wed, Apr 09, 2014 at 01:28:24PM +0300, ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Deepak S <deepak.s@xxxxxxxxx> > > v2: Remove vfuncs and add if else block to differentiate platform > (Daniel) > > Signed-off-by: Deepak S <deepak.s@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_irq.c | 49 +++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 47 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > index 1581b3d..6cf97c4 100644 > --- a/drivers/gpu/drm/i915/i915_irq.c > +++ b/drivers/gpu/drm/i915/i915_irq.c > @@ -37,6 +37,9 @@ > #include "i915_trace.h" > #include "intel_drv.h" > > + > +static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir); > + > static const u32 hpd_ibx[] = { > [HPD_CRT] = SDE_CRT_HOTPLUG, > [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG, > @@ -154,6 +157,32 @@ void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) > } > > /** > + * gen8_update_pm_irq - update GEN8_GT_IMR > + * @dev_priv: driver private > + * @interrupt_mask: mask of interrupt bits to update > + * @enabled_irq_mask: mask of interrupt bits to enable > + * */ > + > +static void gen8_update_pm_irq(struct drm_i915_private *dev_priv, > + uint32_t interrupt_mask, > + uint32_t enabled_irq_mask) > +{ > + uint32_t new_val; > + > + assert_spin_locked(&dev_priv->irq_lock); > + > + new_val = dev_priv->pm_irq_mask; > + new_val &= ~interrupt_mask; > + new_val |= (~enabled_irq_mask & interrupt_mask); > + > + if (new_val != dev_priv->pm_irq_mask) { > + dev_priv->pm_irq_mask = new_val; > + I915_WRITE(GEN8_GT_IMR(2), dev_priv->pm_irq_mask); > + POSTING_READ(GEN8_GT_IMR(2)); > + } > +} > + > +/** > * snb_update_pm_irq - update GEN6_PMIMR > * @dev_priv: driver private > * @interrupt_mask: mask of interrupt bits to update > @@ -188,12 +217,18 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv, > > void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) > { > - snb_update_pm_irq(dev_priv, mask, mask); > + if (IS_GEN8(dev_priv->dev)) > + gen8_update_pm_irq(dev_priv, mask, mask); > + else > + snb_update_pm_irq(dev_priv, mask, mask); > } > > void snb_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) > { > - snb_update_pm_irq(dev_priv, mask, 0); > + if (IS_GEN8(dev_priv->dev)) > + gen8_update_pm_irq(dev_priv, mask, 0); > + else > + snb_update_pm_irq(dev_priv, mask, 0); > } > > static bool ivb_can_enable_err_int(struct drm_device *dev) > @@ -1341,6 +1376,9 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev, > u32 rcs, bcs, vcs; > uint32_t tmp = 0; > irqreturn_t ret = IRQ_NONE; > + u32 pm_iir; > + > + pm_iir = I915_READ(GEN8_GT_IIR(2)); > > if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { > tmp = I915_READ(GEN8_GT_IIR(0)); > @@ -1381,6 +1419,12 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev, > DRM_ERROR("The master control interrupt lied (GT3)!\n"); > } > > + > + if (pm_iir) > + gen6_rps_irq_handler(dev_priv, pm_iir); > + > + I915_WRITE(GEN8_GT_IIR(2), pm_iir); > + > return ret; > } > > @@ -1796,6 +1840,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) > ret = IRQ_HANDLED; > } > > + > I915_WRITE(VLV_IIR, iir); > > I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); Spurious hunk. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx