Blame 0016-dmidecode-Extensions-to-Memory-Device-Type-17.patch

Anton Arapov c2a608
From 29e626f6ed3edb72ebd2ca3fe0e1fbd956ab71a1 Mon Sep 17 00:00:00 2001
Anton Arapov c2a608
From: Jerry Hoemann <jerry.hoemann@hpe.com>
Anton Arapov c2a608
Date: Wed, 20 Jun 2018 09:51:53 +0200
Anton Arapov c2a608
Subject: [PATCH 16/21] dmidecode: Extensions to Memory Device (Type 17)
Anton Arapov c2a608
Anton Arapov c2a608
The DSP0134 v3.2.0 extended the Memory Device (Type 17) structure
Anton Arapov c2a608
starting at offset 28h continuing to 4Ch to reflect persistent memory.
Anton Arapov c2a608
Anton Arapov c2a608
Signed-off-by: Jerry Hoemann <jerry.hoemann@hpe.com>
Anton Arapov c2a608
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Anton Arapov c2a608
---
Anton Arapov c2a608
 dmidecode.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++
Anton Arapov c2a608
 1 file changed, 110 insertions(+)
Anton Arapov c2a608
Anton Arapov c2a608
diff --git a/dmidecode.c b/dmidecode.c
Anton Arapov c2a608
index d18a258..f8c3b30 100644
Anton Arapov c2a608
--- a/dmidecode.c
Anton Arapov c2a608
+++ b/dmidecode.c
Anton Arapov c2a608
@@ -2507,6 +2507,79 @@ static void dmi_memory_device_speed(u16 code)
Anton Arapov c2a608
 		printf(" %u MT/s", code);
Anton Arapov c2a608
 }
Anton Arapov c2a608
 
Anton Arapov c2a608
+static void dmi_memory_technology(u8 code)
Anton Arapov c2a608
+{
Anton Arapov c2a608
+	/* 7.18.6 */
Anton Arapov c2a608
+	static const char * const technology[] = {
Anton Arapov c2a608
+		"Other", /* 0x01 */
Anton Arapov c2a608
+		"Unknown",
Anton Arapov c2a608
+		"DRAM",
Anton Arapov c2a608
+		"NVDIMM-N",
Anton Arapov c2a608
+		"NVDIMM-F",
Anton Arapov c2a608
+		"NVDIMM-P",
Anton Arapov c2a608
+		"Intel persistent memory" /* 0x07 */
Anton Arapov c2a608
+	};
Anton Arapov c2a608
+	if (code >= 0x01 && code <= 0x07)
Anton Arapov c2a608
+		printf(" %s", technology[code - 0x01]);
Anton Arapov c2a608
+	else
Anton Arapov c2a608
+		printf(" %s", out_of_spec);
Anton Arapov c2a608
+}
Anton Arapov c2a608
+
Anton Arapov c2a608
+static void dmi_memory_operating_mode_capability(u16 code)
Anton Arapov c2a608
+{
Anton Arapov c2a608
+	/* 7.18.7 */
Anton Arapov c2a608
+	static const char * const mode[] = {
Anton Arapov c2a608
+		"Other", /* 1 */
Anton Arapov c2a608
+		"Unknown",
Anton Arapov c2a608
+		"Volatile memory",
Anton Arapov c2a608
+		"Byte-accessible persistent memory",
Anton Arapov c2a608
+		"Block-accessible persistent memory" /* 5 */
Anton Arapov c2a608
+	};
Anton Arapov c2a608
+
Anton Arapov c2a608
+	if ((code & 0xFFFE) == 0)
Anton Arapov c2a608
+		printf(" None");
Anton Arapov c2a608
+	else {
Anton Arapov c2a608
+		int i;
Anton Arapov c2a608
+
Anton Arapov c2a608
+		for (i = 1; i <= 5; i++)
Anton Arapov c2a608
+			if (code & (1 << i))
Anton Arapov c2a608
+				printf(" %s", mode[i - 1]);
Anton Arapov c2a608
+	}
Anton Arapov c2a608
+}
Anton Arapov c2a608
+
Anton Arapov c2a608
+static void dmi_memory_manufacturer_id(u16 code)
Anton Arapov c2a608
+{
Anton Arapov c2a608
+	/* 7.18.8 */
Anton Arapov c2a608
+	/* 7.18.10 */
Anton Arapov c2a608
+	/* LSB is 7-bit Odd Parity number of continuation codes */
Anton Arapov c2a608
+	if (code == 0)
Anton Arapov c2a608
+		printf(" Unknown");
Anton Arapov c2a608
+	else
Anton Arapov c2a608
+		printf(" Bank %d, Hex 0x%02X", (code & 0x7F) + 1, code >> 8);
Anton Arapov c2a608
+}
Anton Arapov c2a608
+
Anton Arapov c2a608
+static void dmi_memory_product_id(u16 code)
Anton Arapov c2a608
+{
Anton Arapov c2a608
+	/* 7.18.9 */
Anton Arapov c2a608
+	/* 7.18.11 */
Anton Arapov c2a608
+	if (code == 0)
Anton Arapov c2a608
+		printf(" Unknown");
Anton Arapov c2a608
+	else
Anton Arapov c2a608
+		printf(" 0x%04X", code);
Anton Arapov c2a608
+}
Anton Arapov c2a608
+
Anton Arapov c2a608
+static void dmi_memory_size(u64 code)
Anton Arapov c2a608
+{
Anton Arapov c2a608
+	/* 7.18.12 */
Anton Arapov c2a608
+	/* 7.18.13 */
Anton Arapov c2a608
+	if (code.h == 0xFFFFFFFF && code.l == 0xFFFFFFFF)
Anton Arapov c2a608
+		printf(" Unknown");
Anton Arapov c2a608
+	else if (code.h == 0x0 && code.l == 0x0)
Anton Arapov c2a608
+		printf(" None");
Anton Arapov c2a608
+	else
Anton Arapov c2a608
+		dmi_print_memory_size(code, 0);
Anton Arapov c2a608
+}
Anton Arapov c2a608
+
Anton Arapov c2a608
 /*
Anton Arapov c2a608
  * 7.19 32-bit Memory Error Information (Type 18)
Anton Arapov c2a608
  */
