[PATCH 11/11] drm/i915: Ignore OpRegion panel type except on select machines

Timo Aaltonen tjaalton at ubuntu.com
Fri May 11 06:21:01 UTC 2018

From: Ville Syrjälä <ville.syrjala at linux.intel.com>

BugLink: http://bugs.launchpad.net/bugs/1770565

Turns out
commit a05628195a0d ("drm/i915: Get panel_type from OpRegion panel
details") has regressed quite a few machines. So it looks like we
can't use the panel type from OpRegion on all systems, and yet we
absolutely must use it on some specific systems.

Despite trying, I was unable to find any automagic way to determine
if the OpRegion panel type is respectable or not. The only glimmer
of hope I had was bit 8 in the SCIC response, but that turned out to
not work either (it was always 0 on both types of systems).

So, to fix the regressions without breaking the machine we know to need
the OpRegion panel type, let's just add a quirk for this. Only specific
machines known to require the OpRegion panel type will therefore use
it. Everyone else will fall bck to the VBT panel type.

The only known machine so far is a "Conrac GmbH IX45GM2". The PCI
subsystem ID on this machine is just a generic 8086:2a42, so of no use.
Instead we'll go with a DMI match.

I suspect we can now also revert
commit aeddda06c1a7 ("drm/i915: Ignore panel type from OpRegion on SKL")
but let's leave that to a separate patch.

v2: Do the DMI match in the opregion code directly, as dev_priv->quirks
    gets populated too late

Cc: Rob Kramer <rob at solution-space.com>
Cc: Martin van Es <martin at mrvanes.com>
Cc: Andrea Arcangeli <aarcange at redhat.com>
Cc: Dave Airlie <airlied at linux.ie>
Cc: Marco Krüger <krgsch at gmail.com>
Cc: Sean Greenslade <sean at seangreenslade.com>
Cc: Trudy Tective <bertslany at gmail.com>
Cc: Robin Müller <rm1990 at gmx.de>
Cc: Alexander Kobel <a-kobel at a-kobel.de>
Cc: Alexey Shumitsky <alexey.shumitsky at gmail.com>
Cc: Emil Andersen Lauridsen <mine809 at gmail.com>
Cc: oceans112 at gmail.com
Cc: James Hogan <james at albanarts.com>
Cc: James Bottomley <James.Bottomley at HansenPartnership.com>
Cc: stable at vger.kernel.org
References: https://lists.freedesktop.org/archives/intel-gfx/2016-August/105545.html
References: https://lists.freedesktop.org/archives/dri-devel/2016-August/116888.html
References: https://lists.freedesktop.org/archives/intel-gfx/2016-June/098826.html
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94825
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97060
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97443
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97363
Fixes: a05628195a0d ("drm/i915: Get panel_type from OpRegion panel details")
Tested-by: Marco Krüger <krgsch at gmail.com>
Tested-by: Alexey Shumitsky <alexey.shumitsky at gmail.com>
Tested-by: Sean Greenslade <sean at seangreenslade.com>
Tested-by: Emil Andersen Lauridsen <mine809 at gmail.com>
Tested-by: Robin Müller <rm1990 at gmx.de>
Tested-by: oceans112 at gmail.com
Tested-by: Rob Kramer <rob at solution-space.com>
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1473758539-21565-1-git-send-email-ville.syrjala@linux.intel.com
References: http://patchwork.freedesktop.org/patch/msgid/1473602239-15855-1-git-send-email-adrienverge@gmail.com
Acked-by: Jani Nikula <jani.nikula at intel.com>
(cherry picked from commit c8ebfad7a063fe665417fa0eeb0da7cfe987d8ed)
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
(cherry picked from commit ea54ff4008892b46c7a3e6bc8ab8aaec9d198639)
Signed-off-by: Timo Aaltonen <timo.aaltonen at canonical.com>
 ubuntu/i915/intel_opregion.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/ubuntu/i915/intel_opregion.c b/ubuntu/i915/intel_opregion.c
index 16e209d326b6..72842aafdcf6 100644
--- a/ubuntu/i915/intel_opregion.c
+++ b/ubuntu/i915/intel_opregion.c
@@ -1013,6 +1013,23 @@ err_out:
 	return err;
+static int intel_use_opregion_panel_type_callback(const struct dmi_system_id *id)
+	DRM_INFO("Using panel type from OpRegion on %s\n", id->ident);
+	return 1;
+static const struct dmi_system_id intel_use_opregion_panel_type[] = {
+	{
+		.callback = intel_use_opregion_panel_type_callback,
+		.ident = "Conrac GmbH IX45GM2",
+		.matches = {DMI_MATCH(DMI_SYS_VENDOR, "Conrac GmbH"),
+		},
+	},
+	{ }
 intel_opregion_get_panel_type(struct drm_device *dev)
@@ -1038,6 +1055,16 @@ intel_opregion_get_panel_type(struct drm_device *dev)
 		return -ENODEV;
+	/*
+	 * So far we know that some machined must use it, others must not use it.
+	 * There doesn't seem to be any way to determine which way to go, except
+	 * via a quirk list :(
+	 */
+	if (!dmi_check_system(intel_use_opregion_panel_type)) {
+		DRM_DEBUG_KMS("Ignoring OpRegion panel type (%d)\n", ret - 1);
+		return -ENODEV;
+	}
 	 * FIXME On Dell XPS 13 9350 the OpRegion panel type (0) gives us
 	 * low vswing for eDP, whereas the VBT panel type (2) gives us normal

More information about the kernel-team mailing list