aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2013-07-03 18:05:02 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-11-29 14:11:53 -0500
commite3e129e720552f0dbc8ad363f8e85120219dac94 (patch)
tree0d5474bfd9bd35623736f93001272e49cce4c940
parenta8e25439e373f9e2ec3ad7db6ddf0e32429d9ec0 (diff)
dmi: add support for exact DMI matches in addition to substring matching
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 = { DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "D510MO"), }, } Signed-off-by: Jani Nikula <jani.nikula@intel.com> Cc: <annndddrr@gmail.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Cornel Panceac <cpanceac@gmail.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/firmware/dmi_scan.c12
-rw-r--r--include/linux/mod_devicetable.h6
2 files changed, 13 insertions, 5 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index b95159b33c39..eb760a218da4 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -551,9 +551,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi)
551 int s = dmi->matches[i].slot; 551 int s = dmi->matches[i].slot;
552 if (s == DMI_NONE) 552 if (s == DMI_NONE)
553 break; 553 break;
554 if (dmi_ident[s] 554 if (dmi_ident[s]) {
555 && strstr(dmi_ident[s], dmi->matches[i].substr)) 555 if (!dmi->matches[i].exact_match &&
556 continue; 556 strstr(dmi_ident[s], dmi->matches[i].substr))
557 continue;
558 else if (dmi->matches[i].exact_match &&
559 !strcmp(dmi_ident[s], dmi->matches[i].substr))
560 continue;
561 }
562
557 /* No match */ 563 /* No match */
558 return false; 564 return false;
559 } 565 }
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index b508016fb76d..b3bd7e737e8b 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -456,7 +456,8 @@ enum dmi_field {
456}; 456};
457 457
458struct dmi_strmatch { 458struct dmi_strmatch {
459 unsigned char slot; 459 unsigned char slot:7;
460 unsigned char exact_match:1;
460 char substr[79]; 461 char substr[79];
461}; 462};
462 463
@@ -474,7 +475,8 @@ struct dmi_system_id {
474 */ 475 */
475#define dmi_device_id dmi_system_id 476#define dmi_device_id dmi_system_id
476 477
477#define DMI_MATCH(a, b) { a, b } 478#define DMI_MATCH(a, b) { .slot = a, .substr = b }
479#define DMI_EXACT_MATCH(a, b) { .slot = a, .substr = b, .exact_match = 1 }
478 480
479#define PLATFORM_NAME_SIZE 20 481#define PLATFORM_NAME_SIZE 20
480#define PLATFORM_MODULE_PREFIX "platform:" 482#define PLATFORM_MODULE_PREFIX "platform:"