Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -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)
+5 −7
Original line number Diff line number Diff line
@@ -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);