Commit 9d2383c3 authored by Lukas Wunner's avatar Lukas Wunner Committed by Kamal Mostafa

drm/i915: Assume dual channel LVDS if pixel clock necessitates it

commit 6f317cfe upstream.

Single channel LVDS maxes out at 112 MHz, anything above must be dual
channel. This avoids the need to specify i915.lvds_channel_mode=2 on
all 17" MacBook Pro models with i915 graphics since they had 1920x1200
(193 MHz), plus those 15" pre-retina models which had a resolution
of 1680x1050 (119 MHz) as a BTO option.

Source for 112 MHz limit of single channel LVDS is section 2.3 of:
https://01.org/linuxgraphics/sites/default/files/documentation/ivb_ihd_os_vol3_part4.pdf

v2: Avoid hardcoding 17" models by assuming dual channel LVDS if the
resolution necessitates it, suggested by Jani Nikula.

v3: Fix typo, thanks Joonas Lahtinen.

v4: Split commit in two, suggested by Ville Syrjälä.
Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
Tested-by: default avatarLukas Wunner <lukas@wunner.de>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
[Jani: included spec reference into the commit message]
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
[ kamal: backport to 3.13-stable ]
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent fd06efa5
...@@ -891,6 +891,11 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) ...@@ -891,6 +891,11 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
if (i915_lvds_channel_mode > 0) if (i915_lvds_channel_mode > 0)
return i915_lvds_channel_mode == 2; return i915_lvds_channel_mode == 2;
/* single channel LVDS is limited to 112 MHz */
if (lvds_encoder->attached_connector->base.panel.fixed_mode->clock
> 112999)
return true;
if (dmi_check_system(intel_dual_link_lvds)) if (dmi_check_system(intel_dual_link_lvds))
return true; return true;
...@@ -1131,6 +1136,8 @@ void intel_lvds_init(struct drm_device *dev) ...@@ -1131,6 +1136,8 @@ void intel_lvds_init(struct drm_device *dev)
goto failed; goto failed;
out: out:
intel_panel_init(&intel_connector->panel, fixed_mode);
lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
DRM_DEBUG_KMS("detected %s-link lvds configuration\n", DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
lvds_encoder->is_dual_link ? "dual" : "single"); lvds_encoder->is_dual_link ? "dual" : "single");
...@@ -1142,7 +1149,6 @@ void intel_lvds_init(struct drm_device *dev) ...@@ -1142,7 +1149,6 @@ void intel_lvds_init(struct drm_device *dev)
} }
drm_sysfs_connector_add(connector); drm_sysfs_connector_add(connector);
intel_panel_init(&intel_connector->panel, fixed_mode);
intel_panel_setup_backlight(connector); intel_panel_setup_backlight(connector);
return; return;
......
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