aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-21 12:04:36 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-30 06:16:59 -0400
commit40da17c29be95acf5543c97c8bc2fbb5991c3e39 (patch)
treee9139eff22b6e89d4997327cbcc4838bc03f35aa
parent3b6c42e82c83da0ea9230c1bbd3390ab4ecf0cb6 (diff)
drm/i915: refactor ilk display interrupt handling
- Use a for_each_loop and add the corresponding #defines. - Drop the _ILK postfix on the existing DE_PIPE_VBLANK macro for consistency with everything else. - Also use macros (and add the missing one for plane flips) for the ivb display interrupt handler. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> [danvet: Drop the useless parens that Ville spotted.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c50
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h7
2 files changed, 26 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a8a258ed601a..a228176676b2 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1541,6 +1541,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
1541static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir) 1541static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir)
1542{ 1542{
1543 struct drm_i915_private *dev_priv = dev->dev_private; 1543 struct drm_i915_private *dev_priv = dev->dev_private;
1544 enum pipe pipe;
1544 1545
1545 if (de_iir & DE_AUX_CHANNEL_A) 1546 if (de_iir & DE_AUX_CHANNEL_A)
1546 dp_aux_irq_handler(dev); 1547 dp_aux_irq_handler(dev);
@@ -1548,37 +1549,26 @@ static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir)
1548 if (de_iir & DE_GSE) 1549 if (de_iir & DE_GSE)
1549 intel_opregion_asle_intr(dev); 1550 intel_opregion_asle_intr(dev);
1550 1551
1551 if (de_iir & DE_PIPEA_VBLANK)
1552 drm_handle_vblank(dev, 0);
1553
1554 if (de_iir & DE_PIPEB_VBLANK)
1555 drm_handle_vblank(dev, 1);
1556
1557 if (de_iir & DE_POISON) 1552 if (de_iir & DE_POISON)
1558 DRM_ERROR("Poison interrupt\n"); 1553 DRM_ERROR("Poison interrupt\n");
1559 1554
1560 if (de_iir & DE_PIPEA_FIFO_UNDERRUN) 1555 for_each_pipe(pipe) {
1561 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_A, false)) 1556 if (de_iir & DE_PIPE_VBLANK(pipe))
1562 DRM_DEBUG_DRIVER("Pipe A FIFO underrun\n"); 1557 drm_handle_vblank(dev, pipe);
1563
1564 if (de_iir & DE_PIPEB_FIFO_UNDERRUN)
1565 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_B, false))
1566 DRM_DEBUG_DRIVER("Pipe B FIFO underrun\n");
1567
1568 if (de_iir & DE_PIPEA_CRC_DONE)
1569 i9xx_pipe_crc_irq_handler(dev, PIPE_A);
1570 1558
1571 if (de_iir & DE_PIPEB_CRC_DONE) 1559 if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe))
1572 i9xx_pipe_crc_irq_handler(dev, PIPE_B); 1560 if (intel_set_cpu_fifo_underrun_reporting(dev, pipe, false))
1561 DRM_DEBUG_DRIVER("Pipe %c FIFO underrun\n",
1562 pipe_name(pipe));
1573 1563
1574 if (de_iir & DE_PLANEA_FLIP_DONE) { 1564 if (de_iir & DE_PIPE_CRC_DONE(pipe))
1575 intel_prepare_page_flip(dev, 0); 1565 i9xx_pipe_crc_irq_handler(dev, pipe);
1576 intel_finish_page_flip_plane(dev, 0);
1577 }
1578 1566
1579 if (de_iir & DE_PLANEB_FLIP_DONE) { 1567 /* plane/pipes map 1:1 on ilk+ */
1580 intel_prepare_page_flip(dev, 1); 1568 if (de_iir & DE_PLANE_FLIP_DONE(pipe)) {
1581 intel_finish_page_flip_plane(dev, 1); 1569 intel_prepare_page_flip(dev, pipe);
1570 intel_finish_page_flip_plane(dev, pipe);
1571 }
1582 } 1572 }
1583 1573
1584 /* check event from PCH */ 1574 /* check event from PCH */
@@ -1613,9 +1603,11 @@ static void ivb_display_irq_handler(struct drm_device *dev, u32 de_iir)
1613 intel_opregion_asle_intr(dev); 1603 intel_opregion_asle_intr(dev);
1614 1604
1615 for_each_pipe(i) { 1605 for_each_pipe(i) {
1616 if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i))) 1606 if (de_iir & (DE_PIPE_VBLANK_IVB(i)))
1617 drm_handle_vblank(dev, i); 1607 drm_handle_vblank(dev, i);
1618 if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) { 1608
1609 /* plane/pipes map 1:1 on ilk+ */
1610 if (de_iir & DE_PLANE_FLIP_DONE_IVB(i)) {
1619 intel_prepare_page_flip(dev, i); 1611 intel_prepare_page_flip(dev, i);
1620 intel_finish_page_flip_plane(dev, i); 1612 intel_finish_page_flip_plane(dev, i);
1621 } 1613 }
@@ -2018,7 +2010,7 @@ static int ironlake_enable_vblank(struct drm_device *dev, int pipe)
2018 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2010 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2019 unsigned long irqflags; 2011 unsigned long irqflags;
2020 uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : 2012 uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) :
2021 DE_PIPE_VBLANK_ILK(pipe); 2013 DE_PIPE_VBLANK(pipe);
2022 2014
2023 if (!i915_pipe_enabled(dev, pipe)) 2015 if (!i915_pipe_enabled(dev, pipe))
2024 return -EINVAL; 2016 return -EINVAL;
@@ -2076,7 +2068,7 @@ static void ironlake_disable_vblank(struct drm_device *dev, int pipe)
2076 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2068 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2077 unsigned long irqflags; 2069 unsigned long irqflags;
2078 uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) : 2070 uint32_t bit = (INTEL_INFO(dev)->gen >= 7) ? DE_PIPE_VBLANK_IVB(pipe) :
2079 DE_PIPE_VBLANK_ILK(pipe); 2071 DE_PIPE_VBLANK(pipe);
2080 2072
2081 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 2073 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2082 ironlake_disable_display_irq(dev_priv, bit); 2074 ironlake_disable_display_irq(dev_priv, bit);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 9785f7d031a4..3591dbb58f7b 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -3926,6 +3926,7 @@
3926#define DE_SPRITEA_FLIP_DONE (1 << 28) 3926#define DE_SPRITEA_FLIP_DONE (1 << 28)
3927#define DE_PLANEB_FLIP_DONE (1 << 27) 3927#define DE_PLANEB_FLIP_DONE (1 << 27)
3928#define DE_PLANEA_FLIP_DONE (1 << 26) 3928#define DE_PLANEA_FLIP_DONE (1 << 26)
3929#define DE_PLANE_FLIP_DONE(plane) (1 << (26 + (plane)))
3929#define DE_PCU_EVENT (1 << 25) 3930#define DE_PCU_EVENT (1 << 25)
3930#define DE_GTT_FAULT (1 << 24) 3931#define DE_GTT_FAULT (1 << 24)
3931#define DE_POISON (1 << 23) 3932#define DE_POISON (1 << 23)
@@ -3942,12 +3943,15 @@
3942#define DE_PIPEB_CRC_DONE (1 << 10) 3943#define DE_PIPEB_CRC_DONE (1 << 10)
3943#define DE_PIPEB_FIFO_UNDERRUN (1 << 8) 3944#define DE_PIPEB_FIFO_UNDERRUN (1 << 8)
3944#define DE_PIPEA_VBLANK (1 << 7) 3945#define DE_PIPEA_VBLANK (1 << 7)
3946#define DE_PIPE_VBLANK(pipe) (1 << (7 + 8*(pipe)))
3945#define DE_PIPEA_EVEN_FIELD (1 << 6) 3947#define DE_PIPEA_EVEN_FIELD (1 << 6)
3946#define DE_PIPEA_ODD_FIELD (1 << 5) 3948#define DE_PIPEA_ODD_FIELD (1 << 5)
3947#define DE_PIPEA_LINE_COMPARE (1 << 4) 3949#define DE_PIPEA_LINE_COMPARE (1 << 4)
3948#define DE_PIPEA_VSYNC (1 << 3) 3950#define DE_PIPEA_VSYNC (1 << 3)
3949#define DE_PIPEA_CRC_DONE (1 << 2) 3951#define DE_PIPEA_CRC_DONE (1 << 2)
3952#define DE_PIPE_CRC_DONE(pipe) (1 << (2 + 8*(pipe)))
3950#define DE_PIPEA_FIFO_UNDERRUN (1 << 0) 3953#define DE_PIPEA_FIFO_UNDERRUN (1 << 0)
3954#define DE_PIPE_FIFO_UNDERRUN(pipe) (1 << (8*(pipe)))
3951 3955
3952/* More Ivybridge lolz */ 3956/* More Ivybridge lolz */
3953#define DE_ERR_INT_IVB (1<<30) 3957#define DE_ERR_INT_IVB (1<<30)
@@ -3963,9 +3967,8 @@
3963#define DE_PIPEB_VBLANK_IVB (1<<5) 3967#define DE_PIPEB_VBLANK_IVB (1<<5)
3964#define DE_SPRITEA_FLIP_DONE_IVB (1<<4) 3968#define DE_SPRITEA_FLIP_DONE_IVB (1<<4)
3965#define DE_PLANEA_FLIP_DONE_IVB (1<<3) 3969#define DE_PLANEA_FLIP_DONE_IVB (1<<3)
3970#define DE_PLANE_FLIP_DONE_IVB(plane) (1<< (3 + 5*(plane)))
3966#define DE_PIPEA_VBLANK_IVB (1<<0) 3971#define DE_PIPEA_VBLANK_IVB (1<<0)
3967
3968#define DE_PIPE_VBLANK_ILK(pipe) (1 << ((pipe * 8) + 7))
3969#define DE_PIPE_VBLANK_IVB(pipe) (1 << (pipe * 5)) 3972#define DE_PIPE_VBLANK_IVB(pipe) (1 << (pipe * 5))
3970 3973
3971#define VLV_MASTER_IER 0x4400c /* Gunit master IER */ 3974#define VLV_MASTER_IER 0x4400c /* Gunit master IER */