Commit 3072a24c authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Introduce crtc_state->enhanced_framing

Track DP enhanced framing properly in the crtc state instead
of relying just on the cached DPCD everywhere, and hook it
up into the state check and dump.

v2: Actually set enhanced_framing in .compute_config()
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230503113659.16305-1-ville.syrjala@linux.intel.comReviewed-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent a7891a0a
...@@ -141,7 +141,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder, ...@@ -141,7 +141,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
intel_de_rmw(dev_priv, TRANS_DP_CTL(crtc->pipe), intel_de_rmw(dev_priv, TRANS_DP_CTL(crtc->pipe),
TRANS_DP_ENH_FRAMING, TRANS_DP_ENH_FRAMING,
drm_dp_enhanced_frame_cap(intel_dp->dpcd) ? pipe_config->enhanced_framing ?
TRANS_DP_ENH_FRAMING : 0); TRANS_DP_ENH_FRAMING : 0);
} else { } else {
if (IS_G4X(dev_priv) && pipe_config->limited_color_range) if (IS_G4X(dev_priv) && pipe_config->limited_color_range)
...@@ -153,7 +153,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder, ...@@ -153,7 +153,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
intel_dp->DP |= DP_SYNC_VS_HIGH; intel_dp->DP |= DP_SYNC_VS_HIGH;
intel_dp->DP |= DP_LINK_TRAIN_OFF; intel_dp->DP |= DP_LINK_TRAIN_OFF;
if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) if (pipe_config->enhanced_framing)
intel_dp->DP |= DP_ENHANCED_FRAMING; intel_dp->DP |= DP_ENHANCED_FRAMING;
if (IS_CHERRYVIEW(dev_priv)) if (IS_CHERRYVIEW(dev_priv))
...@@ -351,6 +351,9 @@ static void intel_dp_get_config(struct intel_encoder *encoder, ...@@ -351,6 +351,9 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
u32 trans_dp = intel_de_read(dev_priv, u32 trans_dp = intel_de_read(dev_priv,
TRANS_DP_CTL(crtc->pipe)); TRANS_DP_CTL(crtc->pipe));
if (trans_dp & TRANS_DP_ENH_FRAMING)
pipe_config->enhanced_framing = true;
if (trans_dp & TRANS_DP_HSYNC_ACTIVE_HIGH) if (trans_dp & TRANS_DP_HSYNC_ACTIVE_HIGH)
flags |= DRM_MODE_FLAG_PHSYNC; flags |= DRM_MODE_FLAG_PHSYNC;
else else
...@@ -361,6 +364,9 @@ static void intel_dp_get_config(struct intel_encoder *encoder, ...@@ -361,6 +364,9 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
else else
flags |= DRM_MODE_FLAG_NVSYNC; flags |= DRM_MODE_FLAG_NVSYNC;
} else { } else {
if (tmp & DP_ENHANCED_FRAMING)
pipe_config->enhanced_framing = true;
if (tmp & DP_SYNC_HS_HIGH) if (tmp & DP_SYNC_HS_HIGH)
flags |= DRM_MODE_FLAG_PHSYNC; flags |= DRM_MODE_FLAG_PHSYNC;
else else
......
...@@ -451,6 +451,8 @@ static int hsw_crt_compute_config(struct intel_encoder *encoder, ...@@ -451,6 +451,8 @@ static int hsw_crt_compute_config(struct intel_encoder *encoder,
/* FDI must always be 2.7 GHz */ /* FDI must always be 2.7 GHz */
pipe_config->port_clock = 135000 * 2; pipe_config->port_clock = 135000 * 2;
pipe_config->enhanced_framing = true;
adjusted_mode->crtc_clock = lpt_iclkip(pipe_config); adjusted_mode->crtc_clock = lpt_iclkip(pipe_config);
return 0; return 0;
......
...@@ -258,8 +258,9 @@ void intel_crtc_state_dump(const struct intel_crtc_state *pipe_config, ...@@ -258,8 +258,9 @@ void intel_crtc_state_dump(const struct intel_crtc_state *pipe_config,
intel_dump_m_n_config(pipe_config, "dp m2_n2", intel_dump_m_n_config(pipe_config, "dp m2_n2",
pipe_config->lane_count, pipe_config->lane_count,
&pipe_config->dp_m2_n2); &pipe_config->dp_m2_n2);
drm_dbg_kms(&i915->drm, "fec: %s\n", drm_dbg_kms(&i915->drm, "fec: %s, enhanced framing: %s\n",
str_enabled_disabled(pipe_config->fec_enable)); str_enabled_disabled(pipe_config->fec_enable),
str_enabled_disabled(pipe_config->enhanced_framing));
} }
drm_dbg_kms(&i915->drm, "framestart delay: %d, MSA timing delay: %d\n", drm_dbg_kms(&i915->drm, "framestart delay: %d, MSA timing delay: %d\n",
......
...@@ -3432,7 +3432,7 @@ static void mtl_ddi_prepare_link_retrain(struct intel_dp *intel_dp, ...@@ -3432,7 +3432,7 @@ static void mtl_ddi_prepare_link_retrain(struct intel_dp *intel_dp,
dp_tp_ctl |= DP_TP_CTL_MODE_MST; dp_tp_ctl |= DP_TP_CTL_MODE_MST;
} else { } else {
dp_tp_ctl |= DP_TP_CTL_MODE_SST; dp_tp_ctl |= DP_TP_CTL_MODE_SST;
if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) if (crtc_state->enhanced_framing)
dp_tp_ctl |= DP_TP_CTL_ENHANCED_FRAME_ENABLE; dp_tp_ctl |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
} }
intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), dp_tp_ctl); intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), dp_tp_ctl);
...@@ -3489,7 +3489,7 @@ static void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp, ...@@ -3489,7 +3489,7 @@ static void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp,
dp_tp_ctl |= DP_TP_CTL_MODE_MST; dp_tp_ctl |= DP_TP_CTL_MODE_MST;
} else { } else {
dp_tp_ctl |= DP_TP_CTL_MODE_SST; dp_tp_ctl |= DP_TP_CTL_MODE_SST;
if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) if (crtc_state->enhanced_framing)
dp_tp_ctl |= DP_TP_CTL_ENHANCED_FRAME_ENABLE; dp_tp_ctl |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
} }
intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), dp_tp_ctl); intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), dp_tp_ctl);
...@@ -3724,6 +3724,10 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder, ...@@ -3724,6 +3724,10 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
intel_cpu_transcoder_get_m2_n2(crtc, cpu_transcoder, intel_cpu_transcoder_get_m2_n2(crtc, cpu_transcoder,
&pipe_config->dp_m2_n2); &pipe_config->dp_m2_n2);
pipe_config->enhanced_framing =
intel_de_read(dev_priv, dp_tp_ctl_reg(encoder, pipe_config)) &
DP_TP_CTL_ENHANCED_FRAME_ENABLE;
if (DISPLAY_VER(dev_priv) >= 11) if (DISPLAY_VER(dev_priv) >= 11)
pipe_config->fec_enable = pipe_config->fec_enable =
intel_de_read(dev_priv, intel_de_read(dev_priv,
...@@ -3740,6 +3744,9 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder, ...@@ -3740,6 +3744,9 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
if (!HAS_DP20(dev_priv)) { if (!HAS_DP20(dev_priv)) {
/* FDI */ /* FDI */
pipe_config->output_types |= BIT(INTEL_OUTPUT_ANALOG); pipe_config->output_types |= BIT(INTEL_OUTPUT_ANALOG);
pipe_config->enhanced_framing =
intel_de_read(dev_priv, dp_tp_ctl_reg(encoder, pipe_config)) &
DP_TP_CTL_ENHANCED_FRAME_ENABLE;
break; break;
} }
fallthrough; /* 128b/132b */ fallthrough; /* 128b/132b */
......
...@@ -5210,6 +5210,7 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config, ...@@ -5210,6 +5210,7 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
PIPE_CONF_CHECK_BOOL(hdmi_scrambling); PIPE_CONF_CHECK_BOOL(hdmi_scrambling);
PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio); PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio);
PIPE_CONF_CHECK_BOOL(has_infoframe); PIPE_CONF_CHECK_BOOL(has_infoframe);
PIPE_CONF_CHECK_BOOL(enhanced_framing);
PIPE_CONF_CHECK_BOOL(fec_enable); PIPE_CONF_CHECK_BOOL(fec_enable);
PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio); PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio);
......
...@@ -1362,6 +1362,8 @@ struct intel_crtc_state { ...@@ -1362,6 +1362,8 @@ struct intel_crtc_state {
u16 linetime; u16 linetime;
u16 ips_linetime; u16 ips_linetime;
bool enhanced_framing;
/* Forward Error correction State */ /* Forward Error correction State */
bool fec_enable; bool fec_enable;
......
...@@ -2701,6 +2701,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, ...@@ -2701,6 +2701,9 @@ intel_dp_compute_config(struct intel_encoder *encoder,
pipe_config->limited_color_range = pipe_config->limited_color_range =
intel_dp_limited_color_range(pipe_config, conn_state); intel_dp_limited_color_range(pipe_config, conn_state);
pipe_config->enhanced_framing =
drm_dp_enhanced_frame_cap(intel_dp->dpcd);
if (pipe_config->dsc.compression_enable) if (pipe_config->dsc.compression_enable)
link_bpp = pipe_config->dsc.compressed_bpp; link_bpp = pipe_config->dsc.compressed_bpp;
else else
......
...@@ -655,7 +655,7 @@ intel_dp_update_link_bw_set(struct intel_dp *intel_dp, ...@@ -655,7 +655,7 @@ intel_dp_update_link_bw_set(struct intel_dp *intel_dp,
/* Write the link configuration data */ /* Write the link configuration data */
link_config[0] = link_bw; link_config[0] = link_bw;
link_config[1] = crtc_state->lane_count; link_config[1] = crtc_state->lane_count;
if (drm_dp_enhanced_frame_cap(intel_dp->dpcd)) if (crtc_state->enhanced_framing)
link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2); drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
......
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