Commit d93fa1b4 authored by Jani Nikula's avatar Jani Nikula

Revert "drm/i915/edp: Allow alternate fixed mode for eDP if available."

This reverts commit dc911f5b.

Per the report, no matter what display mode you select with xrandr, the
i915 driver will always select the alternate fixed mode. For the
reporter this means that the display will always run at 40Hz which is
quite annoying. This may be due to the mode comparison.

But there are some other potential issues. The choice of alt_fixed_mode
seems dubious. It's the first non-preferred mode, but there are no
guarantees that the only difference would be refresh rate. Similarly,
there may be more than one preferred mode in the probed modes list, and
the commit changes the preferred mode selection to choose the last one
on the list instead of the first.

(Note that the probed modes list is the raw, unfiltered, unsorted list
of modes from drm_add_edid_modes(), not the pretty result after a
drm_helper_probe_single_connector_modes() call.)

Finally, we already have eerily similar code in place to find the
downclock mode for DRRS that seems like could be reused here.

Back to the drawing board.

Note: This is a hand-crafted revert due to conflicts. If it fails to
backport, please just try reverting the original commit directly.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105469Reported-by: default avatarRune Petersen <rune@megahurts.dk>
Reported-by: default avatarMark Spencer <n7u4722r35@ynzlx.anonbox.net>
Fixes: dc911f5b ("drm/i915/edp: Allow alternate fixed mode for eDP if available.")
Cc: Clint Taylor <clinton.a.taylor@intel.com>
Cc: David Weinehall <david.weinehall@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Jim Bride <jim.bride@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v4.14+
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180516080110.22770-1-jani.nikula@intel.com
parent a268bcd7
...@@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp, ...@@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
return bpp; 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;
}
/* Adjust link config limits based on compliance test requests. */ /* Adjust link config limits based on compliance test requests. */
static void static void
intel_dp_adjust_compliance_config(struct intel_dp *intel_dp, intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
...@@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder *encoder, ...@@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder *encoder,
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON; pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) { if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
struct drm_display_mode *panel_mode = intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
intel_connector->panel.alt_fixed_mode; adjusted_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) { if (INTEL_GEN(dev_priv) >= 9) {
int ret; int ret;
...@@ -6137,7 +6112,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, ...@@ -6137,7 +6112,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_connector *connector = &intel_connector->base; struct drm_connector *connector = &intel_connector->base;
struct drm_display_mode *fixed_mode = NULL; struct drm_display_mode *fixed_mode = NULL;
struct drm_display_mode *alt_fixed_mode = NULL;
struct drm_display_mode *downclock_mode = NULL; struct drm_display_mode *downclock_mode = NULL;
bool has_dpcd; bool has_dpcd;
struct drm_display_mode *scan; struct drm_display_mode *scan;
...@@ -6192,14 +6166,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, ...@@ -6192,14 +6166,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
} }
intel_connector->edid = edid; intel_connector->edid = edid;
/* prefer fixed mode from EDID if available, save an alt mode also */ /* prefer fixed mode from EDID if available */
list_for_each_entry(scan, &connector->probed_modes, head) { list_for_each_entry(scan, &connector->probed_modes, head) {
if ((scan->type & DRM_MODE_TYPE_PREFERRED)) { if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
fixed_mode = drm_mode_duplicate(dev, scan); fixed_mode = drm_mode_duplicate(dev, scan);
downclock_mode = intel_dp_drrs_init( downclock_mode = intel_dp_drrs_init(
intel_connector, fixed_mode); intel_connector, fixed_mode);
} else if (!alt_fixed_mode) { break;
alt_fixed_mode = drm_mode_duplicate(dev, scan);
} }
} }
...@@ -6236,8 +6209,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, ...@@ -6236,8 +6209,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
pipe_name(pipe)); pipe_name(pipe));
} }
intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode, intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
downclock_mode);
intel_connector->panel.backlight.power = intel_edp_backlight_power; intel_connector->panel.backlight.power = intel_edp_backlight_power;
intel_panel_setup_backlight(connector, pipe); intel_panel_setup_backlight(connector, pipe);
......
...@@ -276,7 +276,6 @@ struct intel_encoder { ...@@ -276,7 +276,6 @@ struct intel_encoder {
struct intel_panel { struct intel_panel {
struct drm_display_mode *fixed_mode; struct drm_display_mode *fixed_mode;
struct drm_display_mode *alt_fixed_mode;
struct drm_display_mode *downclock_mode; struct drm_display_mode *downclock_mode;
/* backlight */ /* backlight */
...@@ -1855,7 +1854,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv); ...@@ -1855,7 +1854,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv);
/* intel_panel.c */ /* intel_panel.c */
int intel_panel_init(struct intel_panel *panel, int intel_panel_init(struct intel_panel *panel,
struct drm_display_mode *fixed_mode, struct drm_display_mode *fixed_mode,
struct drm_display_mode *alt_fixed_mode,
struct drm_display_mode *downclock_mode); struct drm_display_mode *downclock_mode);
void intel_panel_fini(struct intel_panel *panel); void intel_panel_fini(struct intel_panel *panel);
void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode, void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
......
...@@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv) ...@@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
connector->display_info.width_mm = fixed_mode->width_mm; connector->display_info.width_mm = fixed_mode->width_mm;
connector->display_info.height_mm = fixed_mode->height_mm; connector->display_info.height_mm = fixed_mode->height_mm;
intel_panel_init(&intel_connector->panel, fixed_mode, NULL, NULL); intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
intel_panel_setup_backlight(connector, INVALID_PIPE); intel_panel_setup_backlight(connector, INVALID_PIPE);
intel_dsi_add_properties(intel_connector); intel_dsi_add_properties(intel_connector);
......
...@@ -531,7 +531,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv) ...@@ -531,7 +531,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
*/ */
intel_panel_init(&intel_connector->panel, intel_panel_init(&intel_connector->panel,
intel_dvo_get_current_mode(intel_encoder), intel_dvo_get_current_mode(intel_encoder),
NULL, NULL); NULL);
intel_dvo->panel_wants_dither = true; intel_dvo->panel_wants_dither = true;
} }
......
...@@ -1177,8 +1177,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv) ...@@ -1177,8 +1177,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
out: out:
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
intel_panel_init(&intel_connector->panel, fixed_mode, NULL, intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
downclock_mode);
intel_panel_setup_backlight(connector, INVALID_PIPE); intel_panel_setup_backlight(connector, INVALID_PIPE);
lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
......
...@@ -1928,13 +1928,11 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel) ...@@ -1928,13 +1928,11 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
int intel_panel_init(struct intel_panel *panel, int intel_panel_init(struct intel_panel *panel,
struct drm_display_mode *fixed_mode, struct drm_display_mode *fixed_mode,
struct drm_display_mode *alt_fixed_mode,
struct drm_display_mode *downclock_mode) struct drm_display_mode *downclock_mode)
{ {
intel_panel_init_backlight_funcs(panel); intel_panel_init_backlight_funcs(panel);
panel->fixed_mode = fixed_mode; panel->fixed_mode = fixed_mode;
panel->alt_fixed_mode = alt_fixed_mode;
panel->downclock_mode = downclock_mode; panel->downclock_mode = downclock_mode;
return 0; return 0;
...@@ -1948,10 +1946,6 @@ void intel_panel_fini(struct intel_panel *panel) ...@@ -1948,10 +1946,6 @@ void intel_panel_fini(struct intel_panel *panel)
if (panel->fixed_mode) if (panel->fixed_mode)
drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
if (panel->alt_fixed_mode)
drm_mode_destroy(intel_connector->base.dev,
panel->alt_fixed_mode);
if (panel->downclock_mode) if (panel->downclock_mode)
drm_mode_destroy(intel_connector->base.dev, drm_mode_destroy(intel_connector->base.dev,
panel->downclock_mode); panel->downclock_mode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment