From: Paulo Zanoni <[email protected]>

Signed-off-by: Paulo Zanoni <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c | 44 +++++++++++++++++++++++++++++++++-------
 drivers/gpu/drm/i915/intel_dp.c  | 28 +++++++++++++++----------
 drivers/gpu/drm/i915/intel_drv.h |  1 +
 3 files changed, 55 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index fed7856..23ec6a2 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -891,16 +891,46 @@ void intel_ddi_mode_set(struct drm_encoder *encoder,
 {
        struct drm_crtc *crtc = encoder->crtc;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
-       int port = intel_hdmi->ddi_port;
+       struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
+       struct intel_hdmi *intel_hdmi = NULL;
+       struct intel_dp *intel_dp = NULL;
+       int port;
        int pipe = intel_crtc->pipe;
 
-       /* On Haswell, we need to enable the clocks and prepare DDI function to
-        * work in HDMI mode for this pipe.
-        */
-       DRM_DEBUG_KMS("Preparing HDMI DDI mode for Haswell on port %c, pipe 
%c\n", port_name(port), pipe_name(pipe));
+       if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
+               intel_hdmi = enc_to_intel_hdmi(encoder);
+               port = intel_hdmi->ddi_port;
+       } else {
+               intel_dp = enc_to_intel_dp(encoder);
+               port = intel_dp->port;
+       }
+
+       DRM_DEBUG_KMS("Preparing DDI mode for Haswell on port %c, pipe %c\n",
+                     port_name(port), pipe_name(pipe));
+
+       if (intel_encoder->type != INTEL_OUTPUT_HDMI) {
+               intel_dp->DP = DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
+               switch (intel_dp->lane_count) {
+               case 1:
+                       intel_dp->DP |= DDI_PORT_WIDTH_X1;
+                       break;
+               case 2:
+                       intel_dp->DP |= DDI_PORT_WIDTH_X2;
+                       break;
+               case 4:
+                       intel_dp->DP |= DDI_PORT_WIDTH_X4;
+                       break;
+               default:
+                       intel_dp->DP |= DDI_PORT_WIDTH_X4;
+                       WARN(1, "Unexpected DP lane count %d\n",
+                            intel_dp->lane_count);
+                       break;
+               }
+
+               intel_dp_init_link_config(intel_dp);
+       }
 
-       intel_ddi_enable_pipe(&intel_hdmi->base, adjusted_mode);
+       intel_ddi_enable_pipe(intel_encoder, adjusted_mode);
 }
 
 static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 31d6e78..4cd85f7 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -806,6 +806,21 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct 
drm_display_mode *mode,
 static void ironlake_edp_pll_on(struct drm_encoder *encoder);
 static void ironlake_edp_pll_off(struct drm_encoder *encoder);
 
+void intel_dp_init_link_config(struct intel_dp *intel_dp)
+{
+       memset(intel_dp->link_configuration, 0, DP_LINK_CONFIGURATION_SIZE);
+       intel_dp->link_configuration[0] = intel_dp->link_bw;
+       intel_dp->link_configuration[1] = intel_dp->lane_count;
+       intel_dp->link_configuration[8] = DP_SET_ANSI_8B10B;
+       /*
+        * Check for DPCD version > 1.1 and enhanced framing support
+        */
+       if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
+           (intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP)) {
+               intel_dp->link_configuration[1] |= 
DP_LANE_COUNT_ENHANCED_FRAME_EN;
+       }
+}
+
 static void
 intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
                  struct drm_display_mode *adjusted_mode)
@@ -868,17 +883,8 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct 
drm_display_mode *mode,
                intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
                intel_write_eld(encoder, adjusted_mode);
        }
-       memset(intel_dp->link_configuration, 0, DP_LINK_CONFIGURATION_SIZE);
-       intel_dp->link_configuration[0] = intel_dp->link_bw;
-       intel_dp->link_configuration[1] = intel_dp->lane_count;
-       intel_dp->link_configuration[8] = DP_SET_ANSI_8B10B;
-       /*
-        * Check for DPCD version > 1.1 and enhanced framing support
-        */
-       if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
-           (intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP)) {
-               intel_dp->link_configuration[1] |= 
DP_LANE_COUNT_ENHANCED_FRAME_EN;
-       }
+
+       intel_dp_init_link_config(intel_dp);
 
        /* Split out the IBX/CPU vs CPT settings */
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 52c7547..1b9c549 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -382,6 +382,7 @@ extern void intel_dp_init(struct drm_device *dev, int 
output_reg,
 void
 intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
                 struct drm_display_mode *adjusted_mode);
+extern void intel_dp_init_link_config(struct intel_dp *intel_dp);
 extern bool intel_dpd_is_edp(struct drm_device *dev);
 extern void intel_edp_link_config(struct intel_encoder *, int *, int *);
 extern int intel_edp_target_clock(struct intel_encoder *,
-- 
1.7.11.2

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to