diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 38 |
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 | ||
1849 | static void cnl_ddi_vswing_sequence(struct drm_i915_private *dev_priv, | 1849 | static 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, |