diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 482 |
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) | |||
642 | static const struct ddi_buf_trans * | 642 | static const struct ddi_buf_trans * |
643 | kbl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) | 643 | kbl_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 * | |||
658 | skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries) | 658 | skl_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) | |||
680 | static const struct ddi_buf_trans * | 680 | static const struct ddi_buf_trans * |
681 | skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) | 681 | skl_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 | ||
1062 | static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder, | 1062 | static 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 | ||
1752 | void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state) | 1752 | void 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 | ||
2001 | bool intel_ddi_get_hw_state(struct intel_encoder *encoder, | 2008 | static 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 | ||
2062 | out: | 2083 | out: |
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; | 2096 | bool 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 | ||
2077 | static inline enum intel_display_power_domain | 2112 | static inline enum intel_display_power_domain |
2078 | intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp) | 2113 | intel_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 | ||
2096 | static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder, | 2131 | static 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 | ||
2853 | void 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 | |||
2816 | static void intel_ddi_clk_select(struct intel_encoder *encoder, | 2899 | static 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 | ||
2968 | static 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 | |||
3001 | static 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 | |||
3034 | static 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 | |||
2884 | static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, | 3099 | static 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 | ||
3002 | static void intel_disable_ddi_buf(struct intel_encoder *encoder) | 3231 | static 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 | ||
3057 | static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder, | 3283 | static 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 | ||
3383 | static i915_reg_t | ||
3384 | gen9_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 | |||
3157 | static void intel_enable_ddi_hdmi(struct intel_encoder *encoder, | 3403 | static 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 | ||
3285 | static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder, | 3524 | static 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 | |||
3553 | static void | ||
3554 | intel_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 | |||
3582 | static void | ||
3583 | intel_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 | ||
3294 | void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp) | 3596 | void 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, | |||
3353 | void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv, | 3655 | void 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 | ||
3362 | void intel_ddi_get_config(struct intel_encoder *encoder, | 3664 | void 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 | ||
3893 | err: | 4197 | err: |