[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#661112: [regression 3.1 -> 3.2.6] Resume from suspend does not fully turn on laptop screen



forwarded 661112 https://bugs.freedesktop.org/show_bug.cgi?id=42263
# regression
severity 661112 important
tags 661112 + patch upstream
quit

Hi Enrico,

Enrico Zini wrote:

> since version 3.2.0, when I resume from suspend the laptop screen
> backlight turns on, but the screen contents remain all black. Other
> monitors connected to the system wake up fine.
>
> This bit of log from resume contains a relevant error:
>
> Feb 24 09:29:06 viaza kernel: [  186.037113] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx
> Feb 24 09:29:06 viaza kernel: [  186.037116] e1000e 0000:00:19.0: eth0: 10/100 speed: disabling TSO
> Feb 24 09:29:06 viaza kernel: [  186.810811] [drm:intel_dp_complete_link_train] *ERROR* failed to train DP, aborting
[...]
> http://forums.gentoo.org/viewtopic-p-6921616.html?sid=afa6e13df7286caeeb27e9a3b1e0d4a8
> and https://bugs.gentoo.org/show_bug.cgi?id=398149

Thanks.  Lubos Kolouch bisected this to v3.2-rc1~135^2~2^2~7, the same
commit that triggers the unsolved <http://bugs.debian.org/658662>. :/

Said to be fixed by the following patch, which is queued for 3.2.7.
See [1] if you would like to try it.

[1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official
or the corresponding page in the debian-kernel-handbook package

commit 3d794f87238f
Author: Keith Packard <keithp@keithp.com>
Date:   Wed Jan 25 08:16:25 2012 -0800

    drm/i915: Force explicit bpp selection for intel_dp_link_required
    
    commit c898261c0dad617f0f1080bedc02d507a2fcfb92 upstream.
    
    It is never correct to use intel_crtc->bpp in intel_dp_link_required,
    so instead pass an explicit bpp in to this function. This patch
    only supports 18bpp and 24bpp modes, which means that 10bpc modes will
    be computed incorrectly. Fixing that will require more extensive
    changes, and so must be addressed separately from this bugfix.
    
    intel_dp_link_required is called from intel_dp_mode_valid and
    intel_dp_mode_fixup.
    
    * intel_dp_mode_valid is called to list supported modes; in this case,
      the current crtc values cannot be relevant as the modes in question
      may never be selected. Thus, using intel_crtc->bpp is never right.
    
    * intel_dp_mode_fixup is called during mode setting, but it is run
      well before ironlake_crtc_mode_set is called to set intel_crtc->bpp,
      so using intel_crtc-bpp in this path can only ever get a stale
      value.
    
    Cc: Lubos Kolouch <lubos.kolouch@gmail.com>
    Cc: Adam Jackson <ajax@redhat.com>
    Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42263
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44881
    Tested-by: Dave Airlie <airlied@redhat.com>
    Tested-by: camalot@picnicpark.org (Dell Latitude 6510)
    Tested-by: Roland Dreier <roland@digitalvampire.org>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index db3b461ad412..94f860cce3f7 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -208,17 +208,8 @@ intel_dp_link_clock(uint8_t link_bw)
  */
 
 static int
-intel_dp_link_required(struct intel_dp *intel_dp, int pixel_clock, int check_bpp)
+intel_dp_link_required(int pixel_clock, int bpp)
 {
-	struct drm_crtc *crtc = intel_dp->base.base.crtc;
-	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-	int bpp = 24;
-
-	if (check_bpp)
-		bpp = check_bpp;
-	else if (intel_crtc)
-		bpp = intel_crtc->bpp;
-
 	return (pixel_clock * bpp + 9) / 10;
 }
 
@@ -245,12 +236,11 @@ intel_dp_mode_valid(struct drm_connector *connector,
 			return MODE_PANEL;
 	}
 
-	mode_rate = intel_dp_link_required(intel_dp, mode->clock, 0);
+	mode_rate = intel_dp_link_required(mode->clock, 24);
 	max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
 
 	if (mode_rate > max_rate) {
-			mode_rate = intel_dp_link_required(intel_dp,
-							   mode->clock, 18);
+			mode_rate = intel_dp_link_required(mode->clock, 18);
 			if (mode_rate > max_rate)
 				return MODE_CLOCK_HIGH;
 			else
@@ -683,7 +673,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
 	int lane_count, clock;
 	int max_lane_count = intel_dp_max_lane_count(intel_dp);
 	int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0;
-	int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 0;
+	int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24;
 	static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 };
 
 	if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
@@ -701,7 +691,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
 		for (clock = 0; clock <= max_clock; clock++) {
 			int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count);
 
-			if (intel_dp_link_required(intel_dp, mode->clock, bpp)
+			if (intel_dp_link_required(mode->clock, bpp)
 					<= link_avail) {
 				intel_dp->link_bw = bws[clock];
 				intel_dp->lane_count = lane_count;



Reply to: