aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Bride <jim.bride@linux.intel.com>2017-08-09 15:48:53 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2017-08-15 19:43:33 -0400
commitdc911f5bd8aacfcf8aabd5c26c88e04c837a938e (patch)
tree9e26f2bbf3117e834b710314c0b46fb7266fd172
parentcf6e7bac6357f0ccca51fcb5eb325e724f6b4c95 (diff)
drm/i915/edp: Allow alternate fixed mode for eDP if available.
Some fixed resolution panels actually support more than one mode, with the only thing different being the refresh rate. Having this alternate mode available to us is desirable, because it allows us to test PSR on panels whose setup time at the preferred mode is too long. With this patch we allow the use of the alternate mode if it's available and it was specifically requested. v2 and v3: Rebase v4: * Fix up some leaky mode stuff (Chris) * Rebase v5: * Fix a NULL pointer derefrence (David Weinehall) v6: * Whitespace / spelling / checkpatch clean-up; no functional change. (David) * Rebase 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> Reviewed-by: David Weinehall <david.weinehall@linux.intel.com> Signed-off-by: Jim Bride <jim.bride@linux.intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/1502308133-26892-1-git-send-email-jim.bride@linux.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, 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);