@@ -618,33 +618,25 @@ static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
618
618
619
619
/* raw reads, only for fast reads of display block, no need for forcewake etc. */
620
620
#define __raw_i915_read32 (dev_priv__ , reg__ ) readl((dev_priv__)->regs + (reg__))
621
- #define __raw_i915_read16 (dev_priv__ , reg__ ) readw((dev_priv__)->regs + (reg__))
622
621
623
622
static bool ilk_pipe_in_vblank_locked (struct drm_device * dev , enum pipe pipe )
624
623
{
625
624
struct drm_i915_private * dev_priv = dev -> dev_private ;
626
625
uint32_t status ;
627
-
628
- if (INTEL_INFO (dev )-> gen < 7 ) {
629
- status = pipe == PIPE_A ?
630
- DE_PIPEA_VBLANK :
631
- DE_PIPEB_VBLANK ;
626
+ int reg ;
627
+
628
+ if (INTEL_INFO (dev )-> gen >= 8 ) {
629
+ status = GEN8_PIPE_VBLANK ;
630
+ reg = GEN8_DE_PIPE_ISR (pipe );
631
+ } else if (INTEL_INFO (dev )-> gen >= 7 ) {
632
+ status = DE_PIPE_VBLANK_IVB (pipe );
633
+ reg = DEISR ;
632
634
} else {
633
- switch (pipe ) {
634
- default :
635
- case PIPE_A :
636
- status = DE_PIPEA_VBLANK_IVB ;
637
- break ;
638
- case PIPE_B :
639
- status = DE_PIPEB_VBLANK_IVB ;
640
- break ;
641
- case PIPE_C :
642
- status = DE_PIPEC_VBLANK_IVB ;
643
- break ;
644
- }
635
+ status = DE_PIPE_VBLANK (pipe );
636
+ reg = DEISR ;
645
637
}
646
638
647
- return __raw_i915_read32 (dev_priv , DEISR ) & status ;
639
+ return __raw_i915_read32 (dev_priv , reg ) & status ;
648
640
}
649
641
650
642
static int i915_get_crtc_scanoutpos (struct drm_device * dev , int pipe ,
@@ -702,7 +694,28 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
702
694
else
703
695
position = __raw_i915_read32 (dev_priv , PIPEDSL (pipe )) & DSL_LINEMASK_GEN3 ;
704
696
705
- if (HAS_PCH_SPLIT (dev )) {
697
+ if (HAS_DDI (dev )) {
698
+ /*
699
+ * On HSW HDMI outputs there seems to be a 2 line
700
+ * difference, whereas eDP has the normal 1 line
701
+ * difference that earlier platforms have. External
702
+ * DP is unknown. For now just check for the 2 line
703
+ * difference case on all output types on HSW+.
704
+ *
705
+ * This might misinterpret the scanline counter being
706
+ * one line too far along on eDP, but that's less
707
+ * dangerous than the alternative since that would lead
708
+ * the vblank timestamp code astray when it sees a
709
+ * scanline count before vblank_start during a vblank
710
+ * interrupt.
711
+ */
712
+ in_vbl = ilk_pipe_in_vblank_locked (dev , pipe );
713
+ if ((in_vbl && (position == vbl_start - 2 ||
714
+ position == vbl_start - 1 )) ||
715
+ (!in_vbl && (position == vbl_end - 2 ||
716
+ position == vbl_end - 1 )))
717
+ position = (position + 2 ) % vtotal ;
718
+ } else if (HAS_PCH_SPLIT (dev )) {
706
719
/*
707
720
* The scanline counter increments at the leading edge
708
721
* of hsync, ie. it completely misses the active portion
@@ -2769,10 +2782,9 @@ static void ibx_irq_postinstall(struct drm_device *dev)
2769
2782
return ;
2770
2783
2771
2784
if (HAS_PCH_IBX (dev )) {
2772
- mask = SDE_GMBUS | SDE_AUX_MASK | SDE_TRANSB_FIFO_UNDER |
2773
- SDE_TRANSA_FIFO_UNDER | SDE_POISON ;
2785
+ mask = SDE_GMBUS | SDE_AUX_MASK | SDE_POISON ;
2774
2786
} else {
2775
- mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT | SDE_ERROR_CPT ;
2787
+ mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT ;
2776
2788
2777
2789
I915_WRITE (SERR_INT , I915_READ (SERR_INT ));
2778
2790
}
@@ -2832,20 +2844,19 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
2832
2844
display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB |
2833
2845
DE_PCH_EVENT_IVB | DE_PLANEC_FLIP_DONE_IVB |
2834
2846
DE_PLANEB_FLIP_DONE_IVB |
2835
- DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB |
2836
- DE_ERR_INT_IVB );
2847
+ DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB );
2837
2848
extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB |
2838
- DE_PIPEA_VBLANK_IVB );
2849
+ DE_PIPEA_VBLANK_IVB | DE_ERR_INT_IVB );
2839
2850
2840
2851
I915_WRITE (GEN7_ERR_INT , I915_READ (GEN7_ERR_INT ));
2841
2852
} else {
2842
2853
display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
2843
2854
DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE |
2844
2855
DE_AUX_CHANNEL_A |
2845
- DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN |
2846
2856
DE_PIPEB_CRC_DONE | DE_PIPEA_CRC_DONE |
2847
2857
DE_POISON );
2848
- extra_mask = DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT ;
2858
+ extra_mask = DE_PIPEA_VBLANK | DE_PIPEB_VBLANK | DE_PCU_EVENT |
2859
+ DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN ;
2849
2860
}
2850
2861
2851
2862
dev_priv -> irq_mask = ~display_mask ;
@@ -2961,9 +2972,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
2961
2972
struct drm_device * dev = dev_priv -> dev ;
2962
2973
uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE |
2963
2974
GEN8_PIPE_CDCLK_CRC_DONE |
2964
- GEN8_PIPE_FIFO_UNDERRUN |
2965
2975
GEN8_DE_PIPE_IRQ_FAULT_ERRORS ;
2966
- uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK ;
2976
+ uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK |
2977
+ GEN8_PIPE_FIFO_UNDERRUN ;
2967
2978
int pipe ;
2968
2979
dev_priv -> de_irq_mask [PIPE_A ] = ~de_pipe_masked ;
2969
2980
dev_priv -> de_irq_mask [PIPE_B ] = ~de_pipe_masked ;
0 commit comments