aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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, 45 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index e5f787319725..4fd4853b2250 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1619,6 +1619,23 @@ static int intel_dp_compute_bpp(struct intel_dp *intel_dp,
1619 return bpp; 1619 return bpp;
1620} 1620}
1621 1621
1622static bool intel_edp_compare_alt_mode(struct drm_display_mode *m1,
1623 struct drm_display_mode *m2)
1624{
1625 bool bres = false;
1626
1627 if (m1 && m2)
1628 bres = (m1->hdisplay == m2->hdisplay &&
1629 m1->hsync_start == m2->hsync_start &&
1630 m1->hsync_end == m2->hsync_end &&
1631 m1->htotal == m2->htotal &&
1632 m1->vdisplay == m2->vdisplay &&
1633 m1->vsync_start == m2->vsync_start &&
1634 m1->vsync_end == m2->vsync_end &&
1635 m1->vtotal == m2->vtotal);
1636 return bres;
1637}
1638
1622bool 1639bool
1623intel_dp_compute_config(struct intel_encoder *encoder, 1640intel_dp_compute_config(struct intel_encoder *encoder,
1624 struct intel_crtc_state *pipe_config, 1641 struct intel_crtc_state *pipe_config,
@@ -1665,8 +1682,16 @@ intel_dp_compute_config(struct intel_encoder *encoder,
1665 pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON; 1682 pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
1666 1683
1667 if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) { 1684 if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
1668 intel_fixed_panel_mode(intel_connector->panel.fixed_mode, 1685 struct drm_display_mode *panel_mode =
1669 adjusted_mode); 1686 intel_connector->panel.alt_fixed_mode;
1687 struct drm_display_mode *req_mode = &pipe_config->base.mode;
1688
1689 if (!intel_edp_compare_alt_mode(req_mode, panel_mode))
1690 panel_mode = intel_connector->panel.fixed_mode;
1691
1692 drm_mode_debug_printmodeline(panel_mode);
1693
1694 intel_fixed_panel_mode(panel_mode, adjusted_mode);
1670 1695
1671 if (INTEL_GEN(dev_priv) >= 9) { 1696 if (INTEL_GEN(dev_priv) >= 9) {
1672 int ret; 1697 int ret;
@@ -5794,6 +5819,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
5794 struct drm_device *dev = intel_encoder->base.dev; 5819 struct drm_device *dev = intel_encoder->base.dev;
5795 struct drm_i915_private *dev_priv = to_i915(dev); 5820 struct drm_i915_private *dev_priv = to_i915(dev);
5796 struct drm_display_mode *fixed_mode = NULL; 5821 struct drm_display_mode *fixed_mode = NULL;
5822 struct drm_display_mode *alt_fixed_mode = NULL;
5797 struct drm_display_mode *downclock_mode = NULL; 5823 struct drm_display_mode *downclock_mode = NULL;
5798 bool has_dpcd; 5824 bool has_dpcd;
5799 struct drm_display_mode *scan; 5825 struct drm_display_mode *scan;
@@ -5849,13 +5875,14 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
5849 } 5875 }
5850 intel_connector->edid = edid; 5876 intel_connector->edid = edid;
5851 5877
5852 /* prefer fixed mode from EDID if available */ 5878 /* prefer fixed mode from EDID if available, save an alt mode also */
5853 list_for_each_entry(scan, &connector->probed_modes, head) { 5879 list_for_each_entry(scan, &connector->probed_modes, head) {
5854 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) { 5880 if ((scan->type & DRM_MODE_TYPE_PREFERRED)) {
5855 fixed_mode = drm_mode_duplicate(dev, scan); 5881 fixed_mode = drm_mode_duplicate(dev, scan);
5856 downclock_mode = intel_dp_drrs_init( 5882 downclock_mode = intel_dp_drrs_init(
5857 intel_connector, fixed_mode); 5883 intel_connector, fixed_mode);
5858 break; 5884 } else if (!alt_fixed_mode) {
5885 alt_fixed_mode = drm_mode_duplicate(dev, scan);
5859 } 5886 }
5860 } 5887 }
5861 5888
@@ -5892,7 +5919,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
5892 pipe_name(pipe)); 5919 pipe_name(pipe));
5893 } 5920 }
5894 5921
5895 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); 5922 intel_panel_init(&intel_connector->panel, fixed_mode, alt_fixed_mode,
5923 downclock_mode);
5896 intel_connector->panel.backlight.power = intel_edp_backlight_power; 5924 intel_connector->panel.backlight.power = intel_edp_backlight_power;
5897 intel_panel_setup_backlight(connector, pipe); 5925 intel_panel_setup_backlight(connector, pipe);
5898 5926
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index b1dd5d6ed0f3..fa47285918f4 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -265,6 +265,7 @@ struct intel_encoder {
265 265
266struct intel_panel { 266struct intel_panel {
267 struct drm_display_mode *fixed_mode; 267 struct drm_display_mode *fixed_mode;
268 struct drm_display_mode *alt_fixed_mode;
268 struct drm_display_mode *downclock_mode; 269 struct drm_display_mode *downclock_mode;
269 270
270 /* backlight */ 271 /* backlight */
@@ -1678,6 +1679,7 @@ void intel_overlay_reset(struct drm_i915_private *dev_priv);
1678/* intel_panel.c */ 1679/* intel_panel.c */
1679int intel_panel_init(struct intel_panel *panel, 1680int intel_panel_init(struct intel_panel *panel,
1680 struct drm_display_mode *fixed_mode, 1681 struct drm_display_mode *fixed_mode,
1682 struct drm_display_mode *alt_fixed_mode,
1681 struct drm_display_mode *downclock_mode); 1683 struct drm_display_mode *downclock_mode);
1682void intel_panel_fini(struct intel_panel *panel); 1684void intel_panel_fini(struct intel_panel *panel);
1683void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode, 1685void 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 b0b3adf016f8..f0c11aec5ea5 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1849,7 +1849,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
1849 connector->display_info.width_mm = fixed_mode->width_mm; 1849 connector->display_info.width_mm = fixed_mode->width_mm;
1850 connector->display_info.height_mm = fixed_mode->height_mm; 1850 connector->display_info.height_mm = fixed_mode->height_mm;
1851 1851
1852 intel_panel_init(&intel_connector->panel, fixed_mode, NULL); 1852 intel_panel_init(&intel_connector->panel, fixed_mode, NULL, NULL);
1853 intel_panel_setup_backlight(connector, INVALID_PIPE); 1853 intel_panel_setup_backlight(connector, INVALID_PIPE);
1854 1854
1855 intel_dsi_add_properties(intel_connector); 1855 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 baf369d2de30..c0a027274c06 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -552,7 +552,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
552 */ 552 */
553 intel_panel_init(&intel_connector->panel, 553 intel_panel_init(&intel_connector->panel,
554 intel_dvo_get_current_mode(connector), 554 intel_dvo_get_current_mode(connector),
555 NULL); 555 NULL, NULL);
556 intel_dvo->panel_wants_dither = true; 556 intel_dvo->panel_wants_dither = true;
557 } 557 }
558 558
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 61d557948e21..8e215777c7f4 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -1138,7 +1138,8 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
1138out: 1138out:
1139 mutex_unlock(&dev->mode_config.mutex); 1139 mutex_unlock(&dev->mode_config.mutex);
1140 1140
1141 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); 1141 intel_panel_init(&intel_connector->panel, fixed_mode, NULL,
1142 downclock_mode);
1142 intel_panel_setup_backlight(connector, INVALID_PIPE); 1143 intel_panel_setup_backlight(connector, INVALID_PIPE);
1143 1144
1144 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); 1145 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 88018fccdb9f..a17b1de7d7e0 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1920,11 +1920,13 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
1920 1920
1921int intel_panel_init(struct intel_panel *panel, 1921int intel_panel_init(struct intel_panel *panel,
1922 struct drm_display_mode *fixed_mode, 1922 struct drm_display_mode *fixed_mode,
1923 struct drm_display_mode *alt_fixed_mode,
1923 struct drm_display_mode *downclock_mode) 1924 struct drm_display_mode *downclock_mode)
1924{ 1925{
1925 intel_panel_init_backlight_funcs(panel); 1926 intel_panel_init_backlight_funcs(panel);
1926 1927
1927 panel->fixed_mode = fixed_mode; 1928 panel->fixed_mode = fixed_mode;
1929 panel->alt_fixed_mode = alt_fixed_mode;
1928 panel->downclock_mode = downclock_mode; 1930 panel->downclock_mode = downclock_mode;
1929 1931
1930 return 0; 1932 return 0;
@@ -1938,6 +1940,10 @@ void intel_panel_fini(struct intel_panel *panel)
1938 if (panel->fixed_mode) 1940 if (panel->fixed_mode)
1939 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); 1941 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
1940 1942
1943 if (panel->alt_fixed_mode)
1944 drm_mode_destroy(intel_connector->base.dev,
1945 panel->alt_fixed_mode);
1946
1941 if (panel->downclock_mode) 1947 if (panel->downclock_mode)
1942 drm_mode_destroy(intel_connector->base.dev, 1948 drm_mode_destroy(intel_connector->base.dev,
1943 panel->downclock_mode); 1949 panel->downclock_mode);