Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
 */
static const char dmi_empty_string[] = "        ";

static u16 __initdata dmi_ver;
static u32 dmi_ver __initdata;
/*
 * 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,
	 * the UUID are supposed to be little-endian encoded.  The specification
	 * says that this is the defacto standard.
	 */
	if (dmi_ver >= 0x0206)
	if (dmi_ver >= 0x020600)
		sprintf(s, "%pUL", d);
	else
		sprintf(s, "%pUB", d);
@@ -470,7 +470,7 @@ static void __init dmi_format_ids(char *buf, size_t len)
 */
static int __init dmi_present(const u8 *buf)
{
	int smbios_ver;
	u32 smbios_ver;

	if (memcmp(buf, "_SM_", 4) == 0 &&
	    buf[5] < 32 && dmi_checksum(buf, buf[5])) {
@@ -503,14 +503,16 @@ static int __init dmi_present(const u8 *buf)
		if (dmi_walk_early(dmi_decode) == 0) {
			if (smbios_ver) {
				dmi_ver = smbios_ver;
				pr_info("SMBIOS %d.%d present.\n",
				       dmi_ver >> 8, dmi_ver & 0xFF);
				pr_info("SMBIOS %d.%d%s present.\n",
					dmi_ver >> 8, dmi_ver & 0xFF,
					(dmi_ver < 0x0300) ? "" : ".x");
			} else {
				dmi_ver = (buf[14] & 0xF0) << 4 |
					   (buf[14] & 0x0F);
				pr_info("Legacy DMI %d.%d present.\n",
				       dmi_ver >> 8, dmi_ver & 0xFF);
			}
			dmi_ver <<= 8;
			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
			printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string);
			return 0;
@@ -528,7 +530,8 @@ static int __init dmi_smbios3_present(const u8 *buf)
{
	if (memcmp(buf, "_SM3_", 5) == 0 &&
	    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_base = get_unaligned_le64(buf + 16);

@@ -545,8 +548,9 @@ static int __init dmi_smbios3_present(const u8 *buf)
		dmi_num = dmi_len / 4;

		if (dmi_walk_early(dmi_decode) == 0) {
			pr_info("SMBIOS %d.%d present.\n",
				dmi_ver >> 8, dmi_ver & 0xFF);
			pr_info("SMBIOS %d.%d.%d present.\n",
				dmi_ver >> 16, (dmi_ver >> 8) & 0xFF,
				dmi_ver & 0xFF);
			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
			pr_debug("DMI: %s\n", dmi_ids_string);
			return 0;