aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ddi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c482
1 files changed, 393 insertions, 89 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 5186cd7075f9..ad11540ac436 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -642,7 +642,7 @@ skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
642static const struct ddi_buf_trans * 642static const struct ddi_buf_trans *
643kbl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) 643kbl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
644{ 644{
645 if (IS_KBL_ULX(dev_priv)) { 645 if (IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
646 *n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp); 646 *n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp);
647 return kbl_y_ddi_translations_dp; 647 return kbl_y_ddi_translations_dp;
648 } else if (IS_KBL_ULT(dev_priv) || IS_CFL_ULT(dev_priv)) { 648 } else if (IS_KBL_ULT(dev_priv) || IS_CFL_ULT(dev_priv)) {
@@ -658,7 +658,7 @@ static const struct ddi_buf_trans *
658skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries) 658skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
659{ 659{
660 if (dev_priv->vbt.edp.low_vswing) { 660 if (dev_priv->vbt.edp.low_vswing) {
661 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) { 661 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
662 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp); 662 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
663 return skl_y_ddi_translations_edp; 663 return skl_y_ddi_translations_edp;
664 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv) || 664 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv) ||
@@ -680,7 +680,7 @@ skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
680static const struct ddi_buf_trans * 680static const struct ddi_buf_trans *
681skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) 681skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries)
682{ 682{
683 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) { 683 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
684 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi); 684 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
685 return skl_y_ddi_translations_hdmi; 685 return skl_y_ddi_translations_hdmi;
686 } else { 686 } else {
@@ -1060,10 +1060,10 @@ static uint32_t hsw_pll_to_ddi_pll_sel(const struct intel_shared_dpll *pll)
1060} 1060}
1061 1061
1062static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder, 1062static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder,
1063 const struct intel_shared_dpll *pll) 1063 const struct intel_crtc_state *crtc_state)
1064{ 1064{
1065 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 1065 const struct intel_shared_dpll *pll = crtc_state->shared_dpll;
1066 int clock = crtc->config->port_clock; 1066 int clock = crtc_state->port_clock;
1067 const enum intel_dpll_id id = pll->info->id; 1067 const enum intel_dpll_id id = pll->info->id;
1068 1068
1069 switch (id) { 1069 switch (id) {
@@ -1517,7 +1517,7 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
1517 else 1517 else
1518 dotclock = pipe_config->port_clock; 1518 dotclock = pipe_config->port_clock;
1519 1519
1520 if (pipe_config->ycbcr420) 1520 if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
1521 dotclock *= 2; 1521 dotclock *= 2;
1522 1522
1523 if (pipe_config->pixel_multiplier) 1523 if (pipe_config->pixel_multiplier)
@@ -1737,16 +1737,16 @@ static void intel_ddi_clock_get(struct intel_encoder *encoder,
1737{ 1737{
1738 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1738 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1739 1739
1740 if (INTEL_GEN(dev_priv) <= 8) 1740 if (IS_ICELAKE(dev_priv))
1741 hsw_ddi_clock_get(encoder, pipe_config); 1741 icl_ddi_clock_get(encoder, pipe_config);
1742 else if (IS_GEN9_BC(dev_priv))
1743 skl_ddi_clock_get(encoder, pipe_config);
1744 else if (IS_GEN9_LP(dev_priv))
1745 bxt_ddi_clock_get(encoder, pipe_config);
1746 else if (IS_CANNONLAKE(dev_priv)) 1742 else if (IS_CANNONLAKE(dev_priv))
1747 cnl_ddi_clock_get(encoder, pipe_config); 1743 cnl_ddi_clock_get(encoder, pipe_config);
1748 else if (IS_ICELAKE(dev_priv)) 1744 else if (IS_GEN9_LP(dev_priv))
1749 icl_ddi_clock_get(encoder, pipe_config); 1745 bxt_ddi_clock_get(encoder, pipe_config);
1746 else if (IS_GEN9_BC(dev_priv))
1747 skl_ddi_clock_get(encoder, pipe_config);
1748 else if (INTEL_GEN(dev_priv) <= 8)
1749 hsw_ddi_clock_get(encoder, pipe_config);
1750} 1750}
1751 1751
1752void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state) 1752void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
@@ -1784,6 +1784,13 @@ void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
1784 break; 1784 break;
1785 } 1785 }
1786 1786
1787 /*
1788 * As per DP 1.2 spec section 2.3.4.3 while sending
1789 * YCBCR 444 signals we should program MSA MISC1/0 fields with
1790 * colorspace information. The output colorspace encoding is BT601.
1791 */
1792 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
1793 temp |= TRANS_MSA_SAMPLING_444 | TRANS_MSA_CLRSP_YCBCR;
1787 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp); 1794 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1788} 1795}
1789 1796
@@ -1998,24 +2005,24 @@ out:
1998 return ret; 2005 return ret;
1999} 2006}
2000 2007
2001bool intel_ddi_get_hw_state(struct intel_encoder *encoder, 2008static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,
2002 enum pipe *pipe) 2009 u8 *pipe_mask, bool *is_dp_mst)
2003{ 2010{
2004 struct drm_device *dev = encoder->base.dev; 2011 struct drm_device *dev = encoder->base.dev;
2005 struct drm_i915_private *dev_priv = to_i915(dev); 2012 struct drm_i915_private *dev_priv = to_i915(dev);
2006 enum port port = encoder->port; 2013 enum port port = encoder->port;
2007 enum pipe p; 2014 enum pipe p;
2008 u32 tmp; 2015 u32 tmp;
2009 bool ret; 2016 u8 mst_pipe_mask;
2017
2018 *pipe_mask = 0;
2019 *is_dp_mst = false;
2010 2020
2011 if (!intel_display_power_get_if_enabled(dev_priv, 2021 if (!intel_display_power_get_if_enabled(dev_priv,
2012 encoder->power_domain)) 2022 encoder->power_domain))
2013 return false; 2023 return;
2014
2015 ret = false;
2016 2024
2017 tmp = I915_READ(DDI_BUF_CTL(port)); 2025 tmp = I915_READ(DDI_BUF_CTL(port));
2018
2019 if (!(tmp & DDI_BUF_CTL_ENABLE)) 2026 if (!(tmp & DDI_BUF_CTL_ENABLE))
2020 goto out; 2027 goto out;
2021 2028
@@ -2023,44 +2030,58 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
2023 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP)); 2030 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
2024 2031
2025 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) { 2032 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
2033 default:
2034 MISSING_CASE(tmp & TRANS_DDI_EDP_INPUT_MASK);
2035 /* fallthrough */
2026 case TRANS_DDI_EDP_INPUT_A_ON: 2036 case TRANS_DDI_EDP_INPUT_A_ON:
2027 case TRANS_DDI_EDP_INPUT_A_ONOFF: 2037 case TRANS_DDI_EDP_INPUT_A_ONOFF:
2028 *pipe = PIPE_A; 2038 *pipe_mask = BIT(PIPE_A);
2029 break; 2039 break;
2030 case TRANS_DDI_EDP_INPUT_B_ONOFF: 2040 case TRANS_DDI_EDP_INPUT_B_ONOFF:
2031 *pipe = PIPE_B; 2041 *pipe_mask = BIT(PIPE_B);
2032 break; 2042 break;
2033 case TRANS_DDI_EDP_INPUT_C_ONOFF: 2043 case TRANS_DDI_EDP_INPUT_C_ONOFF:
2034 *pipe = PIPE_C; 2044 *pipe_mask = BIT(PIPE_C);
2035 break; 2045 break;
2036 } 2046 }
2037 2047
2038 ret = true;
2039
2040 goto out; 2048 goto out;
2041 } 2049 }
2042 2050
2051 mst_pipe_mask = 0;
2043 for_each_pipe(dev_priv, p) { 2052 for_each_pipe(dev_priv, p) {
2044 enum transcoder cpu_transcoder = (enum transcoder) p; 2053 enum transcoder cpu_transcoder = (enum transcoder)p;
2045 2054
2046 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 2055 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
2047 2056
2048 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) { 2057 if ((tmp & TRANS_DDI_PORT_MASK) != TRANS_DDI_SELECT_PORT(port))
2049 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == 2058 continue;
2050 TRANS_DDI_MODE_SELECT_DP_MST)
2051 goto out;
2052 2059
2053 *pipe = p; 2060 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
2054 ret = true; 2061 TRANS_DDI_MODE_SELECT_DP_MST)
2062 mst_pipe_mask |= BIT(p);
2055 2063
2056 goto out; 2064 *pipe_mask |= BIT(p);
2057 }
2058 } 2065 }
2059 2066
2060 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port)); 2067 if (!*pipe_mask)
2068 DRM_DEBUG_KMS("No pipe for ddi port %c found\n",
2069 port_name(port));
2070
2071 if (!mst_pipe_mask && hweight8(*pipe_mask) > 1) {
2072 DRM_DEBUG_KMS("Multiple pipes for non DP-MST port %c (pipe_mask %02x)\n",
2073 port_name(port), *pipe_mask);
2074 *pipe_mask = BIT(ffs(*pipe_mask) - 1);
2075 }
2076
2077 if (mst_pipe_mask && mst_pipe_mask != *pipe_mask)
2078 DRM_DEBUG_KMS("Conflicting MST and non-MST encoders for port %c (pipe_mask %02x mst_pipe_mask %02x)\n",
2079 port_name(port), *pipe_mask, mst_pipe_mask);
2080 else
2081 *is_dp_mst = mst_pipe_mask;
2061 2082
2062out: 2083out:
2063 if (ret && IS_GEN9_LP(dev_priv)) { 2084 if (*pipe_mask && IS_GEN9_LP(dev_priv)) {
2064 tmp = I915_READ(BXT_PHY_CTL(port)); 2085 tmp = I915_READ(BXT_PHY_CTL(port));
2065 if ((tmp & (BXT_PHY_CMNLANE_POWERDOWN_ACK | 2086 if ((tmp & (BXT_PHY_CMNLANE_POWERDOWN_ACK |
2066 BXT_PHY_LANE_POWERDOWN_ACK | 2087 BXT_PHY_LANE_POWERDOWN_ACK |
@@ -2070,12 +2091,26 @@ out:
2070 } 2091 }
2071 2092
2072 intel_display_power_put(dev_priv, encoder->power_domain); 2093 intel_display_power_put(dev_priv, encoder->power_domain);
2094}
2073 2095
2074 return ret; 2096bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
2097 enum pipe *pipe)
2098{
2099 u8 pipe_mask;
2100 bool is_mst;
2101
2102 intel_ddi_get_encoder_pipes(encoder, &pipe_mask, &is_mst);
2103
2104 if (is_mst || !pipe_mask)
2105 return false;
2106
2107 *pipe = ffs(pipe_mask) - 1;
2108
2109 return true;
2075} 2110}
2076 2111
2077static inline enum intel_display_power_domain 2112static inline enum intel_display_power_domain
2078intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp) 2113intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
2079{ 2114{
2080 /* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with 2115 /* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
2081 * DC states enabled at the same time, while for driver initiated AUX 2116 * DC states enabled at the same time, while for driver initiated AUX
@@ -2089,13 +2124,14 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
2089 * Note that PSR is enabled only on Port A even though this function 2124 * Note that PSR is enabled only on Port A even though this function
2090 * returns the correct domain for other ports too. 2125 * returns the correct domain for other ports too.
2091 */ 2126 */
2092 return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A : 2127 return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
2093 intel_dp->aux_power_domain; 2128 intel_aux_power_domain(dig_port);
2094} 2129}
2095 2130
2096static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder, 2131static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
2097 struct intel_crtc_state *crtc_state) 2132 struct intel_crtc_state *crtc_state)
2098{ 2133{
2134 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2099 struct intel_digital_port *dig_port; 2135 struct intel_digital_port *dig_port;
2100 u64 domains; 2136 u64 domains;
2101 2137
@@ -2110,12 +2146,13 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
2110 dig_port = enc_to_dig_port(&encoder->base); 2146 dig_port = enc_to_dig_port(&encoder->base);
2111 domains = BIT_ULL(dig_port->ddi_io_power_domain); 2147 domains = BIT_ULL(dig_port->ddi_io_power_domain);
2112 2148
2113 /* AUX power is only needed for (e)DP mode, not for HDMI. */ 2149 /*
2114 if (intel_crtc_has_dp_encoder(crtc_state)) { 2150 * AUX power is only needed for (e)DP mode, and for HDMI mode on TC
2115 struct intel_dp *intel_dp = &dig_port->dp; 2151 * ports.
2116 2152 */
2117 domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp)); 2153 if (intel_crtc_has_dp_encoder(crtc_state) ||
2118 } 2154 intel_port_is_tc(dev_priv, encoder->port))
2155 domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
2119 2156
2120 return domains; 2157 return domains;
2121} 2158}
@@ -2813,12 +2850,59 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
2813 } 2850 }
2814} 2851}
2815 2852
2853void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)
2854{
2855 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2856 u32 val;
2857 enum port port = encoder->port;
2858 bool clk_enabled;
2859
2860 /*
2861 * In case of DP MST, we sanitize the primary encoder only, not the
2862 * virtual ones.
2863 */
2864 if (encoder->type == INTEL_OUTPUT_DP_MST)
2865 return;
2866
2867 val = I915_READ(DPCLKA_CFGCR0_ICL);
2868 clk_enabled = !(val & icl_dpclka_cfgcr0_clk_off(dev_priv, port));
2869
2870 if (!encoder->base.crtc && intel_encoder_is_dp(encoder)) {
2871 u8 pipe_mask;
2872 bool is_mst;
2873
2874 intel_ddi_get_encoder_pipes(encoder, &pipe_mask, &is_mst);
2875 /*
2876 * In the unlikely case that BIOS enables DP in MST mode, just
2877 * warn since our MST HW readout is incomplete.
2878 */
2879 if (WARN_ON(is_mst))
2880 return;
2881 }
2882
2883 if (clk_enabled == !!encoder->base.crtc)
2884 return;
2885
2886 /*
2887 * Punt on the case now where clock is disabled, but the encoder is
2888 * enabled, something else is really broken then.
2889 */
2890 if (WARN_ON(!clk_enabled))
2891 return;
2892
2893 DRM_NOTE("Port %c is disabled but it has a mapped PLL, unmap it\n",
2894 port_name(port));
2895 val |= icl_dpclka_cfgcr0_clk_off(dev_priv, port);
2896 I915_WRITE(DPCLKA_CFGCR0_ICL, val);
2897}
2898
2816static void intel_ddi_clk_select(struct intel_encoder *encoder, 2899static void intel_ddi_clk_select(struct intel_encoder *encoder,
2817 const struct intel_shared_dpll *pll) 2900 const struct intel_crtc_state *crtc_state)
2818{ 2901{
2819 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2902 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2820 enum port port = encoder->port; 2903 enum port port = encoder->port;
2821 uint32_t val; 2904 uint32_t val;
2905 const struct intel_shared_dpll *pll = crtc_state->shared_dpll;
2822 2906
2823 if (WARN_ON(!pll)) 2907 if (WARN_ON(!pll))
2824 return; 2908 return;
@@ -2828,7 +2912,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder,
2828 if (IS_ICELAKE(dev_priv)) { 2912 if (IS_ICELAKE(dev_priv)) {
2829 if (!intel_port_is_combophy(dev_priv, port)) 2913 if (!intel_port_is_combophy(dev_priv, port))
2830 I915_WRITE(DDI_CLK_SEL(port), 2914 I915_WRITE(DDI_CLK_SEL(port),
2831 icl_pll_to_ddi_pll_sel(encoder, pll)); 2915 icl_pll_to_ddi_pll_sel(encoder, crtc_state));
2832 } else if (IS_CANNONLAKE(dev_priv)) { 2916 } else if (IS_CANNONLAKE(dev_priv)) {
2833 /* Configure DPCLKA_CFGCR0 to map the DPLL to the DDI. */ 2917 /* Configure DPCLKA_CFGCR0 to map the DPLL to the DDI. */
2834 val = I915_READ(DPCLKA_CFGCR0); 2918 val = I915_READ(DPCLKA_CFGCR0);
@@ -2881,6 +2965,137 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
2881 } 2965 }
2882} 2966}
2883 2967
2968static void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port)
2969{
2970 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
2971 enum port port = dig_port->base.port;
2972 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
2973 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
2974 u32 val;
2975 int i;
2976
2977 if (tc_port == PORT_TC_NONE)
2978 return;
2979
2980 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
2981 val = I915_READ(mg_regs[i]);
2982 val |= MG_DP_MODE_CFG_TR2PWR_GATING |
2983 MG_DP_MODE_CFG_TRPWR_GATING |
2984 MG_DP_MODE_CFG_CLNPWR_GATING |
2985 MG_DP_MODE_CFG_DIGPWR_GATING |
2986 MG_DP_MODE_CFG_GAONPWR_GATING;
2987 I915_WRITE(mg_regs[i], val);
2988 }
2989
2990 val = I915_READ(MG_MISC_SUS0(tc_port));
2991 val |= MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE(3) |
2992 MG_MISC_SUS0_CFG_TR2PWR_GATING |
2993 MG_MISC_SUS0_CFG_CL2PWR_GATING |
2994 MG_MISC_SUS0_CFG_GAONPWR_GATING |
2995 MG_MISC_SUS0_CFG_TRPWR_GATING |
2996 MG_MISC_SUS0_CFG_CL1PWR_GATING |
2997 MG_MISC_SUS0_CFG_DGPWR_GATING;
2998 I915_WRITE(MG_MISC_SUS0(tc_port), val);
2999}
3000
3001static void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port)
3002{
3003 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
3004 enum port port = dig_port->base.port;
3005 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3006 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
3007 u32 val;
3008 int i;
3009
3010 if (tc_port == PORT_TC_NONE)
3011 return;
3012
3013 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
3014 val = I915_READ(mg_regs[i]);
3015 val &= ~(MG_DP_MODE_CFG_TR2PWR_GATING |
3016 MG_DP_MODE_CFG_TRPWR_GATING |
3017 MG_DP_MODE_CFG_CLNPWR_GATING |
3018 MG_DP_MODE_CFG_DIGPWR_GATING |
3019 MG_DP_MODE_CFG_GAONPWR_GATING);
3020 I915_WRITE(mg_regs[i], val);
3021 }
3022
3023 val = I915_READ(MG_MISC_SUS0(tc_port));
3024 val &= ~(MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE_MASK |
3025 MG_MISC_SUS0_CFG_TR2PWR_GATING |
3026 MG_MISC_SUS0_CFG_CL2PWR_GATING |
3027 MG_MISC_SUS0_CFG_GAONPWR_GATING |
3028 MG_MISC_SUS0_CFG_TRPWR_GATING |
3029 MG_MISC_SUS0_CFG_CL1PWR_GATING |
3030 MG_MISC_SUS0_CFG_DGPWR_GATING);
3031 I915_WRITE(MG_MISC_SUS0(tc_port), val);
3032}
3033
3034static void icl_program_mg_dp_mode(struct intel_digital_port *intel_dig_port)
3035{
3036 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
3037 enum port port = intel_dig_port->base.port;
3038 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3039 u32 ln0, ln1, lane_info;
3040
3041 if (tc_port == PORT_TC_NONE || intel_dig_port->tc_type == TC_PORT_TBT)
3042 return;
3043
3044 ln0 = I915_READ(MG_DP_MODE(port, 0));
3045 ln1 = I915_READ(MG_DP_MODE(port, 1));
3046
3047 switch (intel_dig_port->tc_type) {
3048 case TC_PORT_TYPEC:
3049 ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
3050 ln1 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
3051
3052 lane_info = (I915_READ(PORT_TX_DFLEXDPSP) &
3053 DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
3054 DP_LANE_ASSIGNMENT_SHIFT(tc_port);
3055
3056 switch (lane_info) {
3057 case 0x1:
3058 case 0x4:
3059 break;
3060 case 0x2:
3061 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE;
3062 break;
3063 case 0x3:
3064 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
3065 MG_DP_MODE_CFG_DP_X2_MODE;
3066 break;
3067 case 0x8:
3068 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE;
3069 break;
3070 case 0xC:
3071 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
3072 MG_DP_MODE_CFG_DP_X2_MODE;
3073 break;
3074 case 0xF:
3075 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
3076 MG_DP_MODE_CFG_DP_X2_MODE;
3077 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
3078 MG_DP_MODE_CFG_DP_X2_MODE;
3079 break;
3080 default:
3081 MISSING_CASE(lane_info);
3082 }
3083 break;
3084
3085 case TC_PORT_LEGACY:
3086 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
3087 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
3088 break;
3089
3090 default:
3091 MISSING_CASE(intel_dig_port->tc_type);
3092 return;
3093 }
3094
3095 I915_WRITE(MG_DP_MODE(port, 0), ln0);
3096 I915_WRITE(MG_DP_MODE(port, 1), ln1);
3097}
3098
2884static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, 3099static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2885 const struct intel_crtc_state *crtc_state, 3100 const struct intel_crtc_state *crtc_state,
2886 const struct drm_connector_state *conn_state) 3101 const struct drm_connector_state *conn_state)
@@ -2894,19 +3109,16 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2894 3109
2895 WARN_ON(is_mst && (port == PORT_A || port == PORT_E)); 3110 WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
2896 3111
2897 intel_display_power_get(dev_priv,
2898 intel_ddi_main_link_aux_domain(intel_dp));
2899
2900 intel_dp_set_link_params(intel_dp, crtc_state->port_clock, 3112 intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
2901 crtc_state->lane_count, is_mst); 3113 crtc_state->lane_count, is_mst);
2902 3114
2903 intel_edp_panel_on(intel_dp); 3115 intel_edp_panel_on(intel_dp);
2904 3116
2905 intel_ddi_clk_select(encoder, crtc_state->shared_dpll); 3117 intel_ddi_clk_select(encoder, crtc_state);
2906 3118
2907 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain); 3119 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2908 3120
2909 icl_program_mg_dp_mode(intel_dp); 3121 icl_program_mg_dp_mode(dig_port);
2910 icl_disable_phy_clock_gating(dig_port); 3122 icl_disable_phy_clock_gating(dig_port);
2911 3123
2912 if (IS_ICELAKE(dev_priv)) 3124 if (IS_ICELAKE(dev_priv))
@@ -2944,10 +3156,13 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2944 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 3156 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2945 3157
2946 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true); 3158 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
2947 intel_ddi_clk_select(encoder, crtc_state->shared_dpll); 3159 intel_ddi_clk_select(encoder, crtc_state);
2948 3160
2949 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain); 3161 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2950 3162
3163 icl_program_mg_dp_mode(dig_port);
3164 icl_disable_phy_clock_gating(dig_port);
3165
2951 if (IS_ICELAKE(dev_priv)) 3166 if (IS_ICELAKE(dev_priv))
2952 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock, 3167 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock,
2953 level, INTEL_OUTPUT_HDMI); 3168 level, INTEL_OUTPUT_HDMI);
@@ -2958,12 +3173,14 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2958 else 3173 else
2959 intel_prepare_hdmi_ddi_buffers(encoder, level); 3174 intel_prepare_hdmi_ddi_buffers(encoder, level);
2960 3175
3176 icl_enable_phy_clock_gating(dig_port);
3177
2961 if (IS_GEN9_BC(dev_priv)) 3178 if (IS_GEN9_BC(dev_priv))
2962 skl_ddi_set_iboost(encoder, level, INTEL_OUTPUT_HDMI); 3179 skl_ddi_set_iboost(encoder, level, INTEL_OUTPUT_HDMI);
2963 3180
2964 intel_ddi_enable_pipe_clock(crtc_state); 3181 intel_ddi_enable_pipe_clock(crtc_state);
2965 3182
2966 intel_dig_port->set_infoframes(&encoder->base, 3183 intel_dig_port->set_infoframes(encoder,
2967 crtc_state->has_infoframe, 3184 crtc_state->has_infoframe,
2968 crtc_state, conn_state); 3185 crtc_state, conn_state);
2969} 3186}
@@ -2993,10 +3210,22 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder,
2993 3210
2994 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); 3211 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
2995 3212
2996 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 3213 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2997 intel_ddi_pre_enable_hdmi(encoder, crtc_state, conn_state); 3214 intel_ddi_pre_enable_hdmi(encoder, crtc_state, conn_state);
2998 else 3215 } else {
3216 struct intel_lspcon *lspcon =
3217 enc_to_intel_lspcon(&encoder->base);
3218
2999 intel_ddi_pre_enable_dp(encoder, crtc_state, conn_state); 3219 intel_ddi_pre_enable_dp(encoder, crtc_state, conn_state);
3220 if (lspcon->active) {
3221 struct intel_digital_port *dig_port =
3222 enc_to_dig_port(&encoder->base);
3223
3224 dig_port->set_infoframes(encoder,
3225 crtc_state->has_infoframe,
3226 crtc_state, conn_state);
3227 }
3228 }
3000} 3229}
3001 3230
3002static void intel_disable_ddi_buf(struct intel_encoder *encoder) 3231static void intel_disable_ddi_buf(struct intel_encoder *encoder)
@@ -3049,9 +3278,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
3049 intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain); 3278 intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
3050 3279
3051 intel_ddi_clk_disable(encoder); 3280 intel_ddi_clk_disable(encoder);
3052
3053 intel_display_power_put(dev_priv,
3054 intel_ddi_main_link_aux_domain(intel_dp));
3055} 3281}
3056 3282
3057static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder, 3283static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3062,7 +3288,7 @@ static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
3062 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 3288 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3063 struct intel_hdmi *intel_hdmi = &dig_port->hdmi; 3289 struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
3064 3290
3065 dig_port->set_infoframes(&encoder->base, false, 3291 dig_port->set_infoframes(encoder, false,
3066 old_crtc_state, old_conn_state); 3292 old_crtc_state, old_conn_state);
3067 3293
3068 intel_ddi_disable_pipe_clock(old_crtc_state); 3294 intel_ddi_disable_pipe_clock(old_crtc_state);
@@ -3154,6 +3380,26 @@ static void intel_enable_ddi_dp(struct intel_encoder *encoder,
3154 intel_audio_codec_enable(encoder, crtc_state, conn_state); 3380 intel_audio_codec_enable(encoder, crtc_state, conn_state);
3155} 3381}
3156 3382
3383static i915_reg_t
3384gen9_chicken_trans_reg_by_port(struct drm_i915_private *dev_priv,
3385 enum port port)
3386{
3387 static const i915_reg_t regs[] = {
3388 [PORT_A] = CHICKEN_TRANS_EDP,
3389 [PORT_B] = CHICKEN_TRANS_A,
3390 [PORT_C] = CHICKEN_TRANS_B,
3391 [PORT_D] = CHICKEN_TRANS_C,
3392 [PORT_E] = CHICKEN_TRANS_A,
3393 };
3394
3395 WARN_ON(INTEL_GEN(dev_priv) < 9);
3396
3397 if (WARN_ON(port < PORT_A || port > PORT_E))
3398 port = PORT_A;
3399
3400 return regs[port];
3401}
3402
3157static void intel_enable_ddi_hdmi(struct intel_encoder *encoder, 3403static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3158 const struct intel_crtc_state *crtc_state, 3404 const struct intel_crtc_state *crtc_state,
3159 const struct drm_connector_state *conn_state) 3405 const struct drm_connector_state *conn_state)
@@ -3177,17 +3423,10 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3177 * the bits affect a specific DDI port rather than 3423 * the bits affect a specific DDI port rather than
3178 * a specific transcoder. 3424 * a specific transcoder.
3179 */ 3425 */
3180 static const enum transcoder port_to_transcoder[] = { 3426 i915_reg_t reg = gen9_chicken_trans_reg_by_port(dev_priv, port);
3181 [PORT_A] = TRANSCODER_EDP,
3182 [PORT_B] = TRANSCODER_A,
3183 [PORT_C] = TRANSCODER_B,
3184 [PORT_D] = TRANSCODER_C,
3185 [PORT_E] = TRANSCODER_A,
3186 };
3187 enum transcoder transcoder = port_to_transcoder[port];
3188 u32 val; 3427 u32 val;
3189 3428
3190 val = I915_READ(CHICKEN_TRANS(transcoder)); 3429 val = I915_READ(reg);
3191 3430
3192 if (port == PORT_E) 3431 if (port == PORT_E)
3193 val |= DDIE_TRAINING_OVERRIDE_ENABLE | 3432 val |= DDIE_TRAINING_OVERRIDE_ENABLE |
@@ -3196,8 +3435,8 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3196 val |= DDI_TRAINING_OVERRIDE_ENABLE | 3435 val |= DDI_TRAINING_OVERRIDE_ENABLE |
3197 DDI_TRAINING_OVERRIDE_VALUE; 3436 DDI_TRAINING_OVERRIDE_VALUE;
3198 3437
3199 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3438 I915_WRITE(reg, val);
3200 POSTING_READ(CHICKEN_TRANS(transcoder)); 3439 POSTING_READ(reg);
3201 3440
3202 udelay(1); 3441 udelay(1);
3203 3442
@@ -3208,7 +3447,7 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3208 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE | 3447 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE |
3209 DDI_TRAINING_OVERRIDE_VALUE); 3448 DDI_TRAINING_OVERRIDE_VALUE);
3210 3449
3211 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3450 I915_WRITE(reg, val);
3212 } 3451 }
3213 3452
3214 /* In HDMI/DVI mode, the port width, and swing/emphasis values 3453 /* In HDMI/DVI mode, the port width, and swing/emphasis values
@@ -3282,13 +3521,76 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
3282 intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state); 3521 intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state);
3283} 3522}
3284 3523
3285static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder, 3524static void intel_ddi_set_fia_lane_count(struct intel_encoder *encoder,
3286 const struct intel_crtc_state *pipe_config, 3525 const struct intel_crtc_state *pipe_config,
3287 const struct drm_connector_state *conn_state) 3526 enum port port)
3527{
3528 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3529 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3530 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3531 u32 val = I915_READ(PORT_TX_DFLEXDPMLE1);
3532 bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
3533
3534 val &= ~DFLEXDPMLE1_DPMLETC_MASK(tc_port);
3535 switch (pipe_config->lane_count) {
3536 case 1:
3537 val |= (lane_reversal) ? DFLEXDPMLE1_DPMLETC_ML3(tc_port) :
3538 DFLEXDPMLE1_DPMLETC_ML0(tc_port);
3539 break;
3540 case 2:
3541 val |= (lane_reversal) ? DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) :
3542 DFLEXDPMLE1_DPMLETC_ML1_0(tc_port);
3543 break;
3544 case 4:
3545 val |= DFLEXDPMLE1_DPMLETC_ML3_0(tc_port);
3546 break;
3547 default:
3548 MISSING_CASE(pipe_config->lane_count);
3549 }
3550 I915_WRITE(PORT_TX_DFLEXDPMLE1, val);
3551}
3552
3553static void
3554intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
3555 const struct intel_crtc_state *crtc_state,
3556 const struct drm_connector_state *conn_state)
3557{
3558 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3559 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3560 enum port port = encoder->port;
3561
3562 if (intel_crtc_has_dp_encoder(crtc_state) ||
3563 intel_port_is_tc(dev_priv, encoder->port))
3564 intel_display_power_get(dev_priv,
3565 intel_ddi_main_link_aux_domain(dig_port));
3566
3567 if (IS_GEN9_LP(dev_priv))
3568 bxt_ddi_phy_set_lane_optim_mask(encoder,
3569 crtc_state->lane_lat_optim_mask);
3570
3571 /*
3572 * Program the lane count for static/dynamic connections on Type-C ports.
3573 * Skip this step for TBT.
3574 */
3575 if (dig_port->tc_type == TC_PORT_UNKNOWN ||
3576 dig_port->tc_type == TC_PORT_TBT)
3577 return;
3578
3579 intel_ddi_set_fia_lane_count(encoder, crtc_state, port);
3580}
3581
3582static void
3583intel_ddi_post_pll_disable(struct intel_encoder *encoder,
3584 const struct intel_crtc_state *crtc_state,
3585 const struct drm_connector_state *conn_state)
3288{ 3586{
3289 uint8_t mask = pipe_config->lane_lat_optim_mask; 3587 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3588 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3290 3589
3291 bxt_ddi_phy_set_lane_optim_mask(encoder, mask); 3590 if (intel_crtc_has_dp_encoder(crtc_state) ||
3591 intel_port_is_tc(dev_priv, encoder->port))
3592 intel_display_power_put(dev_priv,
3593 intel_ddi_main_link_aux_domain(dig_port));
3292} 3594}
3293 3595
3294void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp) 3596void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
@@ -3353,10 +3655,10 @@ static bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
3353void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv, 3655void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,
3354 struct intel_crtc_state *crtc_state) 3656 struct intel_crtc_state *crtc_state)
3355{ 3657{
3356 if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000) 3658 if (IS_ICELAKE(dev_priv) && crtc_state->port_clock > 594000)
3357 crtc_state->min_voltage_level = 2;
3358 else if (IS_ICELAKE(dev_priv) && crtc_state->port_clock > 594000)
3359 crtc_state->min_voltage_level = 1; 3659 crtc_state->min_voltage_level = 1;
3660 else if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000)
3661 crtc_state->min_voltage_level = 2;
3360} 3662}
3361 3663
3362void intel_ddi_get_config(struct intel_encoder *encoder, 3664void intel_ddi_get_config(struct intel_encoder *encoder,
@@ -3406,7 +3708,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
3406 pipe_config->has_hdmi_sink = true; 3708 pipe_config->has_hdmi_sink = true;
3407 intel_dig_port = enc_to_dig_port(&encoder->base); 3709 intel_dig_port = enc_to_dig_port(&encoder->base);
3408 3710
3409 if (intel_dig_port->infoframe_enabled(&encoder->base, pipe_config)) 3711 if (intel_dig_port->infoframe_enabled(encoder, pipe_config))
3410 pipe_config->has_infoframe = true; 3712 pipe_config->has_infoframe = true;
3411 3713
3412 if ((temp & TRANS_DDI_HDMI_SCRAMBLING_MASK) == 3714 if ((temp & TRANS_DDI_HDMI_SCRAMBLING_MASK) ==
@@ -3767,6 +4069,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3767 struct intel_encoder *intel_encoder; 4069 struct intel_encoder *intel_encoder;
3768 struct drm_encoder *encoder; 4070 struct drm_encoder *encoder;
3769 bool init_hdmi, init_dp, init_lspcon = false; 4071 bool init_hdmi, init_dp, init_lspcon = false;
4072 enum pipe pipe;
3770 4073
3771 4074
3772 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi || 4075 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
@@ -3805,8 +4108,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3805 intel_encoder->compute_output_type = intel_ddi_compute_output_type; 4108 intel_encoder->compute_output_type = intel_ddi_compute_output_type;
3806 intel_encoder->compute_config = intel_ddi_compute_config; 4109 intel_encoder->compute_config = intel_ddi_compute_config;
3807 intel_encoder->enable = intel_enable_ddi; 4110 intel_encoder->enable = intel_enable_ddi;
3808 if (IS_GEN9_LP(dev_priv)) 4111 intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
3809 intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable; 4112 intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
3810 intel_encoder->pre_enable = intel_ddi_pre_enable; 4113 intel_encoder->pre_enable = intel_ddi_pre_enable;
3811 intel_encoder->disable = intel_disable_ddi; 4114 intel_encoder->disable = intel_disable_ddi;
3812 intel_encoder->post_disable = intel_ddi_post_disable; 4115 intel_encoder->post_disable = intel_ddi_post_disable;
@@ -3817,8 +4120,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3817 intel_encoder->type = INTEL_OUTPUT_DDI; 4120 intel_encoder->type = INTEL_OUTPUT_DDI;
3818 intel_encoder->power_domain = intel_port_to_power_domain(port); 4121 intel_encoder->power_domain = intel_port_to_power_domain(port);
3819 intel_encoder->port = port; 4122 intel_encoder->port = port;
3820 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3821 intel_encoder->cloneable = 0; 4123 intel_encoder->cloneable = 0;
4124 for_each_pipe(dev_priv, pipe)
4125 intel_encoder->crtc_mask |= BIT(pipe);
3822 4126
3823 if (INTEL_GEN(dev_priv) >= 11) 4127 if (INTEL_GEN(dev_priv) >= 11)
3824 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) & 4128 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
@@ -3828,6 +4132,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3828 (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES); 4132 (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
3829 intel_dig_port->dp.output_reg = INVALID_MMIO_REG; 4133 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
3830 intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port); 4134 intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port);
4135 intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
3831 4136
3832 switch (port) { 4137 switch (port) {
3833 case PORT_A: 4138 case PORT_A:
@@ -3858,8 +4163,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3858 MISSING_CASE(port); 4163 MISSING_CASE(port);
3859 } 4164 }
3860 4165
3861 intel_infoframe_init(intel_dig_port);
3862
3863 if (init_dp) { 4166 if (init_dp) {
3864 if (!intel_ddi_init_dp_connector(intel_dig_port)) 4167 if (!intel_ddi_init_dp_connector(intel_dig_port))
3865 goto err; 4168 goto err;
@@ -3888,6 +4191,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3888 port_name(port)); 4191 port_name(port));
3889 } 4192 }
3890 4193
4194 intel_infoframe_init(intel_dig_port);
3891 return; 4195 return;
3892 4196
3893err: 4197err: