diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-21 12:04:36 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-30 06:16:59 -0400 |
commit | 40da17c29be95acf5543c97c8bc2fbb5991c3e39 (patch) | |
tree | e9139eff22b6e89d4997327cbcc4838bc03f35aa | |
parent | 3b6c42e82c83da0ea9230c1bbd3390ab4ecf0cb6 (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.c | 50 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 7 |
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) | |||
1541 | static void ilk_display_irq_handler(struct drm_device *dev, u32 de_iir) | 1541 | static 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 */ |