aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 9eb2940fc889..721c2e2c12a3 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1846,10 +1846,24 @@ static void cnl_ddi_vswing_program(struct drm_i915_private *dev_priv,
1846 I915_WRITE(CNL_PORT_TX_DW7_GRP(port), val); 1846 I915_WRITE(CNL_PORT_TX_DW7_GRP(port), val);
1847} 1847}
1848 1848
1849static void cnl_ddi_vswing_sequence(struct drm_i915_private *dev_priv, 1849static void cnl_ddi_vswing_sequence(struct intel_encoder *encoder, u32 level)
1850 u32 level, enum port port, int type)
1851{ 1850{
1851 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1852 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1853 enum port port = intel_ddi_get_encoder_port(encoder);
1854 int type = encoder->type;
1855 int width = 0;
1856 int rate = 0;
1852 u32 val; 1857 u32 val;
1858 int ln = 0;
1859
1860 if ((intel_dp) && (type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP)) {
1861 width = intel_dp->lane_count;
1862 rate = intel_dp->link_rate;
1863 } else {
1864 width = 4;
1865 /* Rate is always < than 6GHz for HDMI */
1866 }
1853 1867
1854 /* 1868 /*
1855 * 1. If port type is eDP or DP, 1869 * 1. If port type is eDP or DP,
@@ -1865,8 +1879,21 @@ static void cnl_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
1865 1879
1866 /* 2. Program loadgen select */ 1880 /* 2. Program loadgen select */
1867 /* 1881 /*
1868 * FIXME: Program PORT_TX_DW4_LN depending on Bit rate and used lanes 1882 * Program PORT_TX_DW4_LN depending on Bit rate and used lanes
1883 * <= 6 GHz and 4 lanes (LN0=0, LN1=1, LN2=1, LN3=1)
1884 * <= 6 GHz and 1,2 lanes (LN0=0, LN1=1, LN2=1, LN3=0)
1885 * > 6 GHz (LN0=0, LN1=0, LN2=0, LN3=0)
1869 */ 1886 */
1887 for (ln = 0; ln <= 3; ln++) {
1888 val = I915_READ(CNL_PORT_TX_DW4_LN(port, ln));
1889 val &= ~LOADGEN_SELECT;
1890
1891 if (((rate < 600000) && (width == 4) && (ln >= 1)) ||
1892 ((rate < 600000) && (width < 4) && ((ln == 1) || (ln == 2)))) {
1893 val |= LOADGEN_SELECT;
1894 }
1895 I915_WRITE(CNL_PORT_TX_DW4_LN(port, ln), val);
1896 }
1870 1897
1871 /* 3. Set PORT_CL_DW5 SUS Clock Config to 11b */ 1898 /* 3. Set PORT_CL_DW5 SUS Clock Config to 11b */
1872 val = I915_READ(CNL_PORT_CL1CM_DW5); 1899 val = I915_READ(CNL_PORT_CL1CM_DW5);
@@ -1920,7 +1947,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
1920 else if (IS_GEN9_LP(dev_priv)) 1947 else if (IS_GEN9_LP(dev_priv))
1921 bxt_ddi_vswing_sequence(dev_priv, level, port, encoder->type); 1948 bxt_ddi_vswing_sequence(dev_priv, level, port, encoder->type);
1922 else if (IS_CANNONLAKE(dev_priv)) { 1949 else if (IS_CANNONLAKE(dev_priv)) {
1923 cnl_ddi_vswing_sequence(dev_priv, level, port, encoder->type); 1950 cnl_ddi_vswing_sequence(encoder, level);
1924 /* DDI_BUF_CTL bits 27:24 are reserved on CNL */ 1951 /* DDI_BUF_CTL bits 27:24 are reserved on CNL */
1925 return 0; 1952 return 0;
1926 } 1953 }
@@ -2022,8 +2049,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2022 bxt_ddi_vswing_sequence(dev_priv, level, port, 2049 bxt_ddi_vswing_sequence(dev_priv, level, port,
2023 INTEL_OUTPUT_HDMI); 2050 INTEL_OUTPUT_HDMI);
2024 else if (IS_CANNONLAKE(dev_priv)) 2051 else if (IS_CANNONLAKE(dev_priv))
2025 cnl_ddi_vswing_sequence(dev_priv, level, port, 2052 cnl_ddi_vswing_sequence(encoder, level);
2026 INTEL_OUTPUT_HDMI);
2027 2053
2028 intel_hdmi->set_infoframes(drm_encoder, 2054 intel_hdmi->set_infoframes(drm_encoder,
2029 has_hdmi_sink, 2055 has_hdmi_sink,