1 #include <linux/types.h> 2 #include <linux/string.h> 3 #include <linux/init.h> 4 #include <linux/module.h> 5 #include <linux/dmi.h> 6 #include <linux/efi.h> 7 #include <linux/bootmem.h> 8 #include <linux/slab.h> 9 #include <asm/dmi.h> 10 11 /* 12 * DMI stands for "Desktop Management Interface". It is part 13 * of and an antecedent to, SMBIOS, which stands for System 14 * Management BIOS. See further: http://www.dmtf.org/standards 15 */ 16 static char dmi_empty_string[] = " "; 17 18 /* 19 * Catch too early calls to dmi_check_system(): 20 */ 21 static int dmi_initialized; 22 23 static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s) 24 { 25 const u8 *bp = ((u8 *) dm) + dm->length; 26 27 if (s) { 28 s--; 29 while (s > 0 && *bp) { 30 bp += strlen(bp) + 1; 31 s--; 32 } 33 34 if (*bp != 0) { 35 size_t len = strlen(bp)+1; 36 size_t cmp_len = len > 8 ? 8 : len; 37 38 if (!memcmp(bp, dmi_empty_string, cmp_len)) 39 return dmi_empty_string; 40 return bp; 41 } 42 } 43 44 return ""; 45 } 46 47 static char * __init dmi_string(const struct dmi_header *dm, u8 s) 48 { 49 const char *bp = dmi_string_nosave(dm, s); 50 char *str; 51 size_t len; 52 53 if (bp == dmi_empty_string) 54 return dmi_empty_string; 55 56 len = strlen(bp) + 1; 57 str = dmi_alloc(len); 58 if (str != NULL) 59 strcpy(str, bp); 60 else 61 printk(KERN_ERR "dmi_string: cannot allocate %Zu bytes.\n", len); 62 63 return str; 64 } 65 66 /* 67 * We have to be cautious here. We have seen BIOSes with DMI pointers 68 * pointing to completely the wrong place for example 69 */ 70 static void dmi_table(u8 *buf, int len, int num, 71 void (*decode)(const struct dmi_header *)) 72 { 73 u8 *data = buf; 74 int i = 0; 75 76 /* 77 * Stop when we see all the items the table claimed to have 78 * OR we run off the end of the table (also happens) 79 */ 80 while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { 81 const struct dmi_header *dm = (const struct dmi_header *)data; 82 83 /* 84 * We want to know the total length (formatted area and 85 * strings) before decoding to make sure we won't run off the 86 * table in dmi_decode or dmi_string 87 */ 88 data += dm->length; 89 while ((data - buf < len - 1) && (data[0] || data[1])) 90 data++; 91 if (data - buf < len - 1) 92 decode(dm); 93 data += 2; 94 i++; 95 } 96 } 97 98 static u32 dmi_base; 99 static u16 dmi_len; 100 static u16 dmi_num; 101 102 static int __init dmi_walk_early(void (*decode)(const struct dmi_header *)) 103 { 104 u8 *buf; 105 106 buf = dmi_ioremap(dmi_base, dmi_len); 107 if (buf == NULL) 108 return -1; 109 110 dmi_table(buf, dmi_len, dmi_num, decode); 111 112 dmi_iounmap(buf, dmi_len); 113 return 0; 114 } 115 116 static int __init dmi_checksum(const u8 *buf) 117 { 118 u8 sum = 0; 119 int a; 120 121 for (a = 0; a < 15; a++) 122 sum += buf[a]; 123 124 return sum == 0; 125 } 126 127 static char *dmi_ident[DMI_STRING_MAX]; 128 static LIST_HEAD(dmi_devices); 129 int dmi_available; 130 131 /* 132 * Save a DMI string 133 */ 134 static void __init dmi_save_ident(const struct dmi_header *dm, int slot, int string) 135 { 136 const char *d = (const char*) dm; 137 char *p; 138 139 if (dmi_ident[slot]) 140 return; 141 142 p = dmi_string(dm, d[string]); 143 if (p == NULL) 144 return; 145 146 dmi_ident[slot] = p; 147 } 148 149 static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, int index) 150 { 151 const u8 *d = (u8*) dm + index; 152 char *s; 153 int is_ff = 1, is_00 = 1, i; 154 155 if (dmi_ident[slot]) 156 return; 157 158 for (i = 0; i < 16 && (is_ff || is_00); i++) { 159 if(d[i] != 0x00) is_ff = 0; 160 if(d[i] != 0xFF) is_00 = 0; 161 } 162 163 if (is_ff || is_00) 164 return; 165 166 s = dmi_alloc(16*2+4+1); 167 if (!s) 168 return; 169 170 sprintf(s, 171 "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", 172 d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], 173 d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]); 174 175 dmi_ident[slot] = s; 176 } 177 178 static void __init dmi_save_type(const struct dmi_header *dm, int slot, int index) 179 { 180 const u8 *d = (u8*) dm + index; 181 char *s; 182 183 if (dmi_ident[slot]) 184 return; 185 186 s = dmi_alloc(4); 187 if (!s) 188 return; 189 190 sprintf(s, "%u", *d & 0x7F); 191 dmi_ident[slot] = s; 192 } 193 194 static void __init dmi_save_one_device(int type, const char *name) 195 { 196 struct dmi_device *dev; 197 198 /* No duplicate device */ 199 if (dmi_find_device(type, name, NULL)) 200 return; 201 202 dev = dmi_alloc(sizeof(*dev) + strlen(name) + 1); 203 if (!dev) { 204 printk(KERN_ERR "dmi_save_one_device: out of memory.\n"); 205 return; 206 } 207 208 dev->type = type; 209 strcpy((char *)(dev + 1), name); 210 dev->name = (char *)(dev + 1); 211 dev->device_data = NULL; 212 list_add(&dev->list, &dmi_devices); 213 } 214 215 static void __init dmi_save_devices(const struct dmi_header *dm) 216 { 217 int i, count = (dm->length - sizeof(struct dmi_header)) / 2; 218 219 for (i = 0; i < count; i++) { 220 const char *d = (char *)(dm + 1) + (i * 2); 221 222 /* Skip disabled device */ 223 if ((*d & 0x80) == 0) 224 continue; 225 226 dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d + 1))); 227 } 228 } 229 230 static void __init dmi_save_oem_strings_devices(const struct dmi_header *dm) 231 { 232 int i, count = *(u8 *)(dm + 1); 233 struct dmi_device *dev; 234 235 for (i = 1; i <= count; i++) { 236 char *devname = dmi_string(dm, i); 237 238 if (devname == dmi_empty_string) 239 continue; 240 241 dev = dmi_alloc(sizeof(*dev)); 242 if (!dev) { 243 printk(KERN_ERR 244 "dmi_save_oem_strings_devices: out of memory.\n"); 245 break; 246 } 247 248 dev->type = DMI_DEV_TYPE_OEM_STRING; 249 dev->name = devname; 250 dev->device_data = NULL; 251 252 list_add(&dev->list, &dmi_devices); 253 } 254 } 255 256 static void __init dmi_save_ipmi_device(const struct dmi_header *dm) 257 { 258 struct dmi_device *dev; 259 void * data; 260 261 data = dmi_alloc(dm->length); 262 if (data == NULL) { 263 printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); 264 return; 265 } 266 267 memcpy(data, dm, dm->length); 268 269 dev = dmi_alloc(sizeof(*dev)); 270 if (!dev) { 271 printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); 272 return; 273 } 274 275 dev->type = DMI_DEV_TYPE_IPMI; 276 dev->name = "IPMI controller"; 277 dev->device_data = data; 278 279 list_add_tail(&dev->list, &dmi_devices); 280 } 281 282 static void __init dmi_save_extended_devices(const struct dmi_header *dm) 283 { 284 const u8 *d = (u8*) dm + 5; 285 286 /* Skip disabled device */ 287 if ((*d & 0x80) == 0) 288 return; 289 290 dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d - 1))); 291 } 292 293 /* 294 * Process a DMI table entry. Right now all we care about are the BIOS 295 * and machine entries. For 2.5 we should pull the smbus controller info 296 * out of here. 297 */ 298 static void __init dmi_decode(const struct dmi_header *dm) 299 { 300 switch(dm->type) { 301 case 0: /* BIOS Information */ 302 dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); 303 dmi_save_ident(dm, DMI_BIOS_VERSION, 5); 304 dmi_save_ident(dm, DMI_BIOS_DATE, 8); 305 break; 306 case 1: /* System Information */ 307 dmi_save_ident(dm, DMI_SYS_VENDOR, 4); 308 dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); 309 dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); 310 dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7); 311 dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8); 312 break; 313 case 2: /* Base Board Information */ 314 dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); 315 dmi_save_ident(dm, DMI_BOARD_NAME, 5); 316 dmi_save_ident(dm, DMI_BOARD_VERSION, 6); 317 dmi_save_ident(dm, DMI_BOARD_SERIAL, 7); 318 dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8); 319 break; 320 case 3: /* Chassis Information */ 321 dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4); 322 dmi_save_type(dm, DMI_CHASSIS_TYPE, 5); 323 dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6); 324 dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7); 325 dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8); 326 break; 327 case 10: /* Onboard Devices Information */ 328 dmi_save_devices(dm); 329 break; 330 case 11: /* OEM Strings */ 331 dmi_save_oem_strings_devices(dm); 332 break; 333 case 38: /* IPMI Device Information */ 334 dmi_save_ipmi_device(dm); 335 break; 336 case 41: /* Onboard Devices Extended Information */ 337 dmi_save_extended_devices(dm); 338 } 339 } 340 341 static int __init dmi_present(const char __iomem *p) 342 { 343 u8 buf[15]; 344 345 memcpy_fromio(buf, p, 15); 346 if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { 347 dmi_num = (buf[13] << 8) | buf[12]; 348 dmi_len = (buf[7] << 8) | buf[6]; 349 dmi_base = (buf[11] << 24) | (buf[10] << 16) | 350 (buf[9] << 8) | buf[8]; 351 352 /* 353 * DMI version 0.0 means that the real version is taken from 354 * the SMBIOS version, which we don't know at this point. 355 */ 356 if (buf[14] != 0) 357 printk(KERN_INFO "DMI %d.%d present.\n", 358 buf[14] >> 4, buf[14] & 0xF); 359 else 360 printk(KERN_INFO "DMI present.\n"); 361 if (dmi_walk_early(dmi_decode) == 0) 362 return 0; 363 } 364 return 1; 365 } 366 367 void __init dmi_scan_machine(void) 368 { 369 char __iomem *p, *q; 370 int rc; 371 372 if (efi_enabled) { 373 if (efi.smbios == EFI_INVALID_TABLE_ADDR) 374 goto error; 375 376 /* This is called as a core_initcall() because it isn't 377 * needed during early boot. This also means we can 378 * iounmap the space when we're done with it. 379 */ 380 p = dmi_ioremap(efi.smbios, 32); 381 if (p == NULL) 382 goto error; 383 384 rc = dmi_present(p + 0x10); /* offset of _DMI_ string */ 385 dmi_iounmap(p, 32); 386 if (!rc) { 387 dmi_available = 1; 388 goto out; 389 } 390 } 391 else { 392 /* 393 * no iounmap() for that ioremap(); it would be a no-op, but 394 * it's so early in setup that sucker gets confused into doing 395 * what it shouldn't if we actually call it. 396 */ 397 p = dmi_ioremap(0xF0000, 0x10000); 398 if (p == NULL) 399 goto error; 400 401 for (q = p; q < p + 0x10000; q += 16) { 402 rc = dmi_present(q); 403 if (!rc) { 404 dmi_available = 1; 405 dmi_iounmap(p, 0x10000); 406 goto out; 407 } 408 } 409 dmi_iounmap(p, 0x10000); 410 } 411 error: 412 printk(KERN_INFO "DMI not present or invalid.\n"); 413 out: 414 dmi_initialized = 1; 415 } 416 417 /** 418 * dmi_matches - check if dmi_system_id structure matches system DMI data 419 * @dmi: pointer to the dmi_system_id structure to check 420 */ 421 static bool dmi_matches(const struct dmi_system_id *dmi) 422 { 423 int i; 424 425 WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n"); 426 427 for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) { 428 int s = dmi->matches[i].slot; 429 if (s == DMI_NONE) 430 continue; 431 if (dmi_ident[s] 432 && strstr(dmi_ident[s], dmi->matches[i].substr)) 433 continue; 434 /* No match */ 435 return false; 436 } 437 return true; 438 } 439 440 /** 441 * dmi_check_system - check system DMI data 442 * @list: array of dmi_system_id structures to match against 443 * All non-null elements of the list must match 444 * their slot's (field index's) data (i.e., each 445 * list string must be a substring of the specified 446 * DMI slot's string data) to be considered a 447 * successful match. 448 * 449 * Walk the blacklist table running matching functions until someone 450 * returns non zero or we hit the end. Callback function is called for 451 * each successful match. Returns the number of matches. 452 */ 453 int dmi_check_system(const struct dmi_system_id *list) 454 { 455 int count = 0; 456 const struct dmi_system_id *d; 457 458 for (d = list; d->ident; d++) 459 if (dmi_matches(d)) { 460 count++; 461 if (d->callback && d->callback(d)) 462 break; 463 } 464 465 return count; 466 } 467 EXPORT_SYMBOL(dmi_check_system); 468 469 /** 470 * dmi_first_match - find dmi_system_id structure matching system DMI data 471 * @list: array of dmi_system_id structures to match against 472 * All non-null elements of the list must match 473 * their slot's (field index's) data (i.e., each 474 * list string must be a substring of the specified 475 * DMI slot's string data) to be considered a 476 * successful match. 477 * 478 * Walk the blacklist table until the first match is found. Return the 479 * pointer to the matching entry or NULL if there's no match. 480 */ 481 const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list) 482 { 483 const struct dmi_system_id *d; 484 485 for (d = list; d->ident; d++) 486 if (dmi_matches(d)) 487 return d; 488 489 return NULL; 490 } 491 EXPORT_SYMBOL(dmi_first_match); 492 493 /** 494 * dmi_get_system_info - return DMI data value 495 * @field: data index (see enum dmi_field) 496 * 497 * Returns one DMI data value, can be used to perform 498 * complex DMI data checks. 499 */ 500 const char *dmi_get_system_info(int field) 501 { 502 return dmi_ident[field]; 503 } 504 EXPORT_SYMBOL(dmi_get_system_info); 505 506 /** 507 * dmi_name_in_serial - Check if string is in the DMI product serial information 508 * @str: string to check for 509 */ 510 int dmi_name_in_serial(const char *str) 511 { 512 int f = DMI_PRODUCT_SERIAL; 513 if (dmi_ident[f] && strstr(dmi_ident[f], str)) 514 return 1; 515 return 0; 516 } 517 518 /** 519 * dmi_name_in_vendors - Check if string is anywhere in the DMI vendor information. 520 * @str: Case sensitive Name 521 */ 522 int dmi_name_in_vendors(const char *str) 523 { 524 static int fields[] = { DMI_BIOS_VENDOR, DMI_BIOS_VERSION, DMI_SYS_VENDOR, 525 DMI_PRODUCT_NAME, DMI_PRODUCT_VERSION, DMI_BOARD_VENDOR, 526 DMI_BOARD_NAME, DMI_BOARD_VERSION, DMI_NONE }; 527 int i; 528 for (i = 0; fields[i] != DMI_NONE; i++) { 529 int f = fields[i]; 530 if (dmi_ident[f] && strstr(dmi_ident[f], str)) 531 return 1; 532 } 533 return 0; 534 } 535 EXPORT_SYMBOL(dmi_name_in_vendors); 536 537 /** 538 * dmi_find_device - find onboard device by type/name 539 * @type: device type or %DMI_DEV_TYPE_ANY to match all device types 540 * @name: device name string or %NULL to match all 541 * @from: previous device found in search, or %NULL for new search. 542 * 543 * Iterates through the list of known onboard devices. If a device is 544 * found with a matching @vendor and @device, a pointer to its device 545 * structure is returned. Otherwise, %NULL is returned. 546 * A new search is initiated by passing %NULL as the @from argument. 547 * If @from is not %NULL, searches continue from next device. 548 */ 549 const struct dmi_device * dmi_find_device(int type, const char *name, 550 const struct dmi_device *from) 551 { 552 const struct list_head *head = from ? &from->list : &dmi_devices; 553 struct list_head *d; 554 555 for(d = head->next; d != &dmi_devices; d = d->next) { 556 const struct dmi_device *dev = 557 list_entry(d, struct dmi_device, list); 558 559 if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) && 560 ((name == NULL) || (strcmp(dev->name, name) == 0))) 561 return dev; 562 } 563 564 return NULL; 565 } 566 EXPORT_SYMBOL(dmi_find_device); 567 568 /** 569 * dmi_get_year - Return year of a DMI date 570 * @field: data index (like dmi_get_system_info) 571 * 572 * Returns -1 when the field doesn't exist. 0 when it is broken. 573 */ 574 int dmi_get_year(int field) 575 { 576 int year; 577 const char *s = dmi_get_system_info(field); 578 579 if (!s) 580 return -1; 581 if (*s == '\0') 582 return 0; 583 s = strrchr(s, '/'); 584 if (!s) 585 return 0; 586 587 s += 1; 588 year = simple_strtoul(s, NULL, 0); 589 if (year && year < 100) { /* 2-digit year */ 590 year += 1900; 591 if (year < 1996) /* no dates < spec 1.0 */ 592 year += 100; 593 } 594 595 return year; 596 } 597 598 /** 599 * dmi_walk - Walk the DMI table and get called back for every record 600 * @decode: Callback function 601 * 602 * Returns -1 when the DMI table can't be reached, 0 on success. 603 */ 604 int dmi_walk(void (*decode)(const struct dmi_header *)) 605 { 606 u8 *buf; 607 608 if (!dmi_available) 609 return -1; 610 611 buf = ioremap(dmi_base, dmi_len); 612 if (buf == NULL) 613 return -1; 614 615 dmi_table(buf, dmi_len, dmi_num, decode); 616 617 iounmap(buf); 618 return 0; 619 } 620 EXPORT_SYMBOL_GPL(dmi_walk); 621 622 /** 623 * dmi_match - compare a string to the dmi field (if exists) 624 * @f: DMI field identifier 625 * @str: string to compare the DMI field to 626 * 627 * Returns true if the requested field equals to the str (including NULL). 628 */ 629 bool dmi_match(enum dmi_field f, const char *str) 630 { 631 const char *info = dmi_get_system_info(f); 632 633 if (info == NULL || str == NULL) 634 return info == str; 635 636 return !strcmp(info, str); 637 } 638 EXPORT_SYMBOL_GPL(dmi_match); 639