Commit 6777a855 authored by Imre Deak's avatar Imre Deak

drm/i915: Fix DP link training pattern mask

An LTTPR can be trained with training pattern 4 even if the DPCD
revision is < 1.4, but drm_dp_training_pattern_mask() would change
pattern 4 to pattern 3 on those DPCD revisions.

Since intel_dp_training_pattern() makes already sure that the proper
training pattern is used, all that needs to be masked out is the
scrambling disable flag, which is or'd to the mask later based on the
training pattern.

v2:
- Use a helper instead of open-coding the masking. (Ville)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201007170917.1764556-2-imre.deak@intel.com
parent 3bcacad3
...@@ -4254,13 +4254,12 @@ static void intel_ddi_set_link_train(struct intel_dp *intel_dp, ...@@ -4254,13 +4254,12 @@ static void intel_ddi_set_link_train(struct intel_dp *intel_dp,
{ {
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
u8 train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);
u32 temp; u32 temp;
temp = intel_de_read(dev_priv, dp_tp_ctl_reg(encoder, crtc_state)); temp = intel_de_read(dev_priv, dp_tp_ctl_reg(encoder, crtc_state));
temp &= ~DP_TP_CTL_LINK_TRAIN_MASK; temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;
switch (dp_train_pat & train_pat_mask) { switch (intel_dp_training_pattern_symbol(dp_train_pat)) {
case DP_TRAINING_PATTERN_DISABLE: case DP_TRAINING_PATTERN_DISABLE:
temp |= DP_TP_CTL_LINK_TRAIN_NORMAL; temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;
break; break;
......
...@@ -3829,7 +3829,7 @@ cpt_set_link_train(struct intel_dp *intel_dp, ...@@ -3829,7 +3829,7 @@ cpt_set_link_train(struct intel_dp *intel_dp,
*DP &= ~DP_LINK_TRAIN_MASK_CPT; *DP &= ~DP_LINK_TRAIN_MASK_CPT;
switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) { switch (intel_dp_training_pattern_symbol(dp_train_pat)) {
case DP_TRAINING_PATTERN_DISABLE: case DP_TRAINING_PATTERN_DISABLE:
*DP |= DP_LINK_TRAIN_OFF_CPT; *DP |= DP_LINK_TRAIN_OFF_CPT;
break; break;
...@@ -3860,7 +3860,7 @@ g4x_set_link_train(struct intel_dp *intel_dp, ...@@ -3860,7 +3860,7 @@ g4x_set_link_train(struct intel_dp *intel_dp,
*DP &= ~DP_LINK_TRAIN_MASK; *DP &= ~DP_LINK_TRAIN_MASK;
switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) { switch (intel_dp_training_pattern_symbol(dp_train_pat)) {
case DP_TRAINING_PATTERN_DISABLE: case DP_TRAINING_PATTERN_DISABLE:
*DP |= DP_LINK_TRAIN_OFF; *DP |= DP_LINK_TRAIN_OFF;
break; break;
...@@ -4562,12 +4562,12 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, ...@@ -4562,12 +4562,12 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
u8 dp_train_pat) u8 dp_train_pat)
{ {
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
u8 train_pat_mask = drm_dp_training_pattern_mask(intel_dp->dpcd);
if (dp_train_pat & train_pat_mask) if ((intel_dp_training_pattern_symbol(dp_train_pat)) !=
DP_TRAINING_PATTERN_DISABLE)
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Using DP training pattern TPS%d\n", "Using DP training pattern TPS%d\n",
dp_train_pat & train_pat_mask); intel_dp_training_pattern_symbol(dp_train_pat));
intel_dp->set_link_train(intel_dp, crtc_state, dp_train_pat); intel_dp->set_link_train(intel_dp, crtc_state, dp_train_pat);
} }
......
...@@ -100,7 +100,7 @@ intel_dp_set_link_train(struct intel_dp *intel_dp, ...@@ -100,7 +100,7 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
dp_train_pat); dp_train_pat);
buf[0] = dp_train_pat; buf[0] = dp_train_pat;
if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) == if (intel_dp_training_pattern_symbol(dp_train_pat) ==
DP_TRAINING_PATTERN_DISABLE) { DP_TRAINING_PATTERN_DISABLE) {
/* don't write DP_TRAINING_LANEx_SET on disable */ /* don't write DP_TRAINING_LANEx_SET on disable */
len = 1; len = 1;
......
...@@ -19,4 +19,10 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp, ...@@ -19,4 +19,10 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
void intel_dp_stop_link_train(struct intel_dp *intel_dp, void intel_dp_stop_link_train(struct intel_dp *intel_dp,
const struct intel_crtc_state *crtc_state); const struct intel_crtc_state *crtc_state);
/* Get the TPSx symbol type of the value programmed to DP_TRAINING_PATTERN_SET */
static inline u8 intel_dp_training_pattern_symbol(u8 pattern)
{
return pattern & ~DP_LINK_SCRAMBLING_DISABLE;
}
#endif /* __INTEL_DP_LINK_TRAINING_H__ */ #endif /* __INTEL_DP_LINK_TRAINING_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment