|
@@ -1619,6 +1619,23 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
|
|
|
return bpp;
|
|
|
}
|
|
|
|
|
|
+static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
|
|
|
+ struct drm_display_mode *m2)
|
|
|
+{
|
|
|
+ bool bres = false;
|
|
|
+
|
|
|
+ if (m1 && m2)
|
|
|
+ bres = (m1->hdisplay == m2->hdisplay &&
|
|
|
+ m1->hsync_start == m2->hsync_start &&
|
|
|
+ m1->hsync_end == m2->hsync_end &&
|
|
|
+ m1->htotal == m2->htotal &&
|
|
|
+ m1->vdisplay == m2->vdisplay &&
|
|
|
+ m1->vsync_start == m2->vsync_start &&
|
|
|
+ m1->vsync_end == m2->vsync_end &&
|
|
|
+ m1->vtotal == m2->vtotal);
|
|
|
+ return bres;
|
|
|
+}
|
|
|
+
|
|
|
bool
|
|
|
intel_dp_compute_config(struct intel_encoder *encoder,
|
|
|
struct intel_crtc_state *pipe_config,
|
|
@@ -1665,8 +1682,16 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
|
|
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
|
|
|
|
|
|
if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
|
|
|
- intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
|
|
|
- adjusted_mode);
|
|
|
+ struct drm_display_mode *panel_mode =
|
|
|
+ intel_connector->panel.alt_fixed_mode;
|
|
|
+ struct drm_display_mode *req_mode = &pipe_config->base.mode;
|
|
|
+
|
|
|
+ if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
|
|
|
+ panel_mode = intel_connector->panel.fixed_mode;
|
|
|
+
|
|
|
+ drm_mode_debug_printmodeline(panel_mode);
|
|
|
+
|
|
|
+ intel_fixed_panel_mode(panel_mode, adjusted_mode);
|
|
|
|
|
|
if (INTEL_GEN(dev_priv) >= 9) {
|
|
|
int ret;
|
|
@@ -5794,6 +5819,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
|
|
struct drm_device *dev = intel_encoder->base.dev;
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
|
|
struct drm_display_mode *fixed_mode = NULL;
|
|
|
+ struct drm_display_mode *alt_fixed_mode = NULL;
|
|
|
struct drm_display_mode *downclock_mode = NULL;
|
|
|
bool has_dpcd;
|
|
|
struct drm_display_mode *scan;
|
|
@@ -5849,13 +5875,14 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
|
|
}
|
|
|
intel_connector->edid = edid;
|
|
|
|
|
|
- /* prefer fixed mode from EDID if available */
|
|
|
+ /* prefer fixed mode from EDID if available, save an alt mode also */
|
|
|
list_for_each_entry(scan, &connector->probed_modes, head) {
|
|
|
if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
|
|
|
fixed_mode = drm_mode_duplicate(dev, scan);
|
|
|
downclock_mode = intel_dp_drrs_init(
|
|
|
intel_connector, fixed_mode);
|
|
|
- break;
|
|
|
+ } else if (!alt_fixed_mode) {
|
|
|
+ alt_fixed_mode = drm_mode_duplicate(dev, scan);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5892,7 +5919,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
|
|
pipe_name(pipe));
|
|
|
}
|
|
|
|
|
|
- intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
|
|
|
+ intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
|
|
|
+ downclock_mode);
|
|
|
intel_connector->panel.backlight.power = intel_edp_backlight_power;
|
|
|
intel_panel_setup_backlight(connector, pipe);
|
|
|
|