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_check_system - check system DMI data 419 * @list: array of dmi_system_id structures to match against 420 * All non-null elements of the list must match 421 * their slot's (field index's) data (i.e., each 422 * list string must be a substring of the specified 423 * DMI slot's string data) to be considered a 424 * successful match. 425 * 426 * Walk the blacklist table running matching functions until someone 427 * returns non zero or we hit the end. Callback function is called for 428 * each successful match. Returns the number of matches. 429 */ 430 int dmi_check_system(const struct dmi_system_id *list) 431 { 432 int i, count = 0; 433 const struct dmi_system_id *d = list; 434 435 WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n"); 436 437 while (d->ident) { 438 for (i = 0; i < ARRAY_SIZE(d->matches); i++) { 439 int s = d->matches[i].slot; 440 if (s == DMI_NONE) 441 continue; 442 if (dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr)) 443 continue; 444 /* No match */ 445 goto fail; 446 } 447 count++; 448 if (d->callback && d->callback(d)) 449 break; 450 fail: d++; 451 } 452 453 return count; 454 } 455 EXPORT_SYMBOL(dmi_check_system); 456 457 /** 458 * dmi_get_system_info - return DMI data value 459 * @field: data index (see enum dmi_field) 460 * 461 * Returns one DMI data value, can be used to perform 462 * complex DMI data checks. 463 */ 464 const char *dmi_get_system_info(int field) 465 { 466 return dmi_ident[field]; 467 } 468 EXPORT_SYMBOL(dmi_get_system_info); 469 470 471 /** 472 * dmi_name_in_vendors - Check if string is anywhere in the DMI vendor information. 473 * @str: Case sensitive Name 474 */ 475 int dmi_name_in_vendors(const char *str) 476 { 477 static int fields[] = { DMI_BIOS_VENDOR, DMI_BIOS_VERSION, DMI_SYS_VENDOR, 478 DMI_PRODUCT_NAME, DMI_PRODUCT_VERSION, DMI_BOARD_VENDOR, 479 DMI_BOARD_NAME, DMI_BOARD_VERSION, DMI_NONE }; 480 int i; 481 for (i = 0; fields[i] != DMI_NONE; i++) { 482 int f = fields[i]; 483 if (dmi_ident[f] && strstr(dmi_ident[f], str)) 484 return 1; 485 } 486 return 0; 487 } 488 EXPORT_SYMBOL(dmi_name_in_vendors); 489 490 /** 491 * dmi_find_device - find onboard device by type/name 492 * @type: device type or %DMI_DEV_TYPE_ANY to match all device types 493 * @name: device name string or %NULL to match all 494 * @from: previous device found in search, or %NULL for new search. 495 * 496 * Iterates through the list of known onboard devices. If a device is 497 * found with a matching @vendor and @device, a pointer to its device 498 * structure is returned. Otherwise, %NULL is returned. 499 * A new search is initiated by passing %NULL as the @from argument. 500 * If @from is not %NULL, searches continue from next device. 501 */ 502 const struct dmi_device * dmi_find_device(int type, const char *name, 503 const struct dmi_device *from) 504 { 505 const struct list_head *head = from ? &from->list : &dmi_devices; 506 struct list_head *d; 507 508 for(d = head->next; d != &dmi_devices; d = d->next) { 509 const struct dmi_device *dev = 510 list_entry(d, struct dmi_device, list); 511 512 if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) && 513 ((name == NULL) || (strcmp(dev->name, name) == 0))) 514 return dev; 515 } 516 517 return NULL; 518 } 519 EXPORT_SYMBOL(dmi_find_device); 520 521 /** 522 * dmi_get_year - Return year of a DMI date 523 * @field: data index (like dmi_get_system_info) 524 * 525 * Returns -1 when the field doesn't exist. 0 when it is broken. 526 */ 527 int dmi_get_year(int field) 528 { 529 int year; 530 const char *s = dmi_get_system_info(field); 531 532 if (!s) 533 return -1; 534 if (*s == '\0') 535 return 0; 536 s = strrchr(s, '/'); 537 if (!s) 538 return 0; 539 540 s += 1; 541 year = simple_strtoul(s, NULL, 0); 542 if (year && year < 100) { /* 2-digit year */ 543 year += 1900; 544 if (year < 1996) /* no dates < spec 1.0 */ 545 year += 100; 546 } 547 548 return year; 549 } 550 551 /** 552 * dmi_walk - Walk the DMI table and get called back for every record 553 * @decode: Callback function 554 * 555 * Returns -1 when the DMI table can't be reached, 0 on success. 556 */ 557 int dmi_walk(void (*decode)(const struct dmi_header *)) 558 { 559 u8 *buf; 560 561 if (!dmi_available) 562 return -1; 563 564 buf = ioremap(dmi_base, dmi_len); 565 if (buf == NULL) 566 return -1; 567 568 dmi_table(buf, dmi_len, dmi_num, decode); 569 570 iounmap(buf); 571 return 0; 572 } 573 EXPORT_SYMBOL_GPL(dmi_walk); 574