From: Aaron Lu <aaron.lu@intel.com>
To: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>,
Jani Nikula <jani.nikula@linux.intel.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Oleksij Rempel <linux@rempel-privat.de>,
"intel-gfx@lists.freedesktop.org"
<intel-gfx@lists.freedesktop.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
ACPI Devel Mailing List <linux-acpi@vger.kernel.org>
Subject: [PATCH] drm/i915/opregion: work around buggy firmware that provides 8+ output devices
Date: Wed, 12 Feb 2014 11:05:40 +0800 [thread overview]
Message-ID: <52FAE504.8020001@intel.com> (raw)
The ACPI table on ASUS UX302LA has more than 8 output devices under the
graphics controller device node. The problem is, the real active output
device, the LCD panel, is listed the last. The result is, the LCD's
device id doesn't get recorded in the active device list CADL array and
when the _DCS control method for the LCD device is executed, it returns
0x1d, meaning it is not active. This affects the hotkey delivery ASL
code that will not deliver a notification if the output device is not
active on backlight hotkey press.
I don't see a clean way to solve this problem since the operation region
spec doesn't allow more than 8 output devices so we have no way of
storing all these output devices. The fact that output devices that have
_BCM control method usually means they have a higher possibility of being
used than those who don't made me choose a simple way to work around
the buggy firmware by replacing the last entry in CADL array with the one
that has _BCM control method. There is no specific reason why the last
entry is picked instead of others.
Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=70241
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
Reported-and-tested-by: Oleksij Rempel <linux@rempel-privat.de>
---
drivers/gpu/drm/i915/intel_opregion.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 4e960ec7419f..fc4348284f41 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -613,6 +613,7 @@ static void intel_didl_outputs(struct drm_device *dev)
acpi_status status;
u32 temp;
int i = 0;
+ bool done;
handle = ACPI_HANDLE(&dev->pdev->dev);
if (!handle || acpi_bus_get_device(handle, &acpi_dev))
@@ -634,11 +635,20 @@ static void intel_didl_outputs(struct drm_device *dev)
return;
}
+ done = false;
list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
if (i >= 8) {
dev_dbg(&dev->pdev->dev,
- "More than 8 outputs detected via ACPI\n");
- return;
+ "More than 8 outputs detected via ACPI, %s\n",
+ acpi_device_bid(acpi_cdev));
+ if (acpi_has_method(acpi_cdev->handle, "_BCM")) {
+ dev_dbg(&dev->pdev->dev,
+ "%s has _BCM, replacing 8th entry\n",
+ acpi_device_bid(acpi_cdev));
+ i = 7;
+ done = true;
+ } else
+ continue;
}
status =
acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
@@ -650,6 +660,9 @@ static void intel_didl_outputs(struct drm_device *dev)
&opregion->acpi->didl[i]);
i++;
}
+
+ if (done)
+ return;
}
end:
--
1.8.5.3
next reply other threads:[~2014-02-12 3:05 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-12 3:05 Aaron Lu [this message]
2014-02-12 10:31 ` [PATCH] drm/i915/opregion: work around buggy firmware that provides 8+ output devices Chris Wilson
2014-02-12 10:52 ` Jani Nikula
2014-02-13 9:10 ` Aaron Lu
2014-02-13 10:08 ` Chris Wilson
2014-02-13 12:03 ` Daniel Vetter
2014-02-19 7:31 ` Aaron Lu
2014-02-19 7:33 ` Matthew Garrett
2014-02-19 8:59 ` Aaron Lu
2014-03-04 14:45 ` Daniel Vetter
2014-12-08 1:58 ` Aaron Lu
2014-12-08 11:00 ` Jani Nikula
2014-12-08 11:04 ` [Intel-gfx] " Jani Nikula
2014-12-09 9:15 ` Aaron Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52FAE504.8020001@intel.com \
--to=aaron.lu@intel.com \
--cc=daniel.vetter@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rempel-privat.de \
--cc=mjg59@srcf.ucam.org \
--cc=rjw@rjwysocki.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).