Introduce helpers to program or disable CMN_SDP_TL and stagger registers
using the state stored in crtc_state.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_dip.c | 56 ++++++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dip.h |  2 +
 2 files changed, 58 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dip.c 
b/drivers/gpu/drm/i915/display/intel_dip.c
index 333314637db5..5cda9792d593 100644
--- a/drivers/gpu/drm/i915/display/intel_dip.c
+++ b/drivers/gpu/drm/i915/display/intel_dip.c
@@ -4,6 +4,8 @@
  *
  */
 
+#include <drm/drm_print.h>
+
 #include "intel_de.h"
 #include "intel_dip.h"
 #include "intel_dip_regs.h"
@@ -45,3 +47,57 @@ void intel_dip_sdp_transmission_line_get_config(struct 
intel_crtc_state *crtc_st
 {
        crtc_state->dip.emp_as_sdp_tl = 
intel_dip_read_emp_as_sdp_tl(crtc_state);
 }
+
+static int intel_dip_sdp_tl_to_stagger(const struct intel_crtc_state 
*crtc_state,
+                                      u16 sdp_transmission_line)
+{
+       return sdp_transmission_line - crtc_state->dip.cmn_sdp_tl;
+}
+
+void intel_dip_cmn_sdp_transmission_line_enable(const struct intel_crtc_state 
*crtc_state)
+{
+       struct intel_display *display = to_intel_display(crtc_state);
+       enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+       int gmp_stagger;
+       int pps_stagger;
+       int vsc_ext_stagger;
+
+       if (!crtc_state->dip.cmn_sdp_tl)
+               return;
+
+       gmp_stagger = intel_dip_sdp_tl_to_stagger(crtc_state,
+                                                 crtc_state->dip.gmp_sdp_tl);
+
+       pps_stagger = intel_dip_sdp_tl_to_stagger(crtc_state,
+                                                 crtc_state->dip.pps_sdp_tl);
+
+       vsc_ext_stagger = intel_dip_sdp_tl_to_stagger(crtc_state,
+                                                     
crtc_state->dip.vsc_ext_sdp_tl);
+
+       if (drm_WARN_ON(display->drm, gmp_stagger < 0))
+               return;
+       if (drm_WARN_ON(display->drm, pps_stagger < 0))
+               return;
+       if (drm_WARN_ON(display->drm, vsc_ext_stagger < 0))
+               return;
+
+       intel_de_write(display, CMN_SDP_TL_STGR_CTL(display, cpu_transcoder),
+                      GMP_STAGGER(gmp_stagger) |
+                      PPS_STAGGER(pps_stagger) |
+                      VSC_EXT_STAGGER(vsc_ext_stagger));
+
+       intel_de_write(display, CMN_SDP_TL(display, cpu_transcoder),
+                      TRANSMISSION_LINE_ENABLE |
+                      BASE_TRANSMISSION_LINE(crtc_state->dip.cmn_sdp_tl));
+}
+
+void intel_dip_cmn_sdp_transmission_line_disable(const struct intel_crtc_state 
*old_crtc_state)
+{
+       struct intel_display *display = to_intel_display(old_crtc_state);
+       enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
+
+       if (!old_crtc_state->dip.cmn_sdp_tl)
+               return;
+
+       intel_de_write(display, CMN_SDP_TL(display, cpu_transcoder), 0);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dip.h 
b/drivers/gpu/drm/i915/display/intel_dip.h
index 03ef749a79ca..24d6228c2f8d 100644
--- a/drivers/gpu/drm/i915/display/intel_dip.h
+++ b/drivers/gpu/drm/i915/display/intel_dip.h
@@ -61,5 +61,7 @@ struct intel_dip {
 
 void intel_dip_sdp_tl_compute_config_late(struct intel_crtc_state *crtc_state);
 void intel_dip_sdp_transmission_line_get_config(struct intel_crtc_state 
*crtc_state);
+void intel_dip_cmn_sdp_transmission_line_enable(const struct intel_crtc_state 
*crtc_state);
+void intel_dip_cmn_sdp_transmission_line_disable(const struct intel_crtc_state 
*old_crtc_state);
 
 #endif /* __INTEL_DIP_H__ */
-- 
2.45.2

Reply via email to