[3.8.y.z extended stable] Patch "dmi: add support for exact DMI matches in addition to substring" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Fri Nov 8 02:08:19 UTC 2013

This is a note to let you know that I have just added a patch titled

    dmi: add support for exact DMI matches in addition to substring

to the linux-3.8.y-queue branch of the 3.8.y.z extended stable tree 
which can be found at:


This patch is scheduled to be released in version

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.8.y.z tree, see



>From 05076a9ca6e201544af98b66083535007da8200c Mon Sep 17 00:00:00 2001
From: Jani Nikula <jani.nikula at intel.com>
Date: Wed, 3 Jul 2013 15:05:02 -0700
Subject: dmi: add support for exact DMI matches in addition to substring

commit 5017b2851373ee15c7035151853bb1448800cae2 upstream.

dmi_match() considers a substring match to be a successful match.  This is
not always sufficient to distinguish between DMI data for different
systems.  Add support for exact string matching using strcmp() in addition
to the substring matching using strstr().

The specific use case in the i915 driver is to allow us to use an exact
match for D510MO, without also incorrectly matching D510MOV:

	.ident = "Intel D510MO",
	.matches = {

Signed-off-by: Jani Nikula <jani.nikula at intel.com>
Cc: <annndddrr at gmail.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Cornel Panceac <cpanceac at gmail.com>
Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>
Cc: Greg KH <greg at kroah.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
[ kamal: 3.8-stable prereq for various commits ]
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
 drivers/firmware/dmi_scan.c     | 12 +++++++++---
 include/linux/mod_devicetable.h |  6 ++++--
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index 4cd392d..2861ef4 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -534,9 +534,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi)
 		int s = dmi->matches[i].slot;
 		if (s == DMI_NONE)
-		if (dmi_ident[s]
-		    && strstr(dmi_ident[s], dmi->matches[i].substr))
-			continue;
+		if (dmi_ident[s]) {
+			if (!dmi->matches[i].exact_match &&
+			    strstr(dmi_ident[s], dmi->matches[i].substr))
+				continue;
+			else if (dmi->matches[i].exact_match &&
+				 !strcmp(dmi_ident[s], dmi->matches[i].substr))
+				continue;
+		}
 		/* No match */
 		return false;
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index fed3def..163eb82 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -480,7 +480,8 @@ enum dmi_field {

 struct dmi_strmatch {
-	unsigned char slot;
+	unsigned char slot:7;
+	unsigned char exact_match:1;
 	char substr[79];

@@ -508,7 +509,8 @@ struct dmi_system_id {
 #define dmi_device_id dmi_system_id

-#define DMI_MATCH(a, b)	{ a, b }
+#define DMI_MATCH(a, b)	{ .slot = a, .substr = b }
+#define DMI_EXACT_MATCH(a, b)	{ .slot = a, .substr = b, .exact_match = 1 }

 #define PLATFORM_MODULE_PREFIX	"platform:"

More information about the kernel-team mailing list