Add intel_hdmi_prepare_for_frl_mode() to arm the FRL function and reset
the training pattern to the default LTP1 on all active lanes, before the
Link training sequence starts.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_hdmi.c | 22 ++++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_hdmi.h |  2 +-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c 
b/drivers/gpu/drm/i915/display/intel_hdmi.c
index b0534fba4e5f..96542869740e 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -3501,3 +3501,25 @@ int intel_hdmi_sink_dsc_max_frl_rate(struct 
drm_connector *connector)
 
        return max_lanes * rate_per_lane;
 }
+
+void intel_hdmi_prepare_for_frl_mode(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_display *display = to_intel_display(crtc_state);
+       enum transcoder trans = crtc_state->cpu_transcoder;
+       int num_lanes = crtc_state->frl.required_lanes;
+       u32 write_buf = 0;
+       int lane;
+
+       if (!crtc_state->frl.enable)
+               return;
+
+       intel_de_rmw(display, TRANS_HDMI_FRL_CFG(display, trans),
+                    TRANS_HDMI_FRL_TRAINING_COMPLETE,
+                    TRANS_HDMI_FRL_ENABLE);
+
+       /* Reset Training Pattern to default 0x1 */
+       for (lane = 0; lane < num_lanes; lane++)
+               write_buf |= TRANS_HDMI_FRL_LTP(0x1, lane);
+
+       intel_de_write(display, TRANS_HDMI_FRL_TRAIN(display, trans), 
write_buf);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.h 
b/drivers/gpu/drm/i915/display/intel_hdmi.h
index c95ed37bcc0c..6283305b5274 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.h
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.h
@@ -63,7 +63,7 @@ int intel_hdmi_dsc_get_num_slices(const struct 
drm_display_mode *mode,
                                  int hdmi_max_slices, int hdmi_throughput);
 int intel_hdmi_dsc_get_slice_height(int vactive);
 bool intel_hdmi_is_frl(u32 clock);
-
+void intel_hdmi_prepare_for_frl_mode(const struct intel_crtc_state 
*crtc_state);
 void hsw_write_infoframe(struct intel_encoder *encoder,
                         const struct intel_crtc_state *crtc_state,
                         unsigned int type,
-- 
2.50.1

Reply via email to