Commit 10f76a38 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm/i915: Inspect the right status bits for DP/HDMI hotplug on gen4

The status bits corresponding to the interrupt enable bits are the
"live" hotplug status bits, and reflect the current status of the port
(high for a detected connection, low for a disconnect). The actual bits
corresponding to the interrupt source are elsewhere. The actual event is
then determined by a combination of the interrupt flag and the current
live status (if the interrupt is active, but the current status is not,
then we have detected a disconnect.)
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent adca4730
...@@ -1558,12 +1558,21 @@ ...@@ -1558,12 +1558,21 @@
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
#define PORT_HOTPLUG_STAT 0x61114 #define PORT_HOTPLUG_STAT 0x61114
#define HDMIB_HOTPLUG_INT_STATUS (1 << 29) /* HDMI/DP bits are gen4+ */
#define DPB_HOTPLUG_INT_STATUS (1 << 29) #define DPB_HOTPLUG_LIVE_STATUS (1 << 29)
#define HDMIC_HOTPLUG_INT_STATUS (1 << 28) #define DPC_HOTPLUG_LIVE_STATUS (1 << 28)
#define DPC_HOTPLUG_INT_STATUS (1 << 28) #define DPD_HOTPLUG_LIVE_STATUS (1 << 27)
#define HDMID_HOTPLUG_INT_STATUS (1 << 27) #define DPD_HOTPLUG_INT_STATUS (3 << 21)
#define DPD_HOTPLUG_INT_STATUS (1 << 27) #define DPC_HOTPLUG_INT_STATUS (3 << 19)
#define DPB_HOTPLUG_INT_STATUS (3 << 17)
/* HDMI bits are shared with the DP bits */
#define HDMIB_HOTPLUG_LIVE_STATUS (1 << 29)
#define HDMIC_HOTPLUG_LIVE_STATUS (1 << 28)
#define HDMID_HOTPLUG_LIVE_STATUS (1 << 27)
#define HDMID_HOTPLUG_INT_STATUS (3 << 21)
#define HDMIC_HOTPLUG_INT_STATUS (3 << 19)
#define HDMIB_HOTPLUG_INT_STATUS (3 << 17)
/* CRT/TV/SDVO common between gen3+ */
#define CRT_HOTPLUG_INT_STATUS (1 << 11) #define CRT_HOTPLUG_INT_STATUS (1 << 11)
#define TV_HOTPLUG_INT_STATUS (1 << 10) #define TV_HOTPLUG_INT_STATUS (1 << 10)
#define CRT_HOTPLUG_MONITOR_MASK (3 << 8) #define CRT_HOTPLUG_MONITOR_MASK (3 << 8)
......
...@@ -2066,25 +2066,23 @@ g4x_dp_detect(struct intel_dp *intel_dp) ...@@ -2066,25 +2066,23 @@ g4x_dp_detect(struct intel_dp *intel_dp)
{ {
struct drm_device *dev = intel_dp->base.base.dev; struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t temp, bit; uint32_t bit;
switch (intel_dp->output_reg) { switch (intel_dp->output_reg) {
case DP_B: case DP_B:
bit = DPB_HOTPLUG_INT_STATUS; bit = DPB_HOTPLUG_LIVE_STATUS;
break; break;
case DP_C: case DP_C:
bit = DPC_HOTPLUG_INT_STATUS; bit = DPC_HOTPLUG_LIVE_STATUS;
break; break;
case DP_D: case DP_D:
bit = DPD_HOTPLUG_INT_STATUS; bit = DPD_HOTPLUG_LIVE_STATUS;
break; break;
default: default:
return connector_status_unknown; return connector_status_unknown;
} }
temp = I915_READ(PORT_HOTPLUG_STAT); if ((I915_READ(PORT_HOTPLUG_STAT) & bit) == 0)
if ((temp & bit) == 0)
return connector_status_disconnected; return connector_status_disconnected;
return intel_dp_detect_dpcd(intel_dp); return intel_dp_detect_dpcd(intel_dp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment