aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-06-01 03:27:50 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-06-01 04:46:48 -0400
commit457c52d87e5dac9a4cf1a6a287e60ea7645067d4 (patch)
tree6fc664c9fdf9cbc3c70a5f9fe62b781ce4b0585a
parent1800ad255c4f0fdea3355d7055901482efa7e38a (diff)
drm/i915: Only ignore eDP ports that are connected
If the VBT says that a certain port should be eDP (and hence fused off from HDMI), but in reality it isn't, we need to try and acquire the HDMI connection instead. So only trust the VBT edp setting if we can connect to an eDP device on that port. Fixes: d2182a6608 (drm/i915: Don't register HDMI connectors for eDP ports on VLV/CHV) References: https://bugs.freedesktop.org/show_bug.cgi?id=96288 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Tested-by: Phidias Chiang <phidias.chiang@canonical.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Jani Nikula <jani.nikula@intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1464766070-31623-1-git-send-email-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/intel_display.c20
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c13
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
3 files changed, 17 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index fd140c398408..08b173cd8e3c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14702,6 +14702,8 @@ static void intel_setup_outputs(struct drm_device *dev)
14702 if (I915_READ(PCH_DP_D) & DP_DETECTED) 14702 if (I915_READ(PCH_DP_D) & DP_DETECTED)
14703 intel_dp_init(dev, PCH_DP_D, PORT_D); 14703 intel_dp_init(dev, PCH_DP_D, PORT_D);
14704 } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { 14704 } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
14705 bool has_edp;
14706
14705 /* 14707 /*
14706 * The DP_DETECTED bit is the latched state of the DDC 14708 * The DP_DETECTED bit is the latched state of the DDC
14707 * SDA pin at boot. However since eDP doesn't require DDC 14709 * SDA pin at boot. However since eDP doesn't require DDC
@@ -14711,19 +14713,17 @@ static void intel_setup_outputs(struct drm_device *dev)
14711 * eDP ports. Consult the VBT as well as DP_DETECTED to 14713 * eDP ports. Consult the VBT as well as DP_DETECTED to
14712 * detect eDP ports. 14714 * detect eDP ports.
14713 */ 14715 */
14714 if (I915_READ(VLV_HDMIB) & SDVO_DETECTED && 14716 has_edp = intel_dp_is_edp(dev, PORT_B);
14715 !intel_dp_is_edp(dev, PORT_B)) 14717 if (I915_READ(VLV_DP_B) & DP_DETECTED || has_edp)
14718 has_edp &= intel_dp_init(dev, VLV_DP_B, PORT_B);
14719 if (I915_READ(VLV_HDMIB) & SDVO_DETECTED && !has_edp)
14716 intel_hdmi_init(dev, VLV_HDMIB, PORT_B); 14720 intel_hdmi_init(dev, VLV_HDMIB, PORT_B);
14717 if (I915_READ(VLV_DP_B) & DP_DETECTED ||
14718 intel_dp_is_edp(dev, PORT_B))
14719 intel_dp_init(dev, VLV_DP_B, PORT_B);
14720 14721
14721 if (I915_READ(VLV_HDMIC) & SDVO_DETECTED && 14722 has_edp = intel_dp_is_edp(dev, PORT_C);
14722 !intel_dp_is_edp(dev, PORT_C)) 14723 if (I915_READ(VLV_DP_C) & DP_DETECTED || has_edp)
14724 has_edp &= intel_dp_init(dev, VLV_DP_C, PORT_C);
14725 if (I915_READ(VLV_HDMIC) & SDVO_DETECTED && !has_edp)
14723 intel_hdmi_init(dev, VLV_HDMIC, PORT_C); 14726 intel_hdmi_init(dev, VLV_HDMIC, PORT_C);
14724 if (I915_READ(VLV_DP_C) & DP_DETECTED ||
14725 intel_dp_is_edp(dev, PORT_C))
14726 intel_dp_init(dev, VLV_DP_C, PORT_C);
14727 14727
14728 if (IS_CHERRYVIEW(dev)) { 14728 if (IS_CHERRYVIEW(dev)) {
14729 /* eDP not supported on port D, so don't check VBT */ 14729 /* eDP not supported on port D, so don't check VBT */
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 096acbf04003..7dfff877fb55 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -5568,9 +5568,9 @@ fail:
5568 return false; 5568 return false;
5569} 5569}
5570 5570
5571void 5571bool intel_dp_init(struct drm_device *dev,
5572intel_dp_init(struct drm_device *dev, 5572 i915_reg_t output_reg,
5573 i915_reg_t output_reg, enum port port) 5573 enum port port)
5574{ 5574{
5575 struct drm_i915_private *dev_priv = dev->dev_private; 5575 struct drm_i915_private *dev_priv = dev->dev_private;
5576 struct intel_digital_port *intel_dig_port; 5576 struct intel_digital_port *intel_dig_port;
@@ -5580,7 +5580,7 @@ intel_dp_init(struct drm_device *dev,
5580 5580
5581 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL); 5581 intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
5582 if (!intel_dig_port) 5582 if (!intel_dig_port)
5583 return; 5583 return false;
5584 5584
5585 intel_connector = intel_connector_alloc(); 5585 intel_connector = intel_connector_alloc();
5586 if (!intel_connector) 5586 if (!intel_connector)
@@ -5637,7 +5637,7 @@ intel_dp_init(struct drm_device *dev,
5637 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) 5637 if (!intel_dp_init_connector(intel_dig_port, intel_connector))
5638 goto err_init_connector; 5638 goto err_init_connector;
5639 5639
5640 return; 5640 return true;
5641 5641
5642err_init_connector: 5642err_init_connector:
5643 drm_encoder_cleanup(encoder); 5643 drm_encoder_cleanup(encoder);
@@ -5645,8 +5645,7 @@ err_encoder_init:
5645 kfree(intel_connector); 5645 kfree(intel_connector);
5646err_connector_alloc: 5646err_connector_alloc:
5647 kfree(intel_dig_port); 5647 kfree(intel_dig_port);
5648 5648 return false;
5649 return;
5650} 5649}
5651 5650
5652void intel_dp_mst_suspend(struct drm_device *dev) 5651void intel_dp_mst_suspend(struct drm_device *dev)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9b5f6634c558..ebe7b3427e2e 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1312,7 +1312,7 @@ void intel_csr_ucode_suspend(struct drm_i915_private *);
1312void intel_csr_ucode_resume(struct drm_i915_private *); 1312void intel_csr_ucode_resume(struct drm_i915_private *);
1313 1313
1314/* intel_dp.c */ 1314/* intel_dp.c */
1315void intel_dp_init(struct drm_device *dev, i915_reg_t output_reg, enum port port); 1315bool intel_dp_init(struct drm_device *dev, i915_reg_t output_reg, enum port port);
1316bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port, 1316bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
1317 struct intel_connector *intel_connector); 1317 struct intel_connector *intel_connector);
1318void intel_dp_set_link_params(struct intel_dp *intel_dp, 1318void intel_dp_set_link_params(struct intel_dp *intel_dp,