View Issue Details

IDProjectCategoryView StatusLast Update
0008339CentOS-6kernelpublic2015-03-24 19:39
ReporterBrent Collins 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
PlatformDell Venue 11 Pro 7139OSOS Version
Product Version6.6 
Target VersionFixed in Version 
Summary0008339: eDP initialization for i915 driver causes some displays to become unresponsive
DescriptionThere is a bug in the eDP initialization code of the i915 driver that can cause some displays to completely stop responding right after initialization. So, these displays stop showing anything immediately once the kernel does the eDP initialization.

A patch for this issue already exists upstream and I have attached a version of that for the CentOS 2.6.32-504.8.1 kernel.
Steps To ReproduceInstall CentOS 6.6 on the Dell Venue 11 Pro 7139 and try to boot the system, notice the screen goes black and stays blacks right after the bootloader has launched the kernel. Using "nomodeset" will workaround the issue by because it effectively disables the i915 driver for this hardware.
Additional InformationThe upstream commit where the problem was fixed is: https://github.com/torvalds/linux/commit/56071a207602a451f0c46d3dcc8379b59ef576e2
TagsNo tags attached.

Activities

Brent Collins

Brent Collins

2015-03-24 19:39

reporter  

i915-fix-edp-init.patch (2,817 bytes)
# This patch is needed in order to allow the internal display on the Dell Venue 11 Pro 7139 to work. The DisplayPort initialization
# code was making that display unhappy where it basically stopped responding to the driver.
# 
# Links
# Informational: https://bugs.freedesktop.org/show_bug.cgi?id=73539
# Upstream commit: https://github.com/torvalds/linux/commit/56071a207602a451f0c46d3dcc8379b59ef576e2

diff -Nurp linux-2.6.32-504.8.1.el6/drivers/gpu/drm/i915/intel_dp.c linux-2.6.32-504.8.1.el6.new/drivers/gpu/drm/i915/intel_dp.c
--- linux-2.6.32-504.8.1.el6/drivers/gpu/drm/i915/intel_dp.c	2014-12-19 10:31:22.000000000 -0600
+++ linux-2.6.32-504.8.1.el6.new/drivers/gpu/drm/i915/intel_dp.c	2015-03-13 17:14:46.524756846 -0500
@@ -716,8 +716,10 @@ intel_dp_compute_config(struct intel_enc
 	struct intel_crtc *intel_crtc = encoder->new_crtc;
 	struct intel_connector *intel_connector = intel_dp->attached_connector;
 	int lane_count, clock;
+	int min_lane_count = 1;
 	int max_lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
 	/* Conveniently, the link BW constants become indices with a shift...*/
+	int min_clock = 0;
 	int max_clock = intel_dp_max_link_bw(intel_dp) >> 3;
 	int bpp, mode_rate;
 	static int bws[] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7, DP_LINK_BW_5_4 };
@@ -750,19 +752,33 @@ intel_dp_compute_config(struct intel_enc
 	/* Walk through all bpp values. Luckily they're all nicely spaced with 2
 	 * bpc in between. */
 	bpp = pipe_config->pipe_bpp;
-	if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp &&
-	    dev_priv->vbt.edp_bpp < bpp) {
-		DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
-			      dev_priv->vbt.edp_bpp);
-		bpp = dev_priv->vbt.edp_bpp;
+	if (is_edp(intel_dp)) {
+		if (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp) {
+			DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
+				dev_priv->vbt.edp_bpp);
+			bpp = dev_priv->vbt.edp_bpp;
+		}
+
+		if (dev_priv->vbt.edp_lanes) {
+			min_lane_count = min(dev_priv->vbt.edp_lanes,
+				max_lane_count);
+			DRM_DEBUG_KMS("using min %u lanes per VBT\n",
+				min_lane_count);
+		}
+
+		if (dev_priv->vbt.edp_rate) {
+			min_clock = min(dev_priv->vbt.edp_rate >> 3, max_clock);
+			DRM_DEBUG_KMS("using min %02x link bw per VBT\n",
+				bws[min_clock]);
+		}
 	}
 
 	for (; bpp >= 6*3; bpp -= 2*3) {
 		mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
 						   bpp);
 
-		for (clock = 0; clock <= max_clock; clock++) {
-			for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) {
+		for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) {
+			for (clock = min_clock; clock <= max_clock; clock++) {
 				link_clock = drm_dp_bw_code_to_link_rate(bws[clock]);
 				link_avail = intel_dp_max_data_rate(link_clock,
 								    lane_count);
i915-fix-edp-init.patch (2,817 bytes)

Issue History

Date Modified Username Field Change
2015-03-24 19:39 Brent Collins New Issue
2015-03-24 19:39 Brent Collins File Added: i915-fix-edp-init.patch