diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 38 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 6 |
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 | ||
| 1622 | static 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 | |||
| 1622 | bool | 1639 | bool |
| 1623 | intel_dp_compute_config(struct intel_encoder *encoder, | 1640 | intel_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 | ||
| 266 | struct intel_panel { | 266 | struct 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 */ |
| 1679 | int intel_panel_init(struct intel_panel *panel, | 1680 | int 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); |
| 1682 | void intel_panel_fini(struct intel_panel *panel); | 1684 | void intel_panel_fini(struct intel_panel *panel); |
| 1683 | void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode, | 1685 | void 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) | |||
| 1138 | out: | 1138 | out: |
| 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 | ||
| 1921 | int intel_panel_init(struct intel_panel *panel, | 1921 | int 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); |
