]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/i915_irq.c
Merge tag 'v3.7-rc2' into drm-intel-next-queued
[karo-tx-linux.git] / drivers / gpu / drm / i915 / i915_irq.c
index 32e1bda865b87823976de3f7c51296f2ebc6c7f1..9628508a68a3aa5a5915a742353c2dec72538e3f 100644 (file)
@@ -352,8 +352,7 @@ static void notify_ring(struct drm_device *dev,
        if (i915_enable_hangcheck) {
                dev_priv->hangcheck_count = 0;
                mod_timer(&dev_priv->hangcheck_timer,
-                         jiffies +
-                         msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
+                         round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES));
        }
 }
 
@@ -520,7 +519,7 @@ static void gen6_queue_rps_work(struct drm_i915_private *dev_priv,
        queue_work(dev_priv->wq, &dev_priv->rps.work);
 }
 
-static irqreturn_t valleyview_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t valleyview_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -606,6 +605,9 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int pipe;
 
+       if (pch_iir & SDE_HOTPLUG_MASK)
+               queue_work(dev_priv->wq, &dev_priv->hotplug_work);
+
        if (pch_iir & SDE_AUDIO_POWER_MASK)
                DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
                                 (pch_iir & SDE_AUDIO_POWER_MASK) >>
@@ -646,6 +648,9 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int pipe;
 
+       if (pch_iir & SDE_HOTPLUG_MASK_CPT)
+               queue_work(dev_priv->wq, &dev_priv->hotplug_work);
+
        if (pch_iir & SDE_AUDIO_POWER_MASK_CPT)
                DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
                                 (pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>
@@ -670,7 +675,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
                                         I915_READ(FDI_RX_IIR(pipe)));
 }
 
-static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -709,8 +714,6 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
                if (de_iir & DE_PCH_EVENT_IVB) {
                        u32 pch_iir = I915_READ(SDEIIR);
 
-                       if (pch_iir & SDE_HOTPLUG_MASK_CPT)
-                               queue_work(dev_priv->wq, &dev_priv->hotplug_work);
                        cpt_irq_handler(dev, pch_iir);
 
                        /* clear PCH hotplug event before clear CPU irq */
@@ -745,13 +748,12 @@ static void ilk_gt_irq_handler(struct drm_device *dev,
                notify_ring(dev, &dev_priv->ring[VCS]);
 }
 
-static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t ironlake_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int ret = IRQ_NONE;
        u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir;
-       u32 hotplug_mask;
 
        atomic_inc(&dev_priv->irq_received);
 
@@ -769,11 +771,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
            (!IS_GEN6(dev) || pm_iir == 0))
                goto done;
 
-       if (HAS_PCH_CPT(dev))
-               hotplug_mask = SDE_HOTPLUG_MASK_CPT;
-       else
-               hotplug_mask = SDE_HOTPLUG_MASK;
-
        ret = IRQ_HANDLED;
 
        if (IS_GEN5(dev))
@@ -802,8 +799,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
 
        /* check event from PCH */
        if (de_iir & DE_PCH_EVENT) {
-               if (pch_iir & hotplug_mask)
-                       queue_work(dev_priv->wq, &dev_priv->hotplug_work);
                if (HAS_PCH_CPT(dev))
                        cpt_irq_handler(dev, pch_iir);
                else
@@ -1751,7 +1746,7 @@ void i915_hangcheck_elapsed(unsigned long data)
 repeat:
        /* Reset timer case chip hangs without another request being added */
        mod_timer(&dev_priv->hangcheck_timer,
-                 jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
+                 round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES));
 }
 
 /* drm_dma.h hooks
@@ -1956,6 +1951,7 @@ static int valleyview_irq_postinstall(struct drm_device *dev)
        u32 enable_mask;
        u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN);
        u32 pipestat_enable = PLANE_FLIP_DONE_INT_EN_VLV;
+       u32 render_irqs;
        u16 msid;
 
        enable_mask = I915_DISPLAY_PORT_INTERRUPT;
@@ -1995,21 +1991,12 @@ static int valleyview_irq_postinstall(struct drm_device *dev)
        I915_WRITE(VLV_IIR, 0xffffffff);
        I915_WRITE(VLV_IIR, 0xffffffff);
 
-       dev_priv->gt_irq_mask = ~0;
-
-       I915_WRITE(GTIIR, I915_READ(GTIIR));
        I915_WRITE(GTIIR, I915_READ(GTIIR));
        I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
-       I915_WRITE(GTIER, GT_GEN6_BLT_FLUSHDW_NOTIFY_INTERRUPT |
-                  GT_GEN6_BLT_CS_ERROR_INTERRUPT |
-                  GT_GEN6_BLT_USER_INTERRUPT |
-                  GT_GEN6_BSD_USER_INTERRUPT |
-                  GT_GEN6_BSD_CS_ERROR_INTERRUPT |
-                  GT_GEN7_L3_PARITY_ERROR_INTERRUPT |
-                  GT_PIPE_NOTIFY |
-                  GT_RENDER_CS_ERROR_INTERRUPT |
-                  GT_SYNC_STATUS |
-                  GT_USER_INTERRUPT);
+
+       render_irqs = GT_USER_INTERRUPT | GEN6_BSD_USER_INTERRUPT |
+               GEN6_BLITTER_USER_INTERRUPT;
+       I915_WRITE(GTIER, render_irqs);
        POSTING_READ(GTIER);
 
        /* ack & enable invalid PTE error interrupts */
@@ -2019,7 +2006,6 @@ static int valleyview_irq_postinstall(struct drm_device *dev)
 #endif
 
        I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
-#if 0 /* FIXME: check register definitions; some have moved */
        /* Note HDMI and DP share bits */
        if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS)
                hotplug_en |= HDMIB_HOTPLUG_INT_EN;
@@ -2027,15 +2013,14 @@ static int valleyview_irq_postinstall(struct drm_device *dev)
                hotplug_en |= HDMIC_HOTPLUG_INT_EN;
        if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS)
                hotplug_en |= HDMID_HOTPLUG_INT_EN;
-       if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS)
+       if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915)
                hotplug_en |= SDVOC_HOTPLUG_INT_EN;
-       if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
+       if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915)
                hotplug_en |= SDVOB_HOTPLUG_INT_EN;
        if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
                hotplug_en |= CRT_HOTPLUG_INT_EN;
                hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
        }
-#endif
 
        I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
 
@@ -2129,7 +2114,7 @@ static int i8xx_irq_postinstall(struct drm_device *dev)
        return 0;
 }
 
-static irqreturn_t i8xx_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t i8xx_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -2307,7 +2292,7 @@ static int i915_irq_postinstall(struct drm_device *dev)
        return 0;
 }
 
-static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t i915_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -2545,7 +2530,7 @@ static int i965_irq_postinstall(struct drm_device *dev)
        return 0;
 }
 
-static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
+static irqreturn_t i965_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;