1 From 041444458835d7fb2c9f042598bfe16bf375b15d Mon Sep 17 00:00:00 2001
2 From: Manasi Navare <manasi.d.navare@intel.com>
3 Date: Tue, 9 Oct 2018 14:28:04 -0700
4 Subject: drm/i915/dp: Link train Fallback on eDP only if fallback link BW can fit panel's native mode
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 From: Manasi Navare <manasi.d.navare@intel.com>
11 commit 041444458835d7fb2c9f042598bfe16bf375b15d upstream.
13 This patch fixes the original commit c0cfb10d9e1de49 ("drm/i915/edp:
14 Do not do link training fallback or prune modes on EDP") that causes
15 a blank screen in case of certain eDP panels (Eg: seen on Dell XPS13 9350)
16 where first link training fails and a retraining is required by falling
17 back to lower link rate/lane count.
18 In case of some panels they advertise higher link rate/lane count
19 than whats required for supporting the panel's native mode.
20 But we always link train at highest link rate/lane count for eDP
21 and if that fails we can still fallback to lower link rate/lane count
22 as long as the fallback link BW still fits the native mode to avoid
23 pruning the panel's native mode yet retraining at fallback values
24 to recover from a blank screen.
27 * Add const for fixed_mode (Ville)
29 * Send uevent if link failure on eDP unconditionally
31 Fixes: c0cfb10d9e1d ("drm/i915/edp: Do not do link training fallback or prune modes on EDP")
32 Cc: Clinton Taylor <clinton.a.taylor@intel.com>
33 Cc: Jani Nikula <jani.nikula@linux.intel.com>
34 Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
35 Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
36 Cc: Lucas De Marchi <lucas.demarchi@intel.com>
37 Cc: <stable@vger.kernel.org> # v4.17+
38 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107489
39 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105338
40 Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
41 Tested-by: Alexander Wilson <alexander.wilson@ncf.edu>
42 Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
43 Link: https://patchwork.freedesktop.org/patch/msgid/20181009212804.702-1-manasi.d.navare@intel.com
44 (cherry picked from commit 1e712535c51ab025ebc776d4405683d81521996d)
45 Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
46 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
49 drivers/gpu/drm/i915/intel_dp.c | 30 ++++++++++++++++++++++++++
50 drivers/gpu/drm/i915/intel_dp_link_training.c | 26 +++++++---------------
51 2 files changed, 39 insertions(+), 17 deletions(-)
53 --- a/drivers/gpu/drm/i915/intel_dp.c
54 +++ b/drivers/gpu/drm/i915/intel_dp.c
55 @@ -387,6 +387,22 @@ static bool intel_dp_link_params_valid(s
59 +static bool intel_dp_can_link_train_fallback_for_edp(struct intel_dp *intel_dp,
63 + const struct drm_display_mode *fixed_mode =
64 + intel_dp->attached_connector->panel.fixed_mode;
65 + int mode_rate, max_rate;
67 + mode_rate = intel_dp_link_required(fixed_mode->clock, 18);
68 + max_rate = intel_dp_max_data_rate(link_rate, lane_count);
69 + if (mode_rate > max_rate)
75 int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
76 int link_rate, uint8_t lane_count)
78 @@ -396,9 +412,23 @@ int intel_dp_get_link_train_fallback_val
79 intel_dp->num_common_rates,
82 + if (intel_dp_is_edp(intel_dp) &&
83 + !intel_dp_can_link_train_fallback_for_edp(intel_dp,
84 + intel_dp->common_rates[index - 1],
86 + DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
89 intel_dp->max_link_rate = intel_dp->common_rates[index - 1];
90 intel_dp->max_link_lane_count = lane_count;
91 } else if (lane_count > 1) {
92 + if (intel_dp_is_edp(intel_dp) &&
93 + !intel_dp_can_link_train_fallback_for_edp(intel_dp,
94 + intel_dp_max_common_rate(intel_dp),
96 + DRM_DEBUG_KMS("Retrying Link training for eDP with same parameters\n");
99 intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
100 intel_dp->max_link_lane_count = lane_count >> 1;
102 --- a/drivers/gpu/drm/i915/intel_dp_link_training.c
103 +++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
104 @@ -335,22 +335,14 @@ intel_dp_start_link_train(struct intel_d
108 - /* Dont fallback and prune modes if its eDP */
109 - if (!intel_dp_is_edp(intel_dp)) {
110 - DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Link Training failed at link rate = %d, lane count = %d",
111 - intel_connector->base.base.id,
112 - intel_connector->base.name,
113 - intel_dp->link_rate, intel_dp->lane_count);
114 - if (!intel_dp_get_link_train_fallback_values(intel_dp,
115 - intel_dp->link_rate,
116 - intel_dp->lane_count))
117 - /* Schedule a Hotplug Uevent to userspace to start modeset */
118 - schedule_work(&intel_connector->modeset_retry_work);
120 - DRM_ERROR("[CONNECTOR:%d:%s] Link Training failed at link rate = %d, lane count = %d",
121 - intel_connector->base.base.id,
122 - intel_connector->base.name,
123 - intel_dp->link_rate, intel_dp->lane_count);
125 + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Link Training failed at link rate = %d, lane count = %d",
126 + intel_connector->base.base.id,
127 + intel_connector->base.name,
128 + intel_dp->link_rate, intel_dp->lane_count);
129 + if (!intel_dp_get_link_train_fallback_values(intel_dp,
130 + intel_dp->link_rate,
131 + intel_dp->lane_count))
132 + /* Schedule a Hotplug Uevent to userspace to start modeset */
133 + schedule_work(&intel_connector->modeset_retry_work);