Commit f632e351 authored by Jani Nikula's avatar Jani Nikula Committed by Ben Hutchings

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

commit 5017b285 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: default avatarJani 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: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent b8309464
...@@ -534,9 +534,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi) ...@@ -534,9 +534,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi)
int s = dmi->matches[i].slot; int s = dmi->matches[i].slot;
if (s == DMI_NONE) if (s == DMI_NONE)
break; break;
if (dmi_ident[s] if (dmi_ident[s]) {
&& strstr(dmi_ident[s], dmi->matches[i].substr)) if (!dmi->matches[i].exact_match &&
strstr(dmi_ident[s], dmi->matches[i].substr))
continue; continue;
else if (dmi->matches[i].exact_match &&
!strcmp(dmi_ident[s], dmi->matches[i].substr))
continue;
}
/* No match */ /* No match */
return false; return false;
} }
......
...@@ -461,7 +461,8 @@ enum dmi_field { ...@@ -461,7 +461,8 @@ enum dmi_field {
}; };
struct dmi_strmatch { struct dmi_strmatch {
unsigned char slot; unsigned char slot:7;
unsigned char exact_match:1;
char substr[79]; char substr[79];
}; };
...@@ -489,7 +490,8 @@ struct dmi_system_id { ...@@ -489,7 +490,8 @@ struct dmi_system_id {
#define dmi_device_id dmi_system_id #define dmi_device_id dmi_system_id
#endif #endif
#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_NAME_SIZE 20 #define PLATFORM_NAME_SIZE 20
#define PLATFORM_MODULE_PREFIX "platform:" #define PLATFORM_MODULE_PREFIX "platform:"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment