aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-15 04:02:39 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-15 04:02:39 -0500
commitc09cd6e9691ec6fce8cb90b65929cad389d39c84 (patch)
treed76104420f72172b21b8fb5ca512baa016ac892b /drivers/gpu/drm/i915/i915_irq.c
parent7eb1c496f7ac0f386552c0cd9144f6965fc61da5 (diff)
parent96ab4c70396e4e5a4d623bc95e86484682bef78f (diff)
Merge branch 'backlight-rework' into drm-intel-next-queued
Pull in Jani's backlight rework branch. This was merged through a separate branch to be able to sort out the Broadwell conflicts properly before pulling it into the main development branch. Conflicts: drivers/gpu/drm/i915/intel_display.c Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c439
1 files changed, 423 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 19949e8b36c5..931ee5d8cdb1 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -270,6 +270,21 @@ static void ivybridge_set_fifo_underrun_reporting(struct drm_device *dev,
270 } 270 }
271} 271}
272 272
273static void broadwell_set_fifo_underrun_reporting(struct drm_device *dev,
274 enum pipe pipe, bool enable)
275{
276 struct drm_i915_private *dev_priv = dev->dev_private;
277
278 assert_spin_locked(&dev_priv->irq_lock);
279
280 if (enable)
281 dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_FIFO_UNDERRUN;
282 else
283 dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_FIFO_UNDERRUN;
284 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
285 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
286}
287
273/** 288/**
274 * ibx_display_interrupt_update - update SDEIMR 289 * ibx_display_interrupt_update - update SDEIMR
275 * @dev_priv: driver private 290 * @dev_priv: driver private
@@ -382,6 +397,8 @@ bool intel_set_cpu_fifo_underrun_reporting(struct drm_device *dev,
382 ironlake_set_fifo_underrun_reporting(dev, pipe, enable); 397 ironlake_set_fifo_underrun_reporting(dev, pipe, enable);
383 else if (IS_GEN7(dev)) 398 else if (IS_GEN7(dev))
384 ivybridge_set_fifo_underrun_reporting(dev, pipe, enable); 399 ivybridge_set_fifo_underrun_reporting(dev, pipe, enable);
400 else if (IS_GEN8(dev))
401 broadwell_set_fifo_underrun_reporting(dev, pipe, enable);
385 402
386done: 403done:
387 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 404 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
@@ -600,35 +617,40 @@ static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
600 return I915_READ(reg); 617 return I915_READ(reg);
601} 618}
602 619
603static bool intel_pipe_in_vblank(struct drm_device *dev, enum pipe pipe) 620/* raw reads, only for fast reads of display block, no need for forcewake etc. */
621#define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
622#define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__))
623
624static bool intel_pipe_in_vblank_locked(struct drm_device *dev, enum pipe pipe)
604{ 625{
605 struct drm_i915_private *dev_priv = dev->dev_private; 626 struct drm_i915_private *dev_priv = dev->dev_private;
606 uint32_t status; 627 uint32_t status;
628 int reg;
607 629
608 if (IS_VALLEYVIEW(dev)) { 630 if (IS_VALLEYVIEW(dev)) {
609 status = pipe == PIPE_A ? 631 status = pipe == PIPE_A ?
610 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT : 632 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT :
611 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; 633 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
612 634
613 return I915_READ(VLV_ISR) & status; 635 reg = VLV_ISR;
614 } else if (IS_GEN2(dev)) { 636 } else if (IS_GEN2(dev)) {
615 status = pipe == PIPE_A ? 637 status = pipe == PIPE_A ?
616 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT : 638 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT :
617 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; 639 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
618 640
619 return I915_READ16(ISR) & status; 641 reg = ISR;
620 } else if (INTEL_INFO(dev)->gen < 5) { 642 } else if (INTEL_INFO(dev)->gen < 5) {
621 status = pipe == PIPE_A ? 643 status = pipe == PIPE_A ?
622 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT : 644 I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT :
623 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; 645 I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
624 646
625 return I915_READ(ISR) & status; 647 reg = ISR;
626 } else if (INTEL_INFO(dev)->gen < 7) { 648 } else if (INTEL_INFO(dev)->gen < 7) {
627 status = pipe == PIPE_A ? 649 status = pipe == PIPE_A ?
628 DE_PIPEA_VBLANK : 650 DE_PIPEA_VBLANK :
629 DE_PIPEB_VBLANK; 651 DE_PIPEB_VBLANK;
630 652
631 return I915_READ(DEISR) & status; 653 reg = DEISR;
632 } else { 654 } else {
633 switch (pipe) { 655 switch (pipe) {
634 default: 656 default:
@@ -643,12 +665,17 @@ static bool intel_pipe_in_vblank(struct drm_device *dev, enum pipe pipe)
643 break; 665 break;
644 } 666 }
645 667
646 return I915_READ(DEISR) & status; 668 reg = DEISR;
647 } 669 }
670
671 if (IS_GEN2(dev))
672 return __raw_i915_read16(dev_priv, reg) & status;
673 else
674 return __raw_i915_read32(dev_priv, reg) & status;
648} 675}
649 676
650static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, 677static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
651 int *vpos, int *hpos) 678 int *vpos, int *hpos, ktime_t *stime, ktime_t *etime)
652{ 679{
653 struct drm_i915_private *dev_priv = dev->dev_private; 680 struct drm_i915_private *dev_priv = dev->dev_private;
654 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 681 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
@@ -658,6 +685,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
658 int vbl_start, vbl_end, htotal, vtotal; 685 int vbl_start, vbl_end, htotal, vtotal;
659 bool in_vbl = true; 686 bool in_vbl = true;
660 int ret = 0; 687 int ret = 0;
688 unsigned long irqflags;
661 689
662 if (!intel_crtc->active) { 690 if (!intel_crtc->active) {
663 DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled " 691 DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
@@ -672,14 +700,27 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
672 700
673 ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE; 701 ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE;
674 702
703 /*
704 * Lock uncore.lock, as we will do multiple timing critical raw
705 * register reads, potentially with preemption disabled, so the
706 * following code must not block on uncore.lock.
707 */
708 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
709
710 /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
711
712 /* Get optional system timestamp before query. */
713 if (stime)
714 *stime = ktime_get();
715
675 if (IS_GEN2(dev) || IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { 716 if (IS_GEN2(dev) || IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) {
676 /* No obvious pixelcount register. Only query vertical 717 /* No obvious pixelcount register. Only query vertical
677 * scanout position from Display scan line register. 718 * scanout position from Display scan line register.
678 */ 719 */
679 if (IS_GEN2(dev)) 720 if (IS_GEN2(dev))
680 position = I915_READ(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; 721 position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;
681 else 722 else
682 position = I915_READ(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; 723 position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
683 724
684 /* 725 /*
685 * The scanline counter increments at the leading edge 726 * The scanline counter increments at the leading edge
@@ -688,7 +729,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
688 * to get a more accurate picture whether we're in vblank 729 * to get a more accurate picture whether we're in vblank
689 * or not. 730 * or not.
690 */ 731 */
691 in_vbl = intel_pipe_in_vblank(dev, pipe); 732 in_vbl = intel_pipe_in_vblank_locked(dev, pipe);
692 if ((in_vbl && position == vbl_start - 1) || 733 if ((in_vbl && position == vbl_start - 1) ||
693 (!in_vbl && position == vbl_end - 1)) 734 (!in_vbl && position == vbl_end - 1))
694 position = (position + 1) % vtotal; 735 position = (position + 1) % vtotal;
@@ -697,7 +738,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
697 * We can split this into vertical and horizontal 738 * We can split this into vertical and horizontal
698 * scanout position. 739 * scanout position.
699 */ 740 */
700 position = (I915_READ(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; 741 position = (__raw_i915_read32(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
701 742
702 /* convert to pixel counts */ 743 /* convert to pixel counts */
703 vbl_start *= htotal; 744 vbl_start *= htotal;
@@ -705,6 +746,14 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
705 vtotal *= htotal; 746 vtotal *= htotal;
706 } 747 }
707 748
749 /* Get optional system timestamp after query. */
750 if (etime)
751 *etime = ktime_get();
752
753 /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
754
755 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
756
708 in_vbl = position >= vbl_start && position < vbl_end; 757 in_vbl = position >= vbl_start && position < vbl_end;
709 758
710 /* 759 /*
@@ -1038,7 +1087,7 @@ static void ivybridge_parity_work(struct work_struct *work)
1038 parity_event[4] = kasprintf(GFP_KERNEL, "SLICE=%d", slice); 1087 parity_event[4] = kasprintf(GFP_KERNEL, "SLICE=%d", slice);
1039 parity_event[5] = NULL; 1088 parity_event[5] = NULL;
1040 1089
1041 kobject_uevent_env(&dev_priv->dev->primary->kdev.kobj, 1090 kobject_uevent_env(&dev_priv->dev->primary->kdev->kobj,
1042 KOBJ_CHANGE, parity_event); 1091 KOBJ_CHANGE, parity_event);
1043 1092
1044 DRM_DEBUG("Parity error: Slice = %d, Row = %d, Bank = %d, Sub bank = %d.\n", 1093 DRM_DEBUG("Parity error: Slice = %d, Row = %d, Bank = %d, Sub bank = %d.\n",
@@ -1117,6 +1166,56 @@ static void snb_gt_irq_handler(struct drm_device *dev,
1117 ivybridge_parity_error_irq_handler(dev, gt_iir); 1166 ivybridge_parity_error_irq_handler(dev, gt_iir);
1118} 1167}
1119 1168
1169static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
1170 struct drm_i915_private *dev_priv,
1171 u32 master_ctl)
1172{
1173 u32 rcs, bcs, vcs;
1174 uint32_t tmp = 0;
1175 irqreturn_t ret = IRQ_NONE;
1176
1177 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1178 tmp = I915_READ(GEN8_GT_IIR(0));
1179 if (tmp) {
1180 ret = IRQ_HANDLED;
1181 rcs = tmp >> GEN8_RCS_IRQ_SHIFT;
1182 bcs = tmp >> GEN8_BCS_IRQ_SHIFT;
1183 if (rcs & GT_RENDER_USER_INTERRUPT)
1184 notify_ring(dev, &dev_priv->ring[RCS]);
1185 if (bcs & GT_RENDER_USER_INTERRUPT)
1186 notify_ring(dev, &dev_priv->ring[BCS]);
1187 I915_WRITE(GEN8_GT_IIR(0), tmp);
1188 } else
1189 DRM_ERROR("The master control interrupt lied (GT0)!\n");
1190 }
1191
1192 if (master_ctl & GEN8_GT_VCS1_IRQ) {
1193 tmp = I915_READ(GEN8_GT_IIR(1));
1194 if (tmp) {
1195 ret = IRQ_HANDLED;
1196 vcs = tmp >> GEN8_VCS1_IRQ_SHIFT;
1197 if (vcs & GT_RENDER_USER_INTERRUPT)
1198 notify_ring(dev, &dev_priv->ring[VCS]);
1199 I915_WRITE(GEN8_GT_IIR(1), tmp);
1200 } else
1201 DRM_ERROR("The master control interrupt lied (GT1)!\n");
1202 }
1203
1204 if (master_ctl & GEN8_GT_VECS_IRQ) {
1205 tmp = I915_READ(GEN8_GT_IIR(3));
1206 if (tmp) {
1207 ret = IRQ_HANDLED;
1208 vcs = tmp >> GEN8_VECS_IRQ_SHIFT;
1209 if (vcs & GT_RENDER_USER_INTERRUPT)
1210 notify_ring(dev, &dev_priv->ring[VECS]);
1211 I915_WRITE(GEN8_GT_IIR(3), tmp);
1212 } else
1213 DRM_ERROR("The master control interrupt lied (GT3)!\n");
1214 }
1215
1216 return ret;
1217}
1218
1120#define HPD_STORM_DETECT_PERIOD 1000 1219#define HPD_STORM_DETECT_PERIOD 1000
1121#define HPD_STORM_THRESHOLD 5 1220#define HPD_STORM_THRESHOLD 5
1122 1221
@@ -1351,7 +1450,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
1351 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1450 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1352 1451
1353 for_each_pipe(pipe) { 1452 for_each_pipe(pipe) {
1354 if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS) 1453 if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
1355 drm_handle_vblank(dev, pipe); 1454 drm_handle_vblank(dev, pipe);
1356 1455
1357 if (pipe_stats[pipe] & PLANE_FLIPDONE_INT_STATUS_VLV) { 1456 if (pipe_stats[pipe] & PLANE_FLIPDONE_INT_STATUS_VLV) {
@@ -1690,6 +1789,117 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
1690 return ret; 1789 return ret;
1691} 1790}
1692 1791
1792static irqreturn_t gen8_irq_handler(int irq, void *arg)
1793{
1794 struct drm_device *dev = arg;
1795 struct drm_i915_private *dev_priv = dev->dev_private;
1796 u32 master_ctl;
1797 irqreturn_t ret = IRQ_NONE;
1798 uint32_t tmp = 0;
1799 enum pipe pipe;
1800
1801 atomic_inc(&dev_priv->irq_received);
1802
1803 master_ctl = I915_READ(GEN8_MASTER_IRQ);
1804 master_ctl &= ~GEN8_MASTER_IRQ_CONTROL;
1805 if (!master_ctl)
1806 return IRQ_NONE;
1807
1808 I915_WRITE(GEN8_MASTER_IRQ, 0);
1809 POSTING_READ(GEN8_MASTER_IRQ);
1810
1811 ret = gen8_gt_irq_handler(dev, dev_priv, master_ctl);
1812
1813 if (master_ctl & GEN8_DE_MISC_IRQ) {
1814 tmp = I915_READ(GEN8_DE_MISC_IIR);
1815 if (tmp & GEN8_DE_MISC_GSE)
1816 intel_opregion_asle_intr(dev);
1817 else if (tmp)
1818 DRM_ERROR("Unexpected DE Misc interrupt\n");
1819 else
1820 DRM_ERROR("The master control interrupt lied (DE MISC)!\n");
1821
1822 if (tmp) {
1823 I915_WRITE(GEN8_DE_MISC_IIR, tmp);
1824 ret = IRQ_HANDLED;
1825 }
1826 }
1827
1828 if (master_ctl & GEN8_DE_PORT_IRQ) {
1829 tmp = I915_READ(GEN8_DE_PORT_IIR);
1830 if (tmp & GEN8_AUX_CHANNEL_A)
1831 dp_aux_irq_handler(dev);
1832 else if (tmp)
1833 DRM_ERROR("Unexpected DE Port interrupt\n");
1834 else
1835 DRM_ERROR("The master control interrupt lied (DE PORT)!\n");
1836
1837 if (tmp) {
1838 I915_WRITE(GEN8_DE_PORT_IIR, tmp);
1839 ret = IRQ_HANDLED;
1840 }
1841 }
1842
1843 for_each_pipe(pipe) {
1844 uint32_t pipe_iir;
1845
1846 if (!(master_ctl & GEN8_DE_PIPE_IRQ(pipe)))
1847 continue;
1848
1849 pipe_iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
1850 if (pipe_iir & GEN8_PIPE_VBLANK)
1851 drm_handle_vblank(dev, pipe);
1852
1853 if (pipe_iir & GEN8_PIPE_FLIP_DONE) {
1854 intel_prepare_page_flip(dev, pipe);
1855 intel_finish_page_flip_plane(dev, pipe);
1856 }
1857
1858 if (pipe_iir & GEN8_PIPE_CDCLK_CRC_DONE)
1859 hsw_pipe_crc_irq_handler(dev, pipe);
1860
1861 if (pipe_iir & GEN8_PIPE_FIFO_UNDERRUN) {
1862 if (intel_set_cpu_fifo_underrun_reporting(dev, pipe,
1863 false))
1864 DRM_DEBUG_DRIVER("Pipe %c FIFO underrun\n",
1865 pipe_name(pipe));
1866 }
1867
1868 if (pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS) {
1869 DRM_ERROR("Fault errors on pipe %c\n: 0x%08x",
1870 pipe_name(pipe),
1871 pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS);
1872 }
1873
1874 if (pipe_iir) {
1875 ret = IRQ_HANDLED;
1876 I915_WRITE(GEN8_DE_PIPE_IIR(pipe), pipe_iir);
1877 } else
1878 DRM_ERROR("The master control interrupt lied (DE PIPE)!\n");
1879 }
1880
1881 if (!HAS_PCH_NOP(dev) && master_ctl & GEN8_DE_PCH_IRQ) {
1882 /*
1883 * FIXME(BDW): Assume for now that the new interrupt handling
1884 * scheme also closed the SDE interrupt handling race we've seen
1885 * on older pch-split platforms. But this needs testing.
1886 */
1887 u32 pch_iir = I915_READ(SDEIIR);
1888
1889 cpt_irq_handler(dev, pch_iir);
1890
1891 if (pch_iir) {
1892 I915_WRITE(SDEIIR, pch_iir);
1893 ret = IRQ_HANDLED;
1894 }
1895 }
1896
1897 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
1898 POSTING_READ(GEN8_MASTER_IRQ);
1899
1900 return ret;
1901}
1902
1693static void i915_error_wake_up(struct drm_i915_private *dev_priv, 1903static void i915_error_wake_up(struct drm_i915_private *dev_priv,
1694 bool reset_completed) 1904 bool reset_completed)
1695{ 1905{
@@ -1737,7 +1947,7 @@ static void i915_error_work_func(struct work_struct *work)
1737 char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL }; 1947 char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL };
1738 int ret; 1948 int ret;
1739 1949
1740 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event); 1950 kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, error_event);
1741 1951
1742 /* 1952 /*
1743 * Note that there's only one work item which does gpu resets, so we 1953 * Note that there's only one work item which does gpu resets, so we
@@ -1751,7 +1961,7 @@ static void i915_error_work_func(struct work_struct *work)
1751 */ 1961 */
1752 if (i915_reset_in_progress(error) && !i915_terminally_wedged(error)) { 1962 if (i915_reset_in_progress(error) && !i915_terminally_wedged(error)) {
1753 DRM_DEBUG_DRIVER("resetting chip\n"); 1963 DRM_DEBUG_DRIVER("resetting chip\n");
1754 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, 1964 kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE,
1755 reset_event); 1965 reset_event);
1756 1966
1757 /* 1967 /*
@@ -1778,7 +1988,7 @@ static void i915_error_work_func(struct work_struct *work)
1778 smp_mb__before_atomic_inc(); 1988 smp_mb__before_atomic_inc();
1779 atomic_inc(&dev_priv->gpu_error.reset_counter); 1989 atomic_inc(&dev_priv->gpu_error.reset_counter);
1780 1990
1781 kobject_uevent_env(&dev->primary->kdev.kobj, 1991 kobject_uevent_env(&dev->primary->kdev->kobj,
1782 KOBJ_CHANGE, reset_done_event); 1992 KOBJ_CHANGE, reset_done_event);
1783 } else { 1993 } else {
1784 atomic_set_mask(I915_WEDGED, &error->reset_counter); 1994 atomic_set_mask(I915_WEDGED, &error->reset_counter);
@@ -2043,6 +2253,22 @@ static int valleyview_enable_vblank(struct drm_device *dev, int pipe)
2043 return 0; 2253 return 0;
2044} 2254}
2045 2255
2256static int gen8_enable_vblank(struct drm_device *dev, int pipe)
2257{
2258 struct drm_i915_private *dev_priv = dev->dev_private;
2259 unsigned long irqflags;
2260
2261 if (!i915_pipe_enabled(dev, pipe))
2262 return -EINVAL;
2263
2264 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2265 dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_VBLANK;
2266 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
2267 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2268 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2269 return 0;
2270}
2271
2046/* Called from drm generic code, passed 'crtc' which 2272/* Called from drm generic code, passed 'crtc' which
2047 * we use as a pipe index 2273 * we use as a pipe index
2048 */ 2274 */
@@ -2091,6 +2317,21 @@ static void valleyview_disable_vblank(struct drm_device *dev, int pipe)
2091 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2317 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2092} 2318}
2093 2319
2320static void gen8_disable_vblank(struct drm_device *dev, int pipe)
2321{
2322 struct drm_i915_private *dev_priv = dev->dev_private;
2323 unsigned long irqflags;
2324
2325 if (!i915_pipe_enabled(dev, pipe))
2326 return;
2327
2328 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
2329 dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_VBLANK;
2330 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
2331 POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
2332 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
2333}
2334
2094static u32 2335static u32
2095ring_last_seqno(struct intel_ring_buffer *ring) 2336ring_last_seqno(struct intel_ring_buffer *ring)
2096{ 2337{
@@ -2425,6 +2666,53 @@ static void valleyview_irq_preinstall(struct drm_device *dev)
2425 POSTING_READ(VLV_IER); 2666 POSTING_READ(VLV_IER);
2426} 2667}
2427 2668
2669static void gen8_irq_preinstall(struct drm_device *dev)
2670{
2671 struct drm_i915_private *dev_priv = dev->dev_private;
2672 int pipe;
2673
2674 atomic_set(&dev_priv->irq_received, 0);
2675
2676 I915_WRITE(GEN8_MASTER_IRQ, 0);
2677 POSTING_READ(GEN8_MASTER_IRQ);
2678
2679 /* IIR can theoretically queue up two events. Be paranoid */
2680#define GEN8_IRQ_INIT_NDX(type, which) do { \
2681 I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \
2682 POSTING_READ(GEN8_##type##_IMR(which)); \
2683 I915_WRITE(GEN8_##type##_IER(which), 0); \
2684 I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \
2685 POSTING_READ(GEN8_##type##_IIR(which)); \
2686 I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \
2687 } while (0)
2688
2689#define GEN8_IRQ_INIT(type) do { \
2690 I915_WRITE(GEN8_##type##_IMR, 0xffffffff); \
2691 POSTING_READ(GEN8_##type##_IMR); \
2692 I915_WRITE(GEN8_##type##_IER, 0); \
2693 I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \
2694 POSTING_READ(GEN8_##type##_IIR); \
2695 I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \
2696 } while (0)
2697
2698 GEN8_IRQ_INIT_NDX(GT, 0);
2699 GEN8_IRQ_INIT_NDX(GT, 1);
2700 GEN8_IRQ_INIT_NDX(GT, 2);
2701 GEN8_IRQ_INIT_NDX(GT, 3);
2702
2703 for_each_pipe(pipe) {
2704 GEN8_IRQ_INIT_NDX(DE_PIPE, pipe);
2705 }
2706
2707 GEN8_IRQ_INIT(DE_PORT);
2708 GEN8_IRQ_INIT(DE_MISC);
2709 GEN8_IRQ_INIT(PCU);
2710#undef GEN8_IRQ_INIT
2711#undef GEN8_IRQ_INIT_NDX
2712
2713 POSTING_READ(GEN8_PCU_IIR);
2714}
2715
2428static void ibx_hpd_irq_setup(struct drm_device *dev) 2716static void ibx_hpd_irq_setup(struct drm_device *dev)
2429{ 2717{
2430 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2718 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -2630,6 +2918,117 @@ static int valleyview_irq_postinstall(struct drm_device *dev)
2630 return 0; 2918 return 0;
2631} 2919}
2632 2920
2921static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv)
2922{
2923 int i;
2924
2925 /* These are interrupts we'll toggle with the ring mask register */
2926 uint32_t gt_interrupts[] = {
2927 GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
2928 GT_RENDER_L3_PARITY_ERROR_INTERRUPT |
2929 GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT,
2930 GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT |
2931 GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT,
2932 0,
2933 GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT
2934 };
2935
2936 for (i = 0; i < ARRAY_SIZE(gt_interrupts); i++) {
2937 u32 tmp = I915_READ(GEN8_GT_IIR(i));
2938 if (tmp)
2939 DRM_ERROR("Interrupt (%d) should have been masked in pre-install 0x%08x\n",
2940 i, tmp);
2941 I915_WRITE(GEN8_GT_IMR(i), ~gt_interrupts[i]);
2942 I915_WRITE(GEN8_GT_IER(i), gt_interrupts[i]);
2943 }
2944 POSTING_READ(GEN8_GT_IER(0));
2945}
2946
2947static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
2948{
2949 struct drm_device *dev = dev_priv->dev;
2950 uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE |
2951 GEN8_PIPE_CDCLK_CRC_DONE |
2952 GEN8_PIPE_FIFO_UNDERRUN |
2953 GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
2954 uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK;
2955 int pipe;
2956 dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked;
2957 dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked;
2958 dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked;
2959
2960 for_each_pipe(pipe) {
2961 u32 tmp = I915_READ(GEN8_DE_PIPE_IIR(pipe));
2962 if (tmp)
2963 DRM_ERROR("Interrupt (%d) should have been masked in pre-install 0x%08x\n",
2964 pipe, tmp);
2965 I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
2966 I915_WRITE(GEN8_DE_PIPE_IER(pipe), de_pipe_enables);
2967 }
2968 POSTING_READ(GEN8_DE_PIPE_ISR(0));
2969
2970 I915_WRITE(GEN8_DE_PORT_IMR, ~GEN8_AUX_CHANNEL_A);
2971 I915_WRITE(GEN8_DE_PORT_IER, GEN8_AUX_CHANNEL_A);
2972 POSTING_READ(GEN8_DE_PORT_IER);
2973}
2974
2975static int gen8_irq_postinstall(struct drm_device *dev)
2976{
2977 struct drm_i915_private *dev_priv = dev->dev_private;
2978
2979 gen8_gt_irq_postinstall(dev_priv);
2980 gen8_de_irq_postinstall(dev_priv);
2981
2982 ibx_irq_postinstall(dev);
2983
2984 I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
2985 POSTING_READ(GEN8_MASTER_IRQ);
2986
2987 return 0;
2988}
2989
2990static void gen8_irq_uninstall(struct drm_device *dev)
2991{
2992 struct drm_i915_private *dev_priv = dev->dev_private;
2993 int pipe;
2994
2995 if (!dev_priv)
2996 return;
2997
2998 atomic_set(&dev_priv->irq_received, 0);
2999
3000 I915_WRITE(GEN8_MASTER_IRQ, 0);
3001
3002#define GEN8_IRQ_FINI_NDX(type, which) do { \
3003 I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \
3004 I915_WRITE(GEN8_##type##_IER(which), 0); \
3005 I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \
3006 } while (0)
3007
3008#define GEN8_IRQ_FINI(type) do { \
3009 I915_WRITE(GEN8_##type##_IMR, 0xffffffff); \
3010 I915_WRITE(GEN8_##type##_IER, 0); \
3011 I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \
3012 } while (0)
3013
3014 GEN8_IRQ_FINI_NDX(GT, 0);
3015 GEN8_IRQ_FINI_NDX(GT, 1);
3016 GEN8_IRQ_FINI_NDX(GT, 2);
3017 GEN8_IRQ_FINI_NDX(GT, 3);
3018
3019 for_each_pipe(pipe) {
3020 GEN8_IRQ_FINI_NDX(DE_PIPE, pipe);
3021 }
3022
3023 GEN8_IRQ_FINI(DE_PORT);
3024 GEN8_IRQ_FINI(DE_MISC);
3025 GEN8_IRQ_FINI(PCU);
3026#undef GEN8_IRQ_FINI
3027#undef GEN8_IRQ_FINI_NDX
3028
3029 POSTING_READ(GEN8_PCU_IIR);
3030}
3031
2633static void valleyview_irq_uninstall(struct drm_device *dev) 3032static void valleyview_irq_uninstall(struct drm_device *dev)
2634{ 3033{
2635 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 3034 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
@@ -3409,6 +3808,14 @@ void intel_irq_init(struct drm_device *dev)
3409 dev->driver->enable_vblank = valleyview_enable_vblank; 3808 dev->driver->enable_vblank = valleyview_enable_vblank;
3410 dev->driver->disable_vblank = valleyview_disable_vblank; 3809 dev->driver->disable_vblank = valleyview_disable_vblank;
3411 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup; 3810 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
3811 } else if (IS_GEN8(dev)) {
3812 dev->driver->irq_handler = gen8_irq_handler;
3813 dev->driver->irq_preinstall = gen8_irq_preinstall;
3814 dev->driver->irq_postinstall = gen8_irq_postinstall;
3815 dev->driver->irq_uninstall = gen8_irq_uninstall;
3816 dev->driver->enable_vblank = gen8_enable_vblank;
3817 dev->driver->disable_vblank = gen8_disable_vblank;
3818 dev_priv->display.hpd_irq_setup = ibx_hpd_irq_setup;
3412 } else if (HAS_PCH_SPLIT(dev)) { 3819 } else if (HAS_PCH_SPLIT(dev)) {
3413 dev->driver->irq_handler = ironlake_irq_handler; 3820 dev->driver->irq_handler = ironlake_irq_handler;
3414 dev->driver->irq_preinstall = ironlake_irq_preinstall; 3821 dev->driver->irq_preinstall = ironlake_irq_preinstall;