FAILED: patch "[PATCH] drm/i915: Program iboost settings for HDMI/DVI on SKL" failed to apply to 4.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
7ff9a55614712adf13ce7990565be0263e620f5eMon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <[email protected]>
Date: Tue, 12 Jul 2016 15:59:30 +0300
Subject: [PATCH] drm/i915: Program iboost settings for HDMI/DVI on SKL
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Currently we fail to program the iboost stuff for HDMI/DVI. Let's remedy that.
Fixes f8896f5d58e6 ("drm/i915/skl: Buffer translation improvements")
Cc David Weinehall <[email protected]>
Signed-off-by Ville Syrjälä <[email protected]>
Reviewed-by David Weinehall <[email protected]>
(cherry picked from commit 8d8bb85eb7d859aa9bbe36e588690a1d22af7608)
Signed-off-by Jani Nikula <[email protected]>
drivers/gpu/drm/i915/intel_ddi.c +40 -11
@@ -388,6 +388,40 @@ skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) } } +static int intel_ddi_hdmi_level (struct drm_i915_private *dev_priv,enum port port) +{ +int n_hdmi_entries; +int hdmi_level; +int hdmi_default_entry; + + hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; + +if (IS_BROXTON (dev_priv)) +return hdmi_level; + +if (IS_SKYLAKE (dev_priv) ||IS_KABYLAKE (dev_priv)) { +skl_get_buf_trans_hdmi (dev_priv, &n_hdmi_entries); + hdmi_default_entry =8 ; + }else if (IS_BROADWELL (dev_priv)) { + n_hdmi_entries =ARRAY_SIZE (bdw_ddi_translations_hdmi); + hdmi_default_entry =7 ; + }else if (IS_HASWELL (dev_priv)) { + n_hdmi_entries =ARRAY_SIZE (hsw_ddi_translations_hdmi); + hdmi_default_entry =6 ; + }else { +WARN (1 ,"ddi translation table missing\n" ); + n_hdmi_entries =ARRAY_SIZE (bdw_ddi_translations_hdmi); + hdmi_default_entry =7 ; + } + +/* Choose a good default if VBT is badly populated */ +if (hdmi_level ==HDMI_LEVEL_SHIFT_UNKNOWN || + hdmi_level >= n_hdmi_entries) + hdmi_level = hdmi_default_entry; + +return hdmi_level; +} +/* * Starting with Haswell, DDI port buffers must be programmed with correct * values in advance. The buffer values are different for FDI and DP modes,
@@ -399,7 +433,7 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder) {struct drm_i915_private *dev_priv =to_i915 (encoder->base.dev);u32 iboost_bit =0 ; -int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry, +int i, n_hdmi_entries, n_dp_entries, n_edp_entries, size;int hdmi_level;enum port port;
@@ -410,7 +444,7 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder)const struct ddi_buf_trans *ddi_translations; port =intel_ddi_get_encoder_port (encoder); - hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; + hdmi_level =intel_ddi_hdmi_level (dev_priv, port);if (IS_BROXTON (dev_priv)) {if (encoder->type !=INTEL_OUTPUT_HDMI )
@@ -430,7 +464,6 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder)skl_get_buf_trans_edp (dev_priv, &n_edp_entries); ddi_translations_hdmi =skl_get_buf_trans_hdmi (dev_priv, &n_hdmi_entries); - hdmi_default_entry =8 ;/* If we're boosting the current, set bit 31 of trans1 */ if (dev_priv->vbt.ddi_port_info[port].hdmi_boost_level || dev_priv->vbt.ddi_port_info[port].dp_boost_level)
@@ -456,7 +489,6 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder) n_dp_entries =ARRAY_SIZE (bdw_ddi_translations_dp); n_hdmi_entries =ARRAY_SIZE (bdw_ddi_translations_hdmi); - hdmi_default_entry =7 ; }else if (IS_HASWELL (dev_priv)) { ddi_translations_fdi = hsw_ddi_translations_fdi; ddi_translations_dp = hsw_ddi_translations_dp;
@@ -464,7 +496,6 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder) ddi_translations_hdmi = hsw_ddi_translations_hdmi; n_dp_entries = n_edp_entries =ARRAY_SIZE (hsw_ddi_translations_dp); n_hdmi_entries =ARRAY_SIZE (hsw_ddi_translations_hdmi); - hdmi_default_entry =6 ; }else {WARN (1 ,"ddi translation table missing\n" ); ddi_translations_edp = bdw_ddi_translations_dp;
@@ -474,7 +505,6 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder) n_edp_entries =ARRAY_SIZE (bdw_ddi_translations_edp); n_dp_entries =ARRAY_SIZE (bdw_ddi_translations_dp); n_hdmi_entries =ARRAY_SIZE (bdw_ddi_translations_hdmi); - hdmi_default_entry =7 ; }switch (encoder->type) {
@@ -505,11 +535,6 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder)if (encoder->type !=INTEL_OUTPUT_HDMI )return ; -/* Choose a good default if VBT is badly populated */ -if (hdmi_level ==HDMI_LEVEL_SHIFT_UNKNOWN || - hdmi_level >= n_hdmi_entries) - hdmi_level = hdmi_default_entry; -/* Entry 9 is for HDMI: */ I915_WRITE (DDI_BUF_TRANS_LO (port, i), ddi_translations_hdmi[hdmi_level].trans1 | iboost_bit);
@@ -1647,6 +1672,10 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)intel_dp_stop_link_train (intel_dp); }else if (type ==INTEL_OUTPUT_HDMI ) {struct intel_hdmi *intel_hdmi =enc_to_intel_hdmi (encoder); +int level =intel_ddi_hdmi_level (dev_priv, port); + +if (IS_SKYLAKE (dev_priv) ||IS_KABYLAKE (dev_priv)) +skl_ddi_set_iboost (intel_encoder, level); intel_hdmi->set_infoframes(encoder, crtc->config->has_hdmi_sink,