Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dmi_scan.c
Go to the documentation of this file.
1 #include <linux/types.h>
2 #include <linux/string.h>
3 #include <linux/init.h>
4 #include <linux/module.h>
5 #include <linux/ctype.h>
6 #include <linux/dmi.h>
7 #include <linux/efi.h>
8 #include <linux/bootmem.h>
9 #include <linux/random.h>
10 #include <asm/dmi.h>
11 
12 /*
13  * DMI stands for "Desktop Management Interface". It is part
14  * of and an antecedent to, SMBIOS, which stands for System
15  * Management BIOS. See further: http://www.dmtf.org/standards
16  */
17 static char dmi_empty_string[] = " ";
18 
19 /*
20  * Catch too early calls to dmi_check_system():
21  */
22 static int dmi_initialized;
23 
24 static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
25 {
26  const u8 *bp = ((u8 *) dm) + dm->length;
27 
28  if (s) {
29  s--;
30  while (s > 0 && *bp) {
31  bp += strlen(bp) + 1;
32  s--;
33  }
34 
35  if (*bp != 0) {
36  size_t len = strlen(bp)+1;
37  size_t cmp_len = len > 8 ? 8 : len;
38 
39  if (!memcmp(bp, dmi_empty_string, cmp_len))
40  return dmi_empty_string;
41  return bp;
42  }
43  }
44 
45  return "";
46 }
47 
48 static char * __init dmi_string(const struct dmi_header *dm, u8 s)
49 {
50  const char *bp = dmi_string_nosave(dm, s);
51  char *str;
52  size_t len;
53 
54  if (bp == dmi_empty_string)
55  return dmi_empty_string;
56 
57  len = strlen(bp) + 1;
58  str = dmi_alloc(len);
59  if (str != NULL)
60  strcpy(str, bp);
61  else
62  printk(KERN_ERR "dmi_string: cannot allocate %Zu bytes.\n", len);
63 
64  return str;
65 }
66 
67 /*
68  * We have to be cautious here. We have seen BIOSes with DMI pointers
69  * pointing to completely the wrong place for example
70  */
71 static void dmi_table(u8 *buf, int len, int num,
72  void (*decode)(const struct dmi_header *, void *),
73  void *private_data)
74 {
75  u8 *data = buf;
76  int i = 0;
77 
78  /*
79  * Stop when we see all the items the table claimed to have
80  * OR we run off the end of the table (also happens)
81  */
82  while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) {
83  const struct dmi_header *dm = (const struct dmi_header *)data;
84 
85  /*
86  * We want to know the total length (formatted area and
87  * strings) before decoding to make sure we won't run off the
88  * table in dmi_decode or dmi_string
89  */
90  data += dm->length;
91  while ((data - buf < len - 1) && (data[0] || data[1]))
92  data++;
93  if (data - buf < len - 1)
94  decode(dm, private_data);
95  data += 2;
96  i++;
97  }
98 }
99 
100 static u32 dmi_base;
101 static u16 dmi_len;
102 static u16 dmi_num;
103 
104 static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,
105  void *))
106 {
107  u8 *buf;
108 
109  buf = dmi_ioremap(dmi_base, dmi_len);
110  if (buf == NULL)
111  return -1;
112 
113  dmi_table(buf, dmi_len, dmi_num, decode, NULL);
114 
115  add_device_randomness(buf, dmi_len);
116 
117  dmi_iounmap(buf, dmi_len);
118  return 0;
119 }
120 
121 static int __init dmi_checksum(const u8 *buf)
122 {
123  u8 sum = 0;
124  int a;
125 
126  for (a = 0; a < 15; a++)
127  sum += buf[a];
128 
129  return sum == 0;
130 }
131 
132 static char *dmi_ident[DMI_STRING_MAX];
133 static LIST_HEAD(dmi_devices);
135 
136 /*
137  * Save a DMI string
138  */
139 static void __init dmi_save_ident(const struct dmi_header *dm, int slot, int string)
140 {
141  const char *d = (const char*) dm;
142  char *p;
143 
144  if (dmi_ident[slot])
145  return;
146 
147  p = dmi_string(dm, d[string]);
148  if (p == NULL)
149  return;
150 
151  dmi_ident[slot] = p;
152 }
153 
154 static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, int index)
155 {
156  const u8 *d = (u8*) dm + index;
157  char *s;
158  int is_ff = 1, is_00 = 1, i;
159 
160  if (dmi_ident[slot])
161  return;
162 
163  for (i = 0; i < 16 && (is_ff || is_00); i++) {
164  if(d[i] != 0x00) is_ff = 0;
165  if(d[i] != 0xFF) is_00 = 0;
166  }
167 
168  if (is_ff || is_00)
169  return;
170 
171  s = dmi_alloc(16*2+4+1);
172  if (!s)
173  return;
174 
175  sprintf(s, "%pUB", d);
176 
177  dmi_ident[slot] = s;
178 }
179 
180 static void __init dmi_save_type(const struct dmi_header *dm, int slot, int index)
181 {
182  const u8 *d = (u8*) dm + index;
183  char *s;
184 
185  if (dmi_ident[slot])
186  return;
187 
188  s = dmi_alloc(4);
189  if (!s)
190  return;
191 
192  sprintf(s, "%u", *d & 0x7F);
193  dmi_ident[slot] = s;
194 }
195 
196 static void __init dmi_save_one_device(int type, const char *name)
197 {
198  struct dmi_device *dev;
199 
200  /* No duplicate device */
201  if (dmi_find_device(type, name, NULL))
202  return;
203 
204  dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1);
205  if (!dev) {
206  printk(KERN_ERR "dmi_save_one_device: out of memory.\n");
207  return;
208  }
209 
210  dev->type = type;
211  strcpy((char *)(dev + 1), name);
212  dev->name = (char *)(dev + 1);
213  dev->device_data = NULL;
214  list_add(&dev->list, &dmi_devices);
215 }
216 
217 static void __init dmi_save_devices(const struct dmi_header *dm)
218 {
219  int i, count = (dm->length - sizeof(struct dmi_header)) / 2;
220 
221  for (i = 0; i < count; i++) {
222  const char *d = (char *)(dm + 1) + (i * 2);
223 
224  /* Skip disabled device */
225  if ((*d & 0x80) == 0)
226  continue;
227 
228  dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d + 1)));
229  }
230 }
231 
232 static void __init dmi_save_oem_strings_devices(const struct dmi_header *dm)
233 {
234  int i, count = *(u8 *)(dm + 1);
235  struct dmi_device *dev;
236 
237  for (i = 1; i <= count; i++) {
238  char *devname = dmi_string(dm, i);
239 
240  if (devname == dmi_empty_string)
241  continue;
242 
243  dev = dmi_alloc(sizeof(*dev));
244  if (!dev) {
246  "dmi_save_oem_strings_devices: out of memory.\n");
247  break;
248  }
249 
251  dev->name = devname;
252  dev->device_data = NULL;
253 
254  list_add(&dev->list, &dmi_devices);
255  }
256 }
257 
258 static void __init dmi_save_ipmi_device(const struct dmi_header *dm)
259 {
260  struct dmi_device *dev;
261  void * data;
262 
263  data = dmi_alloc(dm->length);
264  if (data == NULL) {
265  printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n");
266  return;
267  }
268 
269  memcpy(data, dm, dm->length);
270 
271  dev = dmi_alloc(sizeof(*dev));
272  if (!dev) {
273  printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n");
274  return;
275  }
276 
277  dev->type = DMI_DEV_TYPE_IPMI;
278  dev->name = "IPMI controller";
279  dev->device_data = data;
280 
281  list_add_tail(&dev->list, &dmi_devices);
282 }
283 
284 static void __init dmi_save_dev_onboard(int instance, int segment, int bus,
285  int devfn, const char *name)
286 {
287  struct dmi_dev_onboard *onboard_dev;
288 
289  onboard_dev = dmi_alloc(sizeof(*onboard_dev) + strlen(name) + 1);
290  if (!onboard_dev) {
291  printk(KERN_ERR "dmi_save_dev_onboard: out of memory.\n");
292  return;
293  }
294  onboard_dev->instance = instance;
295  onboard_dev->segment = segment;
296  onboard_dev->bus = bus;
297  onboard_dev->devfn = devfn;
298 
299  strcpy((char *)&onboard_dev[1], name);
300  onboard_dev->dev.type = DMI_DEV_TYPE_DEV_ONBOARD;
301  onboard_dev->dev.name = (char *)&onboard_dev[1];
302  onboard_dev->dev.device_data = onboard_dev;
303 
304  list_add(&onboard_dev->dev.list, &dmi_devices);
305 }
306 
307 static void __init dmi_save_extended_devices(const struct dmi_header *dm)
308 {
309  const u8 *d = (u8*) dm + 5;
310 
311  /* Skip disabled device */
312  if ((*d & 0x80) == 0)
313  return;
314 
315  dmi_save_dev_onboard(*(d+1), *(u16 *)(d+2), *(d+4), *(d+5),
316  dmi_string_nosave(dm, *(d-1)));
317  dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d - 1)));
318 }
319 
320 /*
321  * Process a DMI table entry. Right now all we care about are the BIOS
322  * and machine entries. For 2.5 we should pull the smbus controller info
323  * out of here.
324  */
325 static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
326 {
327  switch(dm->type) {
328  case 0: /* BIOS Information */
329  dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
330  dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
331  dmi_save_ident(dm, DMI_BIOS_DATE, 8);
332  break;
333  case 1: /* System Information */
334  dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
335  dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
336  dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
337  dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
338  dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
339  break;
340  case 2: /* Base Board Information */
341  dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
342  dmi_save_ident(dm, DMI_BOARD_NAME, 5);
343  dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
344  dmi_save_ident(dm, DMI_BOARD_SERIAL, 7);
345  dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8);
346  break;
347  case 3: /* Chassis Information */
348  dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4);
349  dmi_save_type(dm, DMI_CHASSIS_TYPE, 5);
350  dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6);
351  dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
352  dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
353  break;
354  case 10: /* Onboard Devices Information */
355  dmi_save_devices(dm);
356  break;
357  case 11: /* OEM Strings */
358  dmi_save_oem_strings_devices(dm);
359  break;
360  case 38: /* IPMI Device Information */
361  dmi_save_ipmi_device(dm);
362  break;
363  case 41: /* Onboard Devices Extended Information */
364  dmi_save_extended_devices(dm);
365  }
366 }
367 
368 static void __init print_filtered(const char *info)
369 {
370  const char *p;
371 
372  if (!info)
373  return;
374 
375  for (p = info; *p; p++)
376  if (isprint(*p))
377  printk(KERN_CONT "%c", *p);
378  else
379  printk(KERN_CONT "\\x%02x", *p & 0xff);
380 }
381 
382 static void __init dmi_dump_ids(void)
383 {
384  const char *board; /* Board Name is optional */
385 
386  printk(KERN_DEBUG "DMI: ");
387  print_filtered(dmi_get_system_info(DMI_SYS_VENDOR));
388  printk(KERN_CONT " ");
389  print_filtered(dmi_get_system_info(DMI_PRODUCT_NAME));
391  if (board) {
392  printk(KERN_CONT "/");
393  print_filtered(board);
394  }
395  printk(KERN_CONT ", BIOS ");
396  print_filtered(dmi_get_system_info(DMI_BIOS_VERSION));
397  printk(KERN_CONT " ");
398  print_filtered(dmi_get_system_info(DMI_BIOS_DATE));
399  printk(KERN_CONT "\n");
400 }
401 
402 static int __init dmi_present(const char __iomem *p)
403 {
404  u8 buf[15];
405 
406  memcpy_fromio(buf, p, 15);
407  if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) {
408  dmi_num = (buf[13] << 8) | buf[12];
409  dmi_len = (buf[7] << 8) | buf[6];
410  dmi_base = (buf[11] << 24) | (buf[10] << 16) |
411  (buf[9] << 8) | buf[8];
412 
413  /*
414  * DMI version 0.0 means that the real version is taken from
415  * the SMBIOS version, which we don't know at this point.
416  */
417  if (buf[14] != 0)
418  printk(KERN_INFO "DMI %d.%d present.\n",
419  buf[14] >> 4, buf[14] & 0xF);
420  else
421  printk(KERN_INFO "DMI present.\n");
422  if (dmi_walk_early(dmi_decode) == 0) {
423  dmi_dump_ids();
424  return 0;
425  }
426  }
427  return 1;
428 }
429 
431 {
432  char __iomem *p, *q;
433  int rc;
434 
435  if (efi_enabled) {
437  goto error;
438 
439  /* This is called as a core_initcall() because it isn't
440  * needed during early boot. This also means we can
441  * iounmap the space when we're done with it.
442  */
443  p = dmi_ioremap(efi.smbios, 32);
444  if (p == NULL)
445  goto error;
446 
447  rc = dmi_present(p + 0x10); /* offset of _DMI_ string */
448  dmi_iounmap(p, 32);
449  if (!rc) {
450  dmi_available = 1;
451  goto out;
452  }
453  }
454  else {
455  /*
456  * no iounmap() for that ioremap(); it would be a no-op, but
457  * it's so early in setup that sucker gets confused into doing
458  * what it shouldn't if we actually call it.
459  */
460  p = dmi_ioremap(0xF0000, 0x10000);
461  if (p == NULL)
462  goto error;
463 
464  for (q = p; q < p + 0x10000; q += 16) {
465  rc = dmi_present(q);
466  if (!rc) {
467  dmi_available = 1;
468  dmi_iounmap(p, 0x10000);
469  goto out;
470  }
471  }
472  dmi_iounmap(p, 0x10000);
473  }
474  error:
475  printk(KERN_INFO "DMI not present or invalid.\n");
476  out:
477  dmi_initialized = 1;
478 }
479 
484 static bool dmi_matches(const struct dmi_system_id *dmi)
485 {
486  int i;
487 
488  WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n");
489 
490  for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) {
491  int s = dmi->matches[i].slot;
492  if (s == DMI_NONE)
493  break;
494  if (dmi_ident[s]
495  && strstr(dmi_ident[s], dmi->matches[i].substr))
496  continue;
497  /* No match */
498  return false;
499  }
500  return true;
501 }
502 
507 static bool dmi_is_end_of_table(const struct dmi_system_id *dmi)
508 {
509  return dmi->matches[0].slot == DMI_NONE;
510 }
511 
526 {
527  int count = 0;
528  const struct dmi_system_id *d;
529 
530  for (d = list; !dmi_is_end_of_table(d); d++)
531  if (dmi_matches(d)) {
532  count++;
533  if (d->callback && d->callback(d))
534  break;
535  }
536 
537  return count;
538 }
540 
553 const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list)
554 {
555  const struct dmi_system_id *d;
556 
557  for (d = list; !dmi_is_end_of_table(d); d++)
558  if (dmi_matches(d))
559  return d;
560 
561  return NULL;
562 }
564 
572 const char *dmi_get_system_info(int field)
573 {
574  return dmi_ident[field];
575 }
577 
582 int dmi_name_in_serial(const char *str)
583 {
584  int f = DMI_PRODUCT_SERIAL;
585  if (dmi_ident[f] && strstr(dmi_ident[f], str))
586  return 1;
587  return 0;
588 }
589 
594 int dmi_name_in_vendors(const char *str)
595 {
596  static int fields[] = { DMI_SYS_VENDOR, DMI_BOARD_VENDOR, DMI_NONE };
597  int i;
598  for (i = 0; fields[i] != DMI_NONE; i++) {
599  int f = fields[i];
600  if (dmi_ident[f] && strstr(dmi_ident[f], str))
601  return 1;
602  }
603  return 0;
604 }
606 
619 const struct dmi_device * dmi_find_device(int type, const char *name,
620  const struct dmi_device *from)
621 {
622  const struct list_head *head = from ? &from->list : &dmi_devices;
623  struct list_head *d;
624 
625  for(d = head->next; d != &dmi_devices; d = d->next) {
626  const struct dmi_device *dev =
627  list_entry(d, struct dmi_device, list);
628 
629  if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) &&
630  ((name == NULL) || (strcmp(dev->name, name) == 0)))
631  return dev;
632  }
633 
634  return NULL;
635 }
637 
656 bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
657 {
658  int year = 0, month = 0, day = 0;
659  bool exists;
660  const char *s, *y;
661  char *e;
662 
663  s = dmi_get_system_info(field);
664  exists = s;
665  if (!exists)
666  goto out;
667 
668  /*
669  * Determine year first. We assume the date string resembles
670  * mm/dd/yy[yy] but the original code extracted only the year
671  * from the end. Keep the behavior in the spirit of no
672  * surprises.
673  */
674  y = strrchr(s, '/');
675  if (!y)
676  goto out;
677 
678  y++;
679  year = simple_strtoul(y, &e, 10);
680  if (y != e && year < 100) { /* 2-digit year */
681  year += 1900;
682  if (year < 1996) /* no dates < spec 1.0 */
683  year += 100;
684  }
685  if (year > 9999) /* year should fit in %04d */
686  year = 0;
687 
688  /* parse the mm and dd */
689  month = simple_strtoul(s, &e, 10);
690  if (s == e || *e != '/' || !month || month > 12) {
691  month = 0;
692  goto out;
693  }
694 
695  s = e + 1;
696  day = simple_strtoul(s, &e, 10);
697  if (s == y || s == e || *e != '/' || day > 31)
698  day = 0;
699 out:
700  if (yearp)
701  *yearp = year;
702  if (monthp)
703  *monthp = month;
704  if (dayp)
705  *dayp = day;
706  return exists;
707 }
709 
717 int dmi_walk(void (*decode)(const struct dmi_header *, void *),
718  void *private_data)
719 {
720  u8 *buf;
721 
722  if (!dmi_available)
723  return -1;
724 
725  buf = ioremap(dmi_base, dmi_len);
726  if (buf == NULL)
727  return -1;
728 
729  dmi_table(buf, dmi_len, dmi_num, decode, private_data);
730 
731  iounmap(buf);
732  return 0;
733 }
735 
743 bool dmi_match(enum dmi_field f, const char *str)
744 {
745  const char *info = dmi_get_system_info(f);
746 
747  if (info == NULL || str == NULL)
748  return info == str;
749 
750  return !strcmp(info, str);
751 }