Anton Arapov c2a608
@@ -3907,6 +3980,43 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
Anton Arapov c2a608
 			printf("\tConfigured Voltage:");
Anton Arapov c2a608
 			dmi_memory_voltage_value(WORD(data + 0x26));
Anton Arapov c2a608
 			printf("\n");
Anton Arapov c2a608
+			if (h->length < 0x34) break;
Anton Arapov c2a608
+			printf("\tMemory Technology:");
Anton Arapov c2a608
+			dmi_memory_technology(data[0x28]);
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			printf("\tMemory Operating Mode Capability:");
Anton Arapov c2a608
+			dmi_memory_operating_mode_capability(WORD(data + 0x29));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			printf("\tFirmware Version: %s\n",
Anton Arapov c2a608
+				dmi_string(h, data[0x2B]));
Anton Arapov c2a608
+			printf("\tModule Manufacturer ID:");
Anton Arapov c2a608
+			dmi_memory_manufacturer_id(WORD(data + 0x2C));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			printf("\tModule Product ID:");
Anton Arapov c2a608
+			dmi_memory_product_id(WORD(data + 0x2E));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			printf("\tMemory Subsystem Controller Manufacturer ID:");
Anton Arapov c2a608
+			dmi_memory_manufacturer_id(WORD(data + 0x30));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			printf("\tMemory Subsystem Controller Product ID:");
Anton Arapov c2a608
+			dmi_memory_product_id(WORD(data + 0x32));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			if (h->length < 0x3C) break;
Anton Arapov c2a608
+			printf("\tNon-Volatile Size:");
Anton Arapov c2a608
+			dmi_memory_size(QWORD(data + 0x34));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			if (h->length < 0x44) break;
Anton Arapov c2a608
+			printf("\tVolatile Size:");
Anton Arapov c2a608
+			dmi_memory_size(QWORD(data + 0x3C));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			if (h->length < 0x4C) break;
Anton Arapov c2a608
+			printf("\tCache Size:");
Anton Arapov c2a608
+			dmi_memory_size(QWORD(data + 0x44));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
+			if (h->length < 0x54) break;
Anton Arapov c2a608
+			printf("\tLogical Size:");
Anton Arapov c2a608
+			dmi_memory_size(QWORD(data + 0x4C));
Anton Arapov c2a608
+			printf("\n");
Anton Arapov c2a608
 			break;
Anton Arapov c2a608
 
Anton Arapov c2a608
 		case 18: /* 7.19 32-bit Memory Error Information */
Anton Arapov c2a608
-- 
Anton Arapov c2a608
2.17.1
Anton Arapov c2a608