FAILED: patch "[PATCH] drm/i915: Fix iboost setting for DDI with 4 lanes 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
5728e0de741a3581e9900c5cbee3a51425daf211Mon 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:28 +0300
Subject: [PATCH] drm/i915: Fix iboost setting for DDI with 4 lanes on SKL
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bspec says:
"For DDIA with x4 capability (DDI_BUF_CTL DDIA Lane Capability Control =
DDIA x4), the I_boost value has to be programmed in both tx_blnclegsctl_0 and tx_blnclegsctl_4."
Currently we only program tx_blnclegsctl_0. Let's do the other one as well.
drivers/gpu/drm/i915/i915_reg.h +1 -0
@@ -1536,6 +1536,7 @@ enum skl_disp_power_wells {#define BALANCE_LEG_MASK (port) (7<<(8+3*(port)))/* Balance leg disable bits */ #define BALANCE_LEG_DISABLE_SHIFT 23 +#define BALANCE_LEG_DISABLE (port) (1 << (23 + (port)))/* * Fence registers
drivers/gpu/drm/i915/intel_ddi.c +23 -13
@@ -1379,14 +1379,30 @@ void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc) TRANS_CLK_SEL_DISABLED); } -static void skl_ddi_set_iboost (struct drm_i915_private *dev_priv, -u32 level,enum port port,int type) +static void _skl_ddi_set_iboost (struct drm_i915_private *dev_priv, +enum port port,uint8_t iboost) { +u32 tmp; + + tmp =I915_READ (DISPIO_CR_TX_BMU_CR0 ); + tmp &= ~(BALANCE_LEG_MASK (port) |BALANCE_LEG_DISABLE (port)); +if (iboost) + tmp |= iboost <<BALANCE_LEG_SHIFT (port); +else + tmp |=BALANCE_LEG_DISABLE (port); +I915_WRITE (DISPIO_CR_TX_BMU_CR0 , tmp); +} + +static void skl_ddi_set_iboost (struct intel_encoder *encoder,u32 level) +{ +struct intel_digital_port *intel_dig_port =enc_to_dig_port (&encoder->base); +struct drm_i915_private *dev_priv =to_i915 (intel_dig_port->base.base.dev); +enum port port = intel_dig_port->port; +int type = encoder->type;const struct ddi_buf_trans *ddi_translations;uint8_t iboost;uint8_t dp_iboost, hdmi_iboost;int n_entries; -u32 reg;/* VBT may override standard boost values */ dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;
@@ -1428,16 +1444,10 @@ static void skl_ddi_set_iboost(struct drm_i915_private *dev_priv,return ; } - reg =I915_READ (DISPIO_CR_TX_BMU_CR0 ); - reg &= ~BALANCE_LEG_MASK (port); - reg &= ~(1 << (BALANCE_LEG_DISABLE_SHIFT + port)); - -if (iboost) - reg |= iboost <<BALANCE_LEG_SHIFT (port); -else - reg |=1 << (BALANCE_LEG_DISABLE_SHIFT + port); +_skl_ddi_set_iboost (dev_priv, port, iboost); -I915_WRITE (DISPIO_CR_TX_BMU_CR0 , reg); +if (port ==PORT_A && intel_dig_port->max_lanes ==4 ) +_skl_ddi_set_iboost (dev_priv,PORT_E , iboost); } static void bxt_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
@@ -1568,7 +1578,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp) level =translate_signal_level (signal_levels);if (IS_SKYLAKE (dev_priv) ||IS_KABYLAKE (dev_priv)) -skl_ddi_set_iboost (dev_priv, level, port, encoder->type); +skl_ddi_set_iboost (encoder, level);else if (IS_BROXTON (dev_priv))bxt_ddi_vswing_sequence (dev_priv, level, port, encoder->type);