aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2018-05-16 04:01:10 -0400
committerJani Nikula <jani.nikula@intel.com>2018-05-22 05:36:05 -0400
commitd93fa1b47b8fcd149b5091f18385304f402a8e15 (patch)
treeb7d16b8d24e2bef8aee05a72d5e9c1b41ccf14c4
parenta268bcd7647d2c22bffdfbb111e5f7291b8494a6 (diff)
Revert "drm/i915/edp: Allow alternate fixed mode for eDP if available."
This reverts commit dc911f5bd8aacfcf8aabd5c26c88e04c837a938e. 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=105469 Reported-by: Rune Petersen <rune@megahurts.dk> Reported-by: Mark Spencer <n7u4722r35@ynzlx.anonbox.net> Fixes: dc911f5bd8aa ("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: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180516080110.22770-1-jani.nikula@intel.com
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c38
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.c2
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c2
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c3
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c6
6 files changed, 8 insertions, 45 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 102070940095..be99e56cf7d9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1679,23 +1679,6 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
1679 return bpp; 1679 return bpp;
1680} 1680}
1681 1681
1682static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
1683 struct drm_display_mode *m2)
1684{
1685 bool bres = false;
1686
1687 if (m1 && m2)
1688 bres = (m1->hdisplay == m2->hdisplay &&
1689 m1->hsync_start == m2->hsync_start &&
1690 m1->hsync_end == m2->hsync_end &&
1691 m1->htotal == m2->htotal &&
1692 m1->vdisplay == m2->vdisplay &&
1693 m1->vsync_start == m2->vsync_start &&
1694 m1->vsync_end == m2->vsync_end &&
1695 m1->vtotal == m2->vtotal);
1696 return bres;
1697}
1698
1699/* Adjust link config limits based on compliance test requests. */ 1682/* Adjust link config limits based on compliance test requests. */
1700static void 1683static void
1701intel_dp_adjust_compliance_config(struct intel_dp *intel_dp, 1684intel_dp_adjust_compliance_config(struct intel_dp *intel_dp,
@@ -1860,16 +1843,8 @@ intel_dp_compute_config(struct intel_encoder *encoder,
1860 pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON; 1843 pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
1861 1844
1862 if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) { 1845 if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
1863 struct drm_display_mode *panel_mode = 1846 intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
1864 intel_connector->panel.alt_fixed_mode; 1847 adjusted_mode);
1865 struct drm_display_mode *req_mode = &pipe_config->base.mode;
1866
1867 if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
1868 panel_mode = intel_connector->panel.fixed_mode;
1869
1870 drm_mode_debug_printmodeline(panel_mode);
1871
1872 intel_fixed_panel_mode(panel_mode, adjusted_mode);
1873 1848
1874 if (INTEL_GEN(dev_priv) >= 9) { 1849 if (INTEL_GEN(dev_priv) >= 9) {
1875 int ret; 1850 int ret;
@@ -6137,7 +6112,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6137 struct drm_i915_private *dev_priv = to_i915(dev); 6112 struct drm_i915_private *dev_priv = to_i915(dev);
6138 struct drm_connector *connector = &intel_connector->base; 6113 struct drm_connector *connector = &intel_connector->base;
6139 struct drm_display_mode *fixed_mode = NULL; 6114 struct drm_display_mode *fixed_mode = NULL;
6140 struct drm_display_mode *alt_fixed_mode = NULL;
6141 struct drm_display_mode *downclock_mode = NULL; 6115 struct drm_display_mode *downclock_mode = NULL;
6142 bool has_dpcd; 6116 bool has_dpcd;
6143 struct drm_display_mode *scan; 6117 struct drm_display_mode *scan;
@@ -6192,14 +6166,13 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6192 } 6166 }
6193 intel_connector->edid = edid; 6167 intel_connector->edid = edid;
6194 6168
6195 /* prefer fixed mode from EDID if available, save an alt mode also */ 6169 /* prefer fixed mode from EDID if available */
6196 list_for_each_entry(scan, &connector->probed_modes, head) { 6170 list_for_each_entry(scan, &connector->probed_modes, head) {
6197 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) { 6171 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
6198 fixed_mode = drm_mode_duplicate(dev, scan); 6172 fixed_mode = drm_mode_duplicate(dev, scan);
6199 downclock_mode = intel_dp_drrs_init( 6173 downclock_mode = intel_dp_drrs_init(
6200 intel_connector, fixed_mode); 6174 intel_connector, fixed_mode);
6201 } else if (!alt_fixed_mode) { 6175 break;
6202 alt_fixed_mode = drm_mode_duplicate(dev, scan);
6203 } 6176 }
6204 } 6177 }
6205 6178
@@ -6236,8 +6209,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6236 pipe_name(pipe)); 6209 pipe_name(pipe));
6237 } 6210 }
6238 6211
6239 intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode, 6212 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
6240 downclock_mode);
6241 intel_connector->panel.backlight.power = intel_edp_backlight_power; 6213 intel_connector->panel.backlight.power = intel_edp_backlight_power;
6242 intel_panel_setup_backlight(connector, pipe); 6214 intel_panel_setup_backlight(connector, pipe);
6243 6215
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ac19da7f8790..2bf383bb4b8d 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -276,7 +276,6 @@ struct intel_encoder {
276 276
277struct intel_panel { 277struct intel_panel {
278 struct drm_display_mode *fixed_mode; 278 struct drm_display_mode *fixed_mode;
279 struct drm_display_mode *alt_fixed_mode;
280 struct drm_display_mode *downclock_mode; 279 struct drm_display_mode *downclock_mode;
281 280
282 /* backlight */ 281 /* backlight */
@@ -1855,7 +1854,6 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv);
1855/* intel_panel.c */ 1854/* intel_panel.c */
1856int intel_panel_init(struct intel_panel *panel, 1855int intel_panel_init(struct intel_panel *panel,
1857 struct drm_display_mode *fixed_mode, 1856 struct drm_display_mode *fixed_mode,
1858 struct drm_display_mode *alt_fixed_mode,
1859 struct drm_display_mode *downclock_mode); 1857 struct drm_display_mode *downclock_mode);
1860void intel_panel_fini(struct intel_panel *panel); 1858void intel_panel_fini(struct intel_panel *panel);
1861void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode, 1859void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 51a1d6868b1e..cf39ca90d887 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1846,7 +1846,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
1846 connector->display_info.width_mm = fixed_mode->width_mm; 1846 connector->display_info.width_mm = fixed_mode->width_mm;
1847 connector->display_info.height_mm = fixed_mode->height_mm; 1847 connector->display_info.height_mm = fixed_mode->height_mm;
1848 1848
1849 intel_panel_init(&intel_connector->panel, fixed_mode, NULL, NULL); 1849 intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
1850 intel_panel_setup_backlight(connector, INVALID_PIPE); 1850 intel_panel_setup_backlight(connector, INVALID_PIPE);
1851 1851
1852 intel_dsi_add_properties(intel_connector); 1852 intel_dsi_add_properties(intel_connector);
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index a86f0398570f..7b942b6c1700 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -531,7 +531,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
531 */ 531 */
532 intel_panel_init(&intel_connector->panel, 532 intel_panel_init(&intel_connector->panel,
533 intel_dvo_get_current_mode(intel_encoder), 533 intel_dvo_get_current_mode(intel_encoder),
534 NULL, NULL); 534 NULL);
535 intel_dvo->panel_wants_dither = true; 535 intel_dvo->panel_wants_dither = true;
536 } 536 }
537 537
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index a92bb63b2f2d..17f297dca296 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -1177,8 +1177,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
1177out: 1177out:
1178 mutex_unlock(&dev->mode_config.mutex); 1178 mutex_unlock(&dev->mode_config.mutex);
1179 1179
1180 intel_panel_init(&intel_connector->panel, fixed_mode, NULL, 1180 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
1181 downclock_mode);
1182 intel_panel_setup_backlight(connector, INVALID_PIPE); 1181 intel_panel_setup_backlight(connector, INVALID_PIPE);
1183 1182
1184 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); 1183 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 41d00b1603e3..b443278e569c 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1928,13 +1928,11 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
1928 1928
1929int intel_panel_init(struct intel_panel *panel, 1929int intel_panel_init(struct intel_panel *panel,
1930 struct drm_display_mode *fixed_mode, 1930 struct drm_display_mode *fixed_mode,
1931 struct drm_display_mode *alt_fixed_mode,
1932 struct drm_display_mode *downclock_mode) 1931 struct drm_display_mode *downclock_mode)
1933{ 1932{
1934 intel_panel_init_backlight_funcs(panel); 1933 intel_panel_init_backlight_funcs(panel);
1935 1934
1936 panel->fixed_mode = fixed_mode; 1935 panel->fixed_mode = fixed_mode;
1937 panel->alt_fixed_mode = alt_fixed_mode;
1938 panel->downclock_mode = downclock_mode; 1936 panel->downclock_mode = downclock_mode;
1939 1937
1940 return 0; 1938 return 0;
@@ -1948,10 +1946,6 @@ void intel_panel_fini(struct intel_panel *panel)
1948 if (panel->fixed_mode) 1946 if (panel->fixed_mode)
1949 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); 1947 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
1950 1948
1951 if (panel->alt_fixed_mode)
1952 drm_mode_destroy(intel_connector->base.dev,
1953 panel->alt_fixed_mode);
1954
1955 if (panel->downclock_mode) 1949 if (panel->downclock_mode)
1956 drm_mode_destroy(intel_connector->base.dev, 1950 drm_mode_destroy(intel_connector->base.dev,
1957 panel->downclock_mode); 1951 panel->downclock_mode);