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

Commit 01fe9dbd authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Use ACPI OpRegion to determine lid status



Admittedly, trusting ACPI or the BIOS at all to be correct is littered
with numerous examples where it is wrong. Maybe, just maybe, we will
have better luck using the ACPI OpRegion lid status...

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent c56eb8fb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ struct intel_opregion {
	struct opregion_swsci *swsci;
	struct opregion_asle *asle;
	void *vbt;
	u32 __iomem *lid_state;
};
#define OPREGION_SIZE            (8*1024)

+7 −0
Original line number Diff line number Diff line
@@ -472,8 +472,15 @@ static enum drm_connector_status
intel_lvds_detect(struct drm_connector *connector, bool force)
{
	struct drm_device *dev = connector->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	enum drm_connector_status status = connector_status_connected;

	/* Assume that the BIOS does not lie through the OpRegion... */
	if (dev_priv->opregion.lid_state)
		return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
			connector_status_connected :
			connector_status_disconnected;

	/* ACPI lid methods were generally unreliable in this generation, so
	 * don't even bother.
	 */
+2 −0
Original line number Diff line number Diff line
@@ -488,6 +488,8 @@ int intel_opregion_setup(struct drm_device *dev)
	opregion->header = base;
	opregion->vbt = base + OPREGION_VBT_OFFSET;

	opregion->lid_state = base + 0x01ac;

	mboxes = opregion->header->mboxes;
	if (mboxes & MBOX_ACPI) {
		DRM_DEBUG_DRIVER("Public ACPI methods supported\n");