diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-03-17 23:06:17 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-03-17 23:06:17 -0400 |
| commit | 218212722f681fb31b24749776984fd809eec2f2 (patch) | |
| tree | ae1a9dbc0f9c0242c6cdb2f7bccca03091be6484 | |
| parent | dcb99fd9b08cfe1afe426af4d8d3cbc429190f15 (diff) | |
| parent | 5c673b60a9b3b23486f4eda75c72e91d31d26a2b (diff) | |
Merge tag 'drm-intel-fixes-2014-03-17' of git://anongit.freedesktop.org/drm-intel into drm-fixes
Two 3.14 specific fixes, two cc: stable.
* tag 'drm-intel-fixes-2014-03-17' of git://anongit.freedesktop.org/drm-intel:
drm/i915: Don't enable display error interrupts from the start
drm/i915: Fix scanline counter fixup on BDW
drm/i915: Add a workaround for HSW scanline counter weirdness
drm/i915: Fix PSR programming
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 71 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 2 |
2 files changed, 42 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 9fec71175571..d554169ac592 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -618,33 +618,25 @@ static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) | |||
| 618 | 618 | ||
| 619 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ | 619 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ |
| 620 | #define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__)) | 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 | static bool ilk_pipe_in_vblank_locked(struct drm_device *dev, enum pipe pipe) | 622 | static bool ilk_pipe_in_vblank_locked(struct drm_device *dev, enum pipe pipe) |
| 624 | { | 623 | { |
| 625 | struct drm_i915_private *dev_priv = dev->dev_private; | 624 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 626 | uint32_t status; | 625 | uint32_t status; |
| 627 | 626 | int reg; | |
| 628 | if (INTEL_INFO(dev)->gen < 7) { | 627 | |
| 629 | status = pipe == PIPE_A ? | 628 | if (INTEL_INFO(dev)->gen >= 8) { |
| 630 | DE_PIPEA_VBLANK : | 629 | status = GEN8_PIPE_VBLANK; |
| 631 | DE_PIPEB_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 | } else { | 634 | } else { |
| 633 | switch (pipe) { | 635 | status = DE_PIPE_VBLANK(pipe); |
| 634 | default: | 636 | reg = DEISR; |
| 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 | } | ||
| 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 | static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | 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 | else | 694 | else |
| 703 | position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; | 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 | * The scanline counter increments at the leading edge | 720 | * The scanline counter increments at the leading edge |
| 708 | * of hsync, ie. it completely misses the active portion | 721 | * of hsync, ie. it completely misses the active portion |
| @@ -2769,10 +2782,9 @@ static void ibx_irq_postinstall(struct drm_device *dev) | |||
| 2769 | return; | 2782 | return; |
| 2770 | 2783 | ||
| 2771 | if (HAS_PCH_IBX(dev)) { | 2784 | if (HAS_PCH_IBX(dev)) { |
| 2772 | mask = SDE_GMBUS | SDE_AUX_MASK | SDE_TRANSB_FIFO_UNDER | | 2785 | mask = SDE_GMBUS | SDE_AUX_MASK | SDE_POISON; |
| 2773 | SDE_TRANSA_FIFO_UNDER | SDE_POISON; | ||
| 2774 | } else { | 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 | I915_WRITE(SERR_INT, I915_READ(SERR_INT)); | 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 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | | 2844 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | |
| 2833 | DE_PCH_EVENT_IVB | DE_PLANEC_FLIP_DONE_IVB | | 2845 | DE_PCH_EVENT_IVB | DE_PLANEC_FLIP_DONE_IVB | |
| 2834 | DE_PLANEB_FLIP_DONE_IVB | | 2846 | DE_PLANEB_FLIP_DONE_IVB | |
| 2835 | DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB | | 2847 | DE_PLANEA_FLIP_DONE_IVB | DE_AUX_CHANNEL_A_IVB); |
| 2836 | DE_ERR_INT_IVB); | ||
| 2837 | extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB | | 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 | I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); | 2851 | I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); |
| 2841 | } else { | 2852 | } else { |
| 2842 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | | 2853 | display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
| 2843 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | | 2854 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | |
| 2844 | DE_AUX_CHANNEL_A | | 2855 | DE_AUX_CHANNEL_A | |
| 2845 | DE_PIPEB_FIFO_UNDERRUN | DE_PIPEA_FIFO_UNDERRUN | | ||
| 2846 | DE_PIPEB_CRC_DONE | DE_PIPEA_CRC_DONE | | 2856 | DE_PIPEB_CRC_DONE | DE_PIPEA_CRC_DONE | |
| 2847 | DE_POISON); | 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 | dev_priv->irq_mask = ~display_mask; | 2862 | dev_priv->irq_mask = ~display_mask; |
| @@ -2961,9 +2972,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) | |||
| 2961 | struct drm_device *dev = dev_priv->dev; | 2972 | struct drm_device *dev = dev_priv->dev; |
| 2962 | uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE | | 2973 | uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE | |
| 2963 | GEN8_PIPE_CDCLK_CRC_DONE | | 2974 | GEN8_PIPE_CDCLK_CRC_DONE | |
| 2964 | GEN8_PIPE_FIFO_UNDERRUN | | ||
| 2965 | GEN8_DE_PIPE_IRQ_FAULT_ERRORS; | 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 | int pipe; | 2978 | int pipe; |
| 2968 | dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; | 2979 | dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; |
| 2969 | dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; | 2980 | dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 57552eb386b0..41bdac44dfc1 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1639,7 +1639,7 @@ static void intel_edp_psr_enable_source(struct intel_dp *intel_dp) | |||
| 1639 | val |= EDP_PSR_LINK_DISABLE; | 1639 | val |= EDP_PSR_LINK_DISABLE; |
| 1640 | 1640 | ||
| 1641 | I915_WRITE(EDP_PSR_CTL(dev), val | | 1641 | I915_WRITE(EDP_PSR_CTL(dev), val | |
| 1642 | IS_BROADWELL(dev) ? 0 : link_entry_time | | 1642 | (IS_BROADWELL(dev) ? 0 : link_entry_time) | |
| 1643 | max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | | 1643 | max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | |
| 1644 | idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | | 1644 | idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | |
| 1645 | EDP_PSR_ENABLE); | 1645 | EDP_PSR_ENABLE); |
