diff options
author | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2015-02-18 06:33:20 -0500 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2015-03-26 09:48:15 -0400 |
commit | 95be58df74a5b21e5a78e45fddb2fd59112524c5 (patch) | |
tree | def4bffeb711096b0d0e084edc3d8859f79b783d /drivers/firmware | |
parent | 9eccca0843205f87c00404b663188b88eb248051 (diff) |
firmware: dmi_scan: Use full dmi version for SMBIOS3
New SMBIOS3 spec adds additional field for versioning - docrev.
The docrev identifies the revision of a specification implemented in
the table structures, so display SMBIOSv3 versions in format,
like "3.22.1".
In case of only 32 bit entry point for versions > 3 display
dmi version like "3.22.x" as we don't know the docrev.
In other cases display version like it was.
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/dmi_scan.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 69fac068669f..c8f9e9d3bf91 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
@@ -17,7 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | static const char dmi_empty_string[] = " "; | 18 | static const char dmi_empty_string[] = " "; |
19 | 19 | ||
20 | static u16 __initdata dmi_ver; | 20 | static u32 dmi_ver __initdata; |
21 | /* | 21 | /* |
22 | * Catch too early calls to dmi_check_system(): | 22 | * Catch too early calls to dmi_check_system(): |
23 | */ | 23 | */ |
@@ -198,7 +198,7 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, | |||
198 | * the UUID are supposed to be little-endian encoded. The specification | 198 | * the UUID are supposed to be little-endian encoded. The specification |
199 | * says that this is the defacto standard. | 199 | * says that this is the defacto standard. |
200 | */ | 200 | */ |
201 | if (dmi_ver >= 0x0206) | 201 | if (dmi_ver >= 0x020600) |
202 | sprintf(s, "%pUL", d); | 202 | sprintf(s, "%pUL", d); |
203 | else | 203 | else |
204 | sprintf(s, "%pUB", d); | 204 | sprintf(s, "%pUB", d); |
@@ -470,7 +470,7 @@ static void __init dmi_format_ids(char *buf, size_t len) | |||
470 | */ | 470 | */ |
471 | static int __init dmi_present(const u8 *buf) | 471 | static int __init dmi_present(const u8 *buf) |
472 | { | 472 | { |
473 | int smbios_ver; | 473 | u32 smbios_ver; |
474 | 474 | ||
475 | if (memcmp(buf, "_SM_", 4) == 0 && | 475 | if (memcmp(buf, "_SM_", 4) == 0 && |
476 | buf[5] < 32 && dmi_checksum(buf, buf[5])) { | 476 | buf[5] < 32 && dmi_checksum(buf, buf[5])) { |
@@ -503,14 +503,16 @@ static int __init dmi_present(const u8 *buf) | |||
503 | if (dmi_walk_early(dmi_decode) == 0) { | 503 | if (dmi_walk_early(dmi_decode) == 0) { |
504 | if (smbios_ver) { | 504 | if (smbios_ver) { |
505 | dmi_ver = smbios_ver; | 505 | dmi_ver = smbios_ver; |
506 | pr_info("SMBIOS %d.%d present.\n", | 506 | pr_info("SMBIOS %d.%d%s present.\n", |
507 | dmi_ver >> 8, dmi_ver & 0xFF); | 507 | dmi_ver >> 8, dmi_ver & 0xFF, |
508 | (dmi_ver < 0x0300) ? "" : ".x"); | ||
508 | } else { | 509 | } else { |
509 | dmi_ver = (buf[14] & 0xF0) << 4 | | 510 | dmi_ver = (buf[14] & 0xF0) << 4 | |
510 | (buf[14] & 0x0F); | 511 | (buf[14] & 0x0F); |
511 | pr_info("Legacy DMI %d.%d present.\n", | 512 | pr_info("Legacy DMI %d.%d present.\n", |
512 | dmi_ver >> 8, dmi_ver & 0xFF); | 513 | dmi_ver >> 8, dmi_ver & 0xFF); |
513 | } | 514 | } |
515 | dmi_ver <<= 8; | ||
514 | dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); | 516 | dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); |
515 | printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string); | 517 | printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string); |
516 | return 0; | 518 | return 0; |
@@ -528,7 +530,8 @@ static int __init dmi_smbios3_present(const u8 *buf) | |||
528 | { | 530 | { |
529 | if (memcmp(buf, "_SM3_", 5) == 0 && | 531 | if (memcmp(buf, "_SM3_", 5) == 0 && |
530 | buf[6] < 32 && dmi_checksum(buf, buf[6])) { | 532 | buf[6] < 32 && dmi_checksum(buf, buf[6])) { |
531 | dmi_ver = get_unaligned_be16(buf + 7); | 533 | dmi_ver = get_unaligned_be32(buf + 6); |
534 | dmi_ver &= 0xFFFFFF; | ||
532 | dmi_len = get_unaligned_le32(buf + 12); | 535 | dmi_len = get_unaligned_le32(buf + 12); |
533 | dmi_base = get_unaligned_le64(buf + 16); | 536 | dmi_base = get_unaligned_le64(buf + 16); |
534 | 537 | ||
@@ -545,8 +548,9 @@ static int __init dmi_smbios3_present(const u8 *buf) | |||
545 | dmi_num = dmi_len / 4; | 548 | dmi_num = dmi_len / 4; |
546 | 549 | ||
547 | if (dmi_walk_early(dmi_decode) == 0) { | 550 | if (dmi_walk_early(dmi_decode) == 0) { |
548 | pr_info("SMBIOS %d.%d present.\n", | 551 | pr_info("SMBIOS %d.%d.%d present.\n", |
549 | dmi_ver >> 8, dmi_ver & 0xFF); | 552 | dmi_ver >> 16, (dmi_ver >> 8) & 0xFF, |
553 | dmi_ver & 0xFF); | ||
550 | dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); | 554 | dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); |
551 | pr_debug("DMI: %s\n", dmi_ids_string); | 555 | pr_debug("DMI: %s\n", dmi_ids_string); |
552 | return 0; | 556 | return 0; |