5af1bf7126
See also this thread: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/812638
65 lines
2.3 KiB
Diff
65 lines
2.3 KiB
Diff
From 38c1a19fb78da8c2a617b1d8a3fcafb691c1409f Mon Sep 17 00:00:00 2001
|
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Date: Sun, 16 Jan 2011 19:37:30 +0000
|
|
Subject: [PATCH 1/3] 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: Chris Wilson <chris@chris-wilson.co.uk>
|
|
---
|
|
drivers/gpu/drm/i915/i915_drv.h | 1 +
|
|
drivers/gpu/drm/i915/intel_lvds.c | 7 +++++++
|
|
drivers/gpu/drm/i915/intel_opregion.c | 2 ++
|
|
3 files changed, 10 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
|
|
index 456f404..a299cc6 100644
|
|
--- a/drivers/gpu/drm/i915/i915_drv.h
|
|
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
|
@@ -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)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
index bcdba7b..aa29228 100644
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -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.
|
|
*/
|
|
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
|
|
index 64fd644..9efccb9 100644
|
|
--- a/drivers/gpu/drm/i915/intel_opregion.c
|
|
+++ b/drivers/gpu/drm/i915/intel_opregion.c
|
|
@@ -489,6 +489,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");
|
|
--
|
|
1.7.6.5
|
|
|