|
@@ -14702,7 +14702,7 @@ static void intel_setup_outputs(struct drm_device *dev)
|
|
|
if (I915_READ(PCH_DP_D) & DP_DETECTED)
|
|
|
intel_dp_init(dev, PCH_DP_D, PORT_D);
|
|
|
} else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
|
|
|
- bool has_edp;
|
|
|
+ bool has_edp, has_port;
|
|
|
|
|
|
/*
|
|
|
* The DP_DETECTED bit is the latched state of the DDC
|
|
@@ -14712,25 +14712,37 @@ static void intel_setup_outputs(struct drm_device *dev)
|
|
|
* Thus we can't rely on the DP_DETECTED bit alone to detect
|
|
|
* eDP ports. Consult the VBT as well as DP_DETECTED to
|
|
|
* detect eDP ports.
|
|
|
+ *
|
|
|
+ * Sadly the straps seem to be missing sometimes even for HDMI
|
|
|
+ * ports (eg. on Voyo V3 - CHT x7-Z8700), so check both strap
|
|
|
+ * and VBT for the presence of the port. Additionally we can't
|
|
|
+ * trust the port type the VBT declares as we've seen at least
|
|
|
+ * HDMI ports that the VBT claim are DP or eDP.
|
|
|
*/
|
|
|
has_edp = intel_dp_is_edp(dev, PORT_B);
|
|
|
- if (I915_READ(VLV_DP_B) & DP_DETECTED || has_edp)
|
|
|
+ has_port = intel_bios_is_port_present(dev_priv, PORT_B);
|
|
|
+ if (I915_READ(VLV_DP_B) & DP_DETECTED || has_port)
|
|
|
has_edp &= intel_dp_init(dev, VLV_DP_B, PORT_B);
|
|
|
- if (I915_READ(VLV_HDMIB) & SDVO_DETECTED && !has_edp)
|
|
|
+ if ((I915_READ(VLV_HDMIB) & SDVO_DETECTED || has_port) && !has_edp)
|
|
|
intel_hdmi_init(dev, VLV_HDMIB, PORT_B);
|
|
|
|
|
|
has_edp = intel_dp_is_edp(dev, PORT_C);
|
|
|
- if (I915_READ(VLV_DP_C) & DP_DETECTED || has_edp)
|
|
|
+ has_port = intel_bios_is_port_present(dev_priv, PORT_C);
|
|
|
+ if (I915_READ(VLV_DP_C) & DP_DETECTED || has_port)
|
|
|
has_edp &= intel_dp_init(dev, VLV_DP_C, PORT_C);
|
|
|
- if (I915_READ(VLV_HDMIC) & SDVO_DETECTED && !has_edp)
|
|
|
+ if ((I915_READ(VLV_HDMIC) & SDVO_DETECTED || has_port) && !has_edp)
|
|
|
intel_hdmi_init(dev, VLV_HDMIC, PORT_C);
|
|
|
|
|
|
if (IS_CHERRYVIEW(dev)) {
|
|
|
- /* eDP not supported on port D, so don't check VBT */
|
|
|
- if (I915_READ(CHV_HDMID) & SDVO_DETECTED)
|
|
|
- intel_hdmi_init(dev, CHV_HDMID, PORT_D);
|
|
|
- if (I915_READ(CHV_DP_D) & DP_DETECTED)
|
|
|
+ /*
|
|
|
+ * eDP not supported on port D,
|
|
|
+ * so no need to worry about it
|
|
|
+ */
|
|
|
+ has_port = intel_bios_is_port_present(dev_priv, PORT_D);
|
|
|
+ if (I915_READ(CHV_DP_D) & DP_DETECTED || has_port)
|
|
|
intel_dp_init(dev, CHV_DP_D, PORT_D);
|
|
|
+ if (I915_READ(CHV_HDMID) & SDVO_DETECTED || has_port)
|
|
|
+ intel_hdmi_init(dev, CHV_HDMID, PORT_D);
|
|
|
}
|
|
|
|
|
|
intel_dsi_init(dev);
|