Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 130269
b: refs/heads/master
c: d7b1956
h: refs/heads/master
i:
  130267: f548453
v: v3
  • Loading branch information
Rafael J. Wysocki authored and Jeff Garzik committed Jan 27, 2009
1 parent e537fad commit db55748
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: abfe2d7b915c872f3a1fd203267cedebf90daa45
refs/heads/master: d7b1956fed33d30c4815e848fd7a143722916868
74 changes: 55 additions & 19 deletions trunk/drivers/firmware/dmi_scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,29 @@ void __init dmi_scan_machine(void)
dmi_initialized = 1;
}

/**
* dmi_matches - check if dmi_system_id structure matches system DMI data
* @dmi: pointer to the dmi_system_id structure to check
*/
static bool dmi_matches(const struct dmi_system_id *dmi)
{
int i;

WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n");

for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) {
int s = dmi->matches[i].slot;
if (s == DMI_NONE)
continue;
if (dmi_ident[s]
&& strstr(dmi_ident[s], dmi->matches[i].substr))
continue;
/* No match */
return false;
}
return true;
}

/**
* dmi_check_system - check system DMI data
* @list: array of dmi_system_id structures to match against
Expand All @@ -429,31 +452,44 @@ void __init dmi_scan_machine(void)
*/
int dmi_check_system(const struct dmi_system_id *list)
{
int i, count = 0;
const struct dmi_system_id *d = list;

WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n");

while (d->ident) {
for (i = 0; i < ARRAY_SIZE(d->matches); i++) {
int s = d->matches[i].slot;
if (s == DMI_NONE)
continue;
if (dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr))
continue;
/* No match */
goto fail;
int count = 0;
const struct dmi_system_id *d;

for (d = list; d->ident; d++)
if (dmi_matches(d)) {
count++;
if (d->callback && d->callback(d))
break;
}
count++;
if (d->callback && d->callback(d))
break;
fail: d++;
}

return count;
}
EXPORT_SYMBOL(dmi_check_system);

/**
* dmi_first_match - find dmi_system_id structure matching system DMI data
* @list: array of dmi_system_id structures to match against
* All non-null elements of the list must match
* their slot's (field index's) data (i.e., each
* list string must be a substring of the specified
* DMI slot's string data) to be considered a
* successful match.
*
* Walk the blacklist table until the first match is found. Return the
* pointer to the matching entry or NULL if there's no match.
*/
const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list)
{
const struct dmi_system_id *d;

for (d = list; d->ident; d++)
if (dmi_matches(d))
return d;

return NULL;
}
EXPORT_SYMBOL(dmi_first_match);

/**
* dmi_get_system_info - return DMI data value
* @field: data index (see enum dmi_field)
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/dmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct dmi_device {
#ifdef CONFIG_DMI

extern int dmi_check_system(const struct dmi_system_id *list);
const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list);
extern const char * dmi_get_system_info(int field);
extern const struct dmi_device * dmi_find_device(int type, const char *name,
const struct dmi_device *from);
Expand Down

0 comments on commit db55748

Please sign in to comment.