Commit 95be58df authored by Ivan Khoronzhuk's avatar Ivan Khoronzhuk Committed by Matt Fleming

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: default avatarIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent 9eccca08
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
*/ */
static const char dmi_empty_string[] = " "; static const char dmi_empty_string[] = " ";
static u16 __initdata dmi_ver; static u32 dmi_ver __initdata;
/* /*
* Catch too early calls to dmi_check_system(): * Catch too early calls to dmi_check_system():
*/ */
...@@ -198,7 +198,7 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, ...@@ -198,7 +198,7 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
* the UUID are supposed to be little-endian encoded. The specification * the UUID are supposed to be little-endian encoded. The specification
* says that this is the defacto standard. * says that this is the defacto standard.
*/ */
if (dmi_ver >= 0x0206) if (dmi_ver >= 0x020600)
sprintf(s, "%pUL", d); sprintf(s, "%pUL", d);
else else
sprintf(s, "%pUB", d); sprintf(s, "%pUB", d);
...@@ -470,7 +470,7 @@ static void __init dmi_format_ids(char *buf, size_t len) ...@@ -470,7 +470,7 @@ static void __init dmi_format_ids(char *buf, size_t len)
*/ */
static int __init dmi_present(const u8 *buf) static int __init dmi_present(const u8 *buf)
{ {
int smbios_ver; u32 smbios_ver;
if (memcmp(buf, "_SM_", 4) == 0 && if (memcmp(buf, "_SM_", 4) == 0 &&
buf[5] < 32 && dmi_checksum(buf, buf[5])) { buf[5] < 32 && dmi_checksum(buf, buf[5])) {
...@@ -503,14 +503,16 @@ static int __init dmi_present(const u8 *buf) ...@@ -503,14 +503,16 @@ static int __init dmi_present(const u8 *buf)
if (dmi_walk_early(dmi_decode) == 0) { if (dmi_walk_early(dmi_decode) == 0) {
if (smbios_ver) { if (smbios_ver) {
dmi_ver = smbios_ver; dmi_ver = smbios_ver;
pr_info("SMBIOS %d.%d present.\n", pr_info("SMBIOS %d.%d%s present.\n",
dmi_ver >> 8, dmi_ver & 0xFF); dmi_ver >> 8, dmi_ver & 0xFF,
(dmi_ver < 0x0300) ? "" : ".x");
} else { } else {
dmi_ver = (buf[14] & 0xF0) << 4 | dmi_ver = (buf[14] & 0xF0) << 4 |
(buf[14] & 0x0F); (buf[14] & 0x0F);
pr_info("Legacy DMI %d.%d present.\n", pr_info("Legacy DMI %d.%d present.\n",
dmi_ver >> 8, dmi_ver & 0xFF); dmi_ver >> 8, dmi_ver & 0xFF);
} }
dmi_ver <<= 8;
dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string); printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string);
return 0; return 0;
...@@ -528,7 +530,8 @@ static int __init dmi_smbios3_present(const u8 *buf) ...@@ -528,7 +530,8 @@ static int __init dmi_smbios3_present(const u8 *buf)
{ {
if (memcmp(buf, "_SM3_", 5) == 0 && if (memcmp(buf, "_SM3_", 5) == 0 &&
buf[6] < 32 && dmi_checksum(buf, buf[6])) { buf[6] < 32 && dmi_checksum(buf, buf[6])) {
dmi_ver = get_unaligned_be16(buf + 7); dmi_ver = get_unaligned_be32(buf + 6);
dmi_ver &= 0xFFFFFF;
dmi_len = get_unaligned_le32(buf + 12); dmi_len = get_unaligned_le32(buf + 12);
dmi_base = get_unaligned_le64(buf + 16); dmi_base = get_unaligned_le64(buf + 16);
...@@ -545,8 +548,9 @@ static int __init dmi_smbios3_present(const u8 *buf) ...@@ -545,8 +548,9 @@ static int __init dmi_smbios3_present(const u8 *buf)
dmi_num = dmi_len / 4; dmi_num = dmi_len / 4;
if (dmi_walk_early(dmi_decode) == 0) { if (dmi_walk_early(dmi_decode) == 0) {
pr_info("SMBIOS %d.%d present.\n", pr_info("SMBIOS %d.%d.%d present.\n",
dmi_ver >> 8, dmi_ver & 0xFF); dmi_ver >> 16, (dmi_ver >> 8) & 0xFF,
dmi_ver & 0xFF);
dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
pr_debug("DMI: %s\n", dmi_ids_string); pr_debug("DMI: %s\n", dmi_ids_string);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment