diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 91a31b3b9829..98686005dcf6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -677,7 +677,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
677 | int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; | 677 | int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; |
678 | int bpp, mode_rate; | 678 | int bpp, mode_rate; |
679 | static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; | 679 | static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; |
680 | int target_clock, link_avail, link_clock; | 680 | int link_avail, link_clock; |
681 | 681 | ||
682 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A) | 682 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A) |
683 | pipe_config->has_pch_encoder = true; | 683 | pipe_config->has_pch_encoder = true; |
@@ -694,8 +694,6 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
694 | intel_pch_panel_fitting(intel_crtc, pipe_config, | 694 | intel_pch_panel_fitting(intel_crtc, pipe_config, |
695 | intel_connector->panel.fitting_mode); | 695 | intel_connector->panel.fitting_mode); |
696 | } | 696 | } |
697 | /* We need to take the panel's fixed mode into account. */ | ||
698 | target_clock = adjusted_mode->clock; | ||
699 | 697 | ||
700 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) | 698 | if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) |
701 | return false; | 699 | return false; |
@@ -706,12 +704,12 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
706 | 704 | ||
707 | /* Walk through all bpp values. Luckily they're all nicely spaced with 2 | 705 | /* Walk through all bpp values. Luckily they're all nicely spaced with 2 |
708 | * bpc in between. */ | 706 | * bpc in between. */ |
709 | bpp = min_t(int, 8*3, pipe_config->pipe_bpp); | 707 | bpp = pipe_config->pipe_bpp; |
710 | if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp) | 708 | if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp) |
711 | bpp = min_t(int, bpp, dev_priv->vbt.edp_bpp); | 709 | bpp = min_t(int, bpp, dev_priv->vbt.edp_bpp); |
712 | 710 | ||
713 | for (; bpp >= 6*3; bpp -= 2*3) { | 711 | for (; bpp >= 6*3; bpp -= 2*3) { |
714 | mode_rate = intel_dp_link_required(target_clock, bpp); | 712 | mode_rate = intel_dp_link_required(adjusted_mode->clock, bpp); |
715 | 713 | ||
716 | for (clock = 0; clock <= max_clock; clock++) { | 714 | for (clock = 0; clock <= max_clock; clock++) { |
717 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { | 715 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { |
@@ -746,18 +744,17 @@ found: | |||
746 | 744 | ||
747 | intel_dp->link_bw = bws[clock]; | 745 | intel_dp->link_bw = bws[clock]; |
748 | intel_dp->lane_count = lane_count; | 746 | intel_dp->lane_count = lane_count; |
749 | adjusted_mode->clock = drm_dp_bw_code_to_link_rate(intel_dp->link_bw); | ||
750 | pipe_config->pipe_bpp = bpp; | 747 | pipe_config->pipe_bpp = bpp; |
751 | pipe_config->pixel_target_clock = target_clock; | 748 | pipe_config->port_clock = drm_dp_bw_code_to_link_rate(intel_dp->link_bw); |
752 | 749 | ||
753 | DRM_DEBUG_KMS("DP link bw %02x lane count %d clock %d bpp %d\n", | 750 | DRM_DEBUG_KMS("DP link bw %02x lane count %d clock %d bpp %d\n", |
754 | intel_dp->link_bw, intel_dp->lane_count, | 751 | intel_dp->link_bw, intel_dp->lane_count, |
755 | adjusted_mode->clock, bpp); | 752 | pipe_config->port_clock, bpp); |
756 | DRM_DEBUG_KMS("DP link bw required %i available %i\n", | 753 | DRM_DEBUG_KMS("DP link bw required %i available %i\n", |
757 | mode_rate, link_avail); | 754 | mode_rate, link_avail); |
758 | 755 | ||
759 | intel_link_compute_m_n(bpp, lane_count, | 756 | intel_link_compute_m_n(bpp, lane_count, |
760 | target_clock, adjusted_mode->clock, | 757 | adjusted_mode->clock, pipe_config->port_clock, |
761 | &pipe_config->dp_m_n); | 758 | &pipe_config->dp_m_n); |
762 | 759 | ||
763 | intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw); | 760 | intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw); |
@@ -780,24 +777,28 @@ void intel_dp_init_link_config(struct intel_dp *intel_dp) | |||
780 | } | 777 | } |
781 | } | 778 | } |
782 | 779 | ||
783 | static void ironlake_set_pll_edp(struct drm_crtc *crtc, int clock) | 780 | static void ironlake_set_pll_cpu_edp(struct intel_dp *intel_dp) |
784 | { | 781 | { |
785 | struct drm_device *dev = crtc->dev; | 782 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
783 | struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc); | ||
784 | struct drm_device *dev = crtc->base.dev; | ||
786 | struct drm_i915_private *dev_priv = dev->dev_private; | 785 | struct drm_i915_private *dev_priv = dev->dev_private; |
787 | u32 dpa_ctl; | 786 | u32 dpa_ctl; |
788 | 787 | ||
789 | DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", clock); | 788 | DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", crtc->config.port_clock); |
790 | dpa_ctl = I915_READ(DP_A); | 789 | dpa_ctl = I915_READ(DP_A); |
791 | dpa_ctl &= ~DP_PLL_FREQ_MASK; | 790 | dpa_ctl &= ~DP_PLL_FREQ_MASK; |
792 | 791 | ||
793 | if (clock < 200000) { | 792 | if (crtc->config.port_clock == 162000) { |
794 | /* For a long time we've carried around a ILK-DevA w/a for the | 793 | /* For a long time we've carried around a ILK-DevA w/a for the |
795 | * 160MHz clock. If we're really unlucky, it's still required. | 794 | * 160MHz clock. If we're really unlucky, it's still required. |
796 | */ | 795 | */ |
797 | DRM_DEBUG_KMS("160MHz cpu eDP clock, might need ilk devA w/a\n"); | 796 | DRM_DEBUG_KMS("160MHz cpu eDP clock, might need ilk devA w/a\n"); |
798 | dpa_ctl |= DP_PLL_FREQ_160MHZ; | 797 | dpa_ctl |= DP_PLL_FREQ_160MHZ; |
798 | intel_dp->DP |= DP_PLL_FREQ_160MHZ; | ||
799 | } else { | 799 | } else { |
800 | dpa_ctl |= DP_PLL_FREQ_270MHZ; | 800 | dpa_ctl |= DP_PLL_FREQ_270MHZ; |
801 | intel_dp->DP |= DP_PLL_FREQ_270MHZ; | ||
801 | } | 802 | } |
802 | 803 | ||
803 | I915_WRITE(DP_A, dpa_ctl); | 804 | I915_WRITE(DP_A, dpa_ctl); |
@@ -814,8 +815,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
814 | struct drm_i915_private *dev_priv = dev->dev_private; | 815 | struct drm_i915_private *dev_priv = dev->dev_private; |
815 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 816 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); |
816 | enum port port = dp_to_dig_port(intel_dp)->port; | 817 | enum port port = dp_to_dig_port(intel_dp)->port; |
817 | struct drm_crtc *crtc = encoder->crtc; | 818 | struct intel_crtc *crtc = to_intel_crtc(encoder->crtc); |
818 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
819 | 819 | ||
820 | /* | 820 | /* |
821 | * There are four kinds of DP registers: | 821 | * There are four kinds of DP registers: |
@@ -845,7 +845,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
845 | 845 | ||
846 | if (intel_dp->has_audio) { | 846 | if (intel_dp->has_audio) { |
847 | DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", | 847 | DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", |
848 | pipe_name(intel_crtc->pipe)); | 848 | pipe_name(crtc->pipe)); |
849 | intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE; | 849 | intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE; |
850 | intel_write_eld(encoder, adjusted_mode); | 850 | intel_write_eld(encoder, adjusted_mode); |
851 | } | 851 | } |
@@ -864,13 +864,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
864 | if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) | 864 | if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) |
865 | intel_dp->DP |= DP_ENHANCED_FRAMING; | 865 | intel_dp->DP |= DP_ENHANCED_FRAMING; |
866 | 866 | ||
867 | intel_dp->DP |= intel_crtc->pipe << 29; | 867 | intel_dp->DP |= crtc->pipe << 29; |
868 | |||
869 | /* don't miss out required setting for eDP */ | ||
870 | if (adjusted_mode->clock < 200000) | ||
871 | intel_dp->DP |= DP_PLL_FREQ_160MHZ; | ||
872 | else | ||
873 | intel_dp->DP |= DP_PLL_FREQ_270MHZ; | ||
874 | } else if (!HAS_PCH_CPT(dev) || port == PORT_A) { | 868 | } else if (!HAS_PCH_CPT(dev) || port == PORT_A) { |
875 | if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev)) | 869 | if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev)) |
876 | intel_dp->DP |= intel_dp->color_range; | 870 | intel_dp->DP |= intel_dp->color_range; |
@@ -884,22 +878,14 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
884 | if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) | 878 | if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) |
885 | intel_dp->DP |= DP_ENHANCED_FRAMING; | 879 | intel_dp->DP |= DP_ENHANCED_FRAMING; |
886 | 880 | ||
887 | if (intel_crtc->pipe == 1) | 881 | if (crtc->pipe == 1) |
888 | intel_dp->DP |= DP_PIPEB_SELECT; | 882 | intel_dp->DP |= DP_PIPEB_SELECT; |
889 | |||
890 | if (port == PORT_A && !IS_VALLEYVIEW(dev)) { | ||
891 | /* don't miss out required setting for eDP */ | ||
892 | if (adjusted_mode->clock < 200000) | ||
893 | intel_dp->DP |= DP_PLL_FREQ_160MHZ; | ||
894 | else | ||
895 | intel_dp->DP |= DP_PLL_FREQ_270MHZ; | ||
896 | } | ||
897 | } else { | 883 | } else { |
898 | intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; | 884 | intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; |
899 | } | 885 | } |
900 | 886 | ||
901 | if (port == PORT_A && !IS_VALLEYVIEW(dev)) | 887 | if (port == PORT_A && !IS_VALLEYVIEW(dev)) |
902 | ironlake_set_pll_edp(crtc, adjusted_mode->clock); | 888 | ironlake_set_pll_cpu_edp(intel_dp); |
903 | } | 889 | } |
904 | 890 | ||
905 | #define IDLE_ON_MASK (PP_ON | 0 | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK) | 891 | #define IDLE_ON_MASK (PP_ON | 0 | PP_SEQUENCE_MASK | 0 | PP_SEQUENCE_STATE_MASK) |