|
@@ -420,6 +420,9 @@ intel_dp_mode_valid(struct drm_connector *connector,
|
|
int max_rate, mode_rate, max_lanes, max_link_clock;
|
|
int max_rate, mode_rate, max_lanes, max_link_clock;
|
|
int max_dotclk;
|
|
int max_dotclk;
|
|
|
|
|
|
|
|
+ if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
|
|
+ return MODE_NO_DBLESCAN;
|
|
|
|
+
|
|
max_dotclk = intel_dp_downstream_max_dotclock(intel_dp);
|
|
max_dotclk = intel_dp_downstream_max_dotclock(intel_dp);
|
|
|
|
|
|
if (intel_dp_is_edp(intel_dp) && fixed_mode) {
|
|
if (intel_dp_is_edp(intel_dp) && fixed_mode) {
|
|
@@ -1862,7 +1865,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
|
conn_state->scaling_mode);
|
|
conn_state->scaling_mode);
|
|
}
|
|
}
|
|
|
|
|
|
- if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
|
|
|
|
|
|
+ if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ if (HAS_GMCH_DISPLAY(dev_priv) &&
|
|
adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -2782,16 +2788,6 @@ static void intel_disable_dp(struct intel_encoder *encoder,
|
|
static void g4x_disable_dp(struct intel_encoder *encoder,
|
|
static void g4x_disable_dp(struct intel_encoder *encoder,
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
const struct drm_connector_state *old_conn_state)
|
|
const struct drm_connector_state *old_conn_state)
|
|
-{
|
|
|
|
- intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
|
|
|
-
|
|
|
|
- /* disable the port before the pipe on g4x */
|
|
|
|
- intel_dp_link_down(encoder, old_crtc_state);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void ilk_disable_dp(struct intel_encoder *encoder,
|
|
|
|
- const struct intel_crtc_state *old_crtc_state,
|
|
|
|
- const struct drm_connector_state *old_conn_state)
|
|
|
|
{
|
|
{
|
|
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
|
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
|
}
|
|
}
|
|
@@ -2807,13 +2803,19 @@ static void vlv_disable_dp(struct intel_encoder *encoder,
|
|
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
|
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
|
}
|
|
}
|
|
|
|
|
|
-static void ilk_post_disable_dp(struct intel_encoder *encoder,
|
|
|
|
|
|
+static void g4x_post_disable_dp(struct intel_encoder *encoder,
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
const struct drm_connector_state *old_conn_state)
|
|
const struct drm_connector_state *old_conn_state)
|
|
{
|
|
{
|
|
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
|
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
|
enum port port = encoder->port;
|
|
enum port port = encoder->port;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Bspec does not list a specific disable sequence for g4x DP.
|
|
|
|
+ * Follow the ilk+ sequence (disable pipe before the port) for
|
|
|
|
+ * g4x DP as it does not suffer from underruns like the normal
|
|
|
|
+ * g4x modeset sequence (disable pipe after the port).
|
|
|
|
+ */
|
|
intel_dp_link_down(encoder, old_crtc_state);
|
|
intel_dp_link_down(encoder, old_crtc_state);
|
|
|
|
|
|
/* Only ilk+ has port A */
|
|
/* Only ilk+ has port A */
|
|
@@ -6337,7 +6339,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
|
drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
|
|
drm_connector_init(dev, connector, &intel_dp_connector_funcs, type);
|
|
drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
|
|
drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
|
|
|
|
|
|
- if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
|
|
|
|
|
|
+ if (!HAS_GMCH_DISPLAY(dev_priv))
|
|
connector->interlace_allowed = true;
|
|
connector->interlace_allowed = true;
|
|
connector->doublescan_allowed = 0;
|
|
connector->doublescan_allowed = 0;
|
|
|
|
|
|
@@ -6436,15 +6438,11 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
|
|
intel_encoder->enable = vlv_enable_dp;
|
|
intel_encoder->enable = vlv_enable_dp;
|
|
intel_encoder->disable = vlv_disable_dp;
|
|
intel_encoder->disable = vlv_disable_dp;
|
|
intel_encoder->post_disable = vlv_post_disable_dp;
|
|
intel_encoder->post_disable = vlv_post_disable_dp;
|
|
- } else if (INTEL_GEN(dev_priv) >= 5) {
|
|
|
|
- intel_encoder->pre_enable = g4x_pre_enable_dp;
|
|
|
|
- intel_encoder->enable = g4x_enable_dp;
|
|
|
|
- intel_encoder->disable = ilk_disable_dp;
|
|
|
|
- intel_encoder->post_disable = ilk_post_disable_dp;
|
|
|
|
} else {
|
|
} else {
|
|
intel_encoder->pre_enable = g4x_pre_enable_dp;
|
|
intel_encoder->pre_enable = g4x_pre_enable_dp;
|
|
intel_encoder->enable = g4x_enable_dp;
|
|
intel_encoder->enable = g4x_enable_dp;
|
|
intel_encoder->disable = g4x_disable_dp;
|
|
intel_encoder->disable = g4x_disable_dp;
|
|
|
|
+ intel_encoder->post_disable = g4x_post_disable_dp;
|
|
}
|
|
}
|
|
|
|
|
|
intel_dig_port->dp.output_reg = output_reg;
|
|
intel_dig_port->dp.output_reg = output_reg;
|