diff mbox series

[5/6] decode-dimms: Add basic decoding of type specific information for DDR5

Message ID 20241114-decode-ddr5-v1-5-0ed2db8ef30f@outlook.com.au
State New
Headers show
Series [1/6] decode-dimms: Implement DDR5 checksum parsing | expand

Commit Message

Stephen Horvath via B4 Relay Nov. 14, 2024, 6:37 a.m. UTC
From: Stephen Horvath <s.horvath@outlook.com.au>

Decode more manufacturer information, but only the info that is specific
to certain types of DDR5 memory modules. This is completely untested
since my modules don't expose this. I also only have UDIMMs.

Signed-off-by: Stephen Horvath <s.horvath@outlook.com.au>
---
 eeprom/decode-dimms | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)
diff mbox series

Patch

diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms
index f36af056a480d429203abc7e0dfda3751027948b..a3b613bc869bbd1d8183958c42d05c3b3e3653ca 100755
--- a/eeprom/decode-dimms
+++ b/eeprom/decode-dimms
@@ -2386,6 +2386,77 @@  sub decode_ddr5_sdram($)
 			(($bytes->[231] >> 4) & 15) + 1));
 	printl("Module Reference Card",
 		ddr3_reference_card($bytes->[232], $bytes->[232]));
+
+# type-specific settings
+	if ($spd_info_rev == 0x11 &&
+	    ($type == 0x02 || # UDIMM
+	    $type == 0x03 || # SODIMM
+	    $type == 0x05 || # CUDIMM
+	    $type == 0x06)) { # CSODIMM
+		prints("Unbuffered Memory Module");
+
+		printl("Clock driver manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+	}
+
+	if ($spd_info_rev == 0x11 &&
+	    ($type == 0x01 || # RDIMM
+	    $type == 0x04)) { # LRDIMM
+		prints("Registered Memory Module");
+
+		printl("Clock driver manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+		printl("Data buffer manufacturer",
+			manufacturer_ddr3($bytes->[244], $bytes->[245]));
+	}
+
+	if ($spd_info_rev == 0x11 &&
+	    ($type == 0x07)) { # MRDIMM
+		prints("Multiplexed Rank Memory Module");
+
+		printl("Clock driver manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+		printl("Data buffer manufacturer",
+			manufacturer_ddr3($bytes->[244], $bytes->[245]));
+	}
+
+	if ($spd_info_rev == 0x10 &&
+	    ($type == 0x0A)) { # DDIMM
+		prints("Differential Memory Module");
+
+		printl("Memory buffer manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+	}
+
+	if ($spd_info_rev == 0x01 &&
+	    ($raw_type & 0xf0 == 0x90)) { # NVDIMM-N
+		prints("Non-Volatile Memory Module");
+
+		printl("Clock driver manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+		printl("Data buffer manufacturer",
+			manufacturer_ddr3($bytes->[244], $bytes->[245]));
+	}
+
+	if ($spd_info_rev == 0x10 &&
+	    ($raw_type & 0xf0 == 0xA0)) { # NVDIMM-P
+		prints("Non-Volatile Memory Module");
+
+		printl("Clock driver manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+		printl("Data buffer manufacturer",
+			manufacturer_ddr3($bytes->[244], $bytes->[245]));
+	}
+
+	if ($spd_info_rev == 0x10 &&
+	    ($type == 0x08)) { # CAMM2
+		prints("Compression Attached Memory Module");
+
+		printl("Clock driver 0 manufacturer",
+			manufacturer_ddr3($bytes->[240], $bytes->[241]));
+		printl("Clock driver 1 manufacturer",
+			manufacturer_ddr3($bytes->[244], $bytes->[245]));
+	}
 }
 
 # Parameter: EEPROM bytes 0-127 (using 4-5)