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: Chris Wilson <[email protected]>
---
 drivers/gpu/drm/i915/i915_reg.h |   21 +++++++++++++++------
 drivers/gpu/drm/i915/intel_dp.c |   12 +++++-------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 576339d..6b8f2ec 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1558,12 +1558,21 @@
 #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV       (1 << 2)
 
 #define PORT_HOTPLUG_STAT      0x61114
-#define   HDMIB_HOTPLUG_INT_STATUS             (1 << 29)
-#define   DPB_HOTPLUG_INT_STATUS               (1 << 29)
-#define   HDMIC_HOTPLUG_INT_STATUS             (1 << 28)
-#define   DPC_HOTPLUG_INT_STATUS               (1 << 28)
-#define   HDMID_HOTPLUG_INT_STATUS             (1 << 27)
-#define   DPD_HOTPLUG_INT_STATUS               (1 << 27)
+/* HDMI/DP bits are gen4+ */
+#define   DPB_HOTPLUG_LIVE_STATUS               (1 << 29)
+#define   DPC_HOTPLUG_LIVE_STATUS               (1 << 28)
+#define   DPD_HOTPLUG_LIVE_STATUS               (1 << 27)
+#define   DPD_HOTPLUG_INT_STATUS               (3 << 21)
+#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   TV_HOTPLUG_INT_STATUS                        (1 << 10)
 #define   CRT_HOTPLUG_MONITOR_MASK             (3 << 8)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 9919fc0..5341a57 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2066,25 +2066,23 @@ g4x_dp_detect(struct intel_dp *intel_dp)
 {
        struct drm_device *dev = intel_dp->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       uint32_t temp, bit;
+       uint32_t bit;
 
        switch (intel_dp->output_reg) {
        case DP_B:
-               bit = DPB_HOTPLUG_INT_STATUS;
+               bit = DPB_HOTPLUG_LIVE_STATUS;
                break;
        case DP_C:
-               bit = DPC_HOTPLUG_INT_STATUS;
+               bit = DPC_HOTPLUG_LIVE_STATUS;
                break;
        case DP_D:
-               bit = DPD_HOTPLUG_INT_STATUS;
+               bit = DPD_HOTPLUG_LIVE_STATUS;
                break;
        default:
                return connector_status_unknown;
        }
 
-       temp = I915_READ(PORT_HOTPLUG_STAT);
-
-       if ((temp & bit) == 0)
+       if ((I915_READ(PORT_HOTPLUG_STAT) & bit) == 0)
                return connector_status_disconnected;
 
        return intel_dp_detect_dpcd(intel_dp);
-- 
1.7.10

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to