summaryrefslogtreecommitdiff
path: root/eeprom/decode-xeon
diff options
context:
space:
mode:
authorGraydon, Tracy <tracy.graydon@intel.com>2013-01-31 18:44:07 -0800
committerGraydon, Tracy <tracy.graydon@intel.com>2013-01-31 18:44:07 -0800
commitb19d79bf9028f58e3e4226bd9410b59f19fe3c8d (patch)
treea84dec919322f3d19c7c0cf3050c8c134a0d4fc6 /eeprom/decode-xeon
downloadi2c-tools-b19d79bf9028f58e3e4226bd9410b59f19fe3c8d.tar.gz
i2c-tools-b19d79bf9028f58e3e4226bd9410b59f19fe3c8d.tar.bz2
i2c-tools-b19d79bf9028f58e3e4226bd9410b59f19fe3c8d.zip
Diffstat (limited to 'eeprom/decode-xeon')
-rwxr-xr-xeeprom/decode-xeon197
1 files changed, 197 insertions, 0 deletions
diff --git a/eeprom/decode-xeon b/eeprom/decode-xeon
new file mode 100755
index 0000000..8a400b9
--- /dev/null
+++ b/eeprom/decode-xeon
@@ -0,0 +1,197 @@
+#!/usr/bin/perl
+#
+# Copyright 1998, 1999 Philip Edelbrock <phil@netroedge.com>
+# and Mark Studebaker <mdsxyz123@yahoo.com>
+#
+# Version 0.1
+#
+#
+# ID ROM data decoding for Xeon processors.
+# Each Xeon processor contains two memories:
+# - A scratch EEPROM at an even location 0x50, 52, 54, or 56;
+# - An ID ROM at an odd location 0x51, 53, 55, or 57.
+# This program decodes the ID ROM's only.
+# The scratch EEPROMs have no prescribed format.
+# If the output of this program makes no sense for a particular device,
+# it is probably decoding a DIMM Serial Presence Detect (SPD) EEPROM.
+# See decode-dimms to decode those devices.
+#
+#
+# The eeprom driver must be loaded. For kernels older than 2.6.0, the
+# eeprom driver can be found in the lm-sensors package.
+#
+# To do:
+# Calculate and check checksums for each section
+# Decode flags in byte 0x7B (cartridge feature flags)
+#
+# References:
+# "Pentium II Xeon Processor at 400 and 450 MHz" Data Sheet
+# Intel
+#
+#
+#
+
+print "Xeon Processor Information ROM Decoder\n";
+print "Written by Philip Edelbrock and Mark Studebaker. Copyright 1998, 1999.\n";
+print "Version 2.6.3\n\n";
+
+$dimm_count=0;
+$_=`ls /proc/sys/dev/sensors/`;
+@dimm_list=split();
+
+for $i ( 0 .. $#dimm_list ) {
+ $_=$dimm_list[$i];
+ if ((/^eeprom-/) && (/-51$/ || /-53$/ || /-55$/ || /-57$/)) {
+ $dimm_count=$dimm_count + 1;
+
+ print "\nDecoding Xeon ROM: /proc/sys/dev/sensors/$dimm_list[$i]\n";
+ if (/^[^-]+-[^-]+-[^-]+-([^-]+)$/) {
+ $dimm_num=($1 - 49) / 2;
+ print "Guessing Xeon is number $dimm_num\n";
+ }
+# Decode first 16 bytes
+ print "\t\t----=== Xeon ROM Header Data ===----\n";
+
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/00`;
+ @bytes=split(" ");
+
+ printf("\tData Format Revision: \t\t\t\t0x%.4X\n", $bytes[0]);
+
+ print "\tTotal number of bytes in EEPROM:\t\t";
+ print ($bytes[1] << 4) + $bytes[2];
+ print "\n";
+
+ printf("\tProcessor Data Address:\t\t\t\t0x%.2X\n", $bytes[3]);
+ printf("\tProcessor Core Data Address:\t\t\t0x%.2X\n", $bytes[4]);
+ printf("\tL2 Cache Data Address:\t\t\t\t0x%.2X\n", $bytes[5]);
+ printf("\tSEC Cartridge Data Address:\t\t\t0x%.2X\n", $bytes[6]);
+ printf("\tPart Number Data Address:\t\t\t0x%.2X\n", $bytes[7]);
+ printf("\tThermal Reference Data Address:\t\t\t0x%.2X\n", $bytes[8]);
+ printf("\tFeature Data Address:\t\t\t\t0x%.2X\n", $bytes[9]);
+ printf("\tOther Data Address:\t\t\t\t0x%.2X\n", $bytes[10]);
+
+ print "\t\t----=== Xeon ROM Processor Data ===----\n";
+
+# Decode next 16 bytes
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/10`;
+ @bbytes=split(" ");
+ print "\tS-spec/QDF Number:\t\t\t\t\"";
+ print pack("cccccc",$bytes[14],$bytes[15],$bbytes[0],
+ $bbytes[1],$bbytes[2],$bbytes[3]);
+ print "\"\n";
+ $tmp = $bbytes[4] & 0xC0 >> 6;
+ printf("\tSample / Production:\t\t\t\t0x%.2X", $tmp);
+ if($tmp) {
+ print " (Production)\n";
+ } else {
+ print " (Sample)\n";
+ }
+
+ print "\t\t----=== Xeon ROM Core Data ===----\n";
+
+ printf("\tProcessor Core Type:\t\t\t\t0x%.2X\n",
+ ($bbytes[6] & 0xC0) >> 6);
+ printf("\tProcessor Core Family:\t\t\t\t0x%.2X\n",
+ ($bbytes[6] & 0x3C) >> 2);
+ printf("\tProcessor Core Model:\t\t\t\t0x%.2X\n",
+ (($bbytes[6] & 0x03) << 2) + (($bbytes[7] & 0xC0) >> 6));
+ printf("\tProcessor Core Stepping:\t\t\t0x%.2X\n",
+ ($bbytes[7] & 0x30) >> 4);
+ print "\tMaximum Core Frequency (Mhz):\t\t\t";
+ print ($bbytes[13] << 4) + $bbytes[14];
+ print "\n";
+
+# Decode next 16 bytes (32-47)
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/20`;
+ @bytes=split(" ");
+ print "\tCore Voltage ID (mV):\t\t\t\t";
+ print ($bbytes[15] << 4) + $bytes[0];
+ print "\n";
+ print "\tCore Voltage Tolerance, High (mV):\t\t";
+ print $bytes[1];
+ print "\n";
+ print "\tCore Voltage Tolerance, Low (mV):\t\t";
+ print $bytes[2];
+ print "\n";
+
+ print "\t\t----=== Xeon ROM L2 Cache Data ===----\n";
+
+ print "\tL2 Cache Size (KB):\t\t\t\t";
+ print ($bytes[9] << 4) + $bytes[10];
+ print "\n";
+ printf("\tNumber of SRAM Components:\t\t\t%d\n",
+ ($bytes[11] & 0xF0) >> 4);
+ print "\tL2 Cache Voltage ID (mV):\t\t\t";
+ print ($bytes[12] << 4) + $bytes[13];
+ print "\n";
+ print "\tL2 Cache Voltage Tolerance, High (mV):\t\t";
+ print $bytes[14];
+ print "\n";
+ print "\tL2 Cache Voltage Tolerance, Low (mV):\t\t";
+ print $bytes[15];
+ print "\n";
+
+# Decode next 16 bytes (48-63)
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/30`;
+ @bytes=split(" ");
+
+ printf("\tCache/Tag Stepping ID:\t\t\t\t0x%.2X\n",
+ ($bytes[0] & 0xF0) >> 4);
+
+ print "\t\t----=== Xeon ROM Cartridge Data ===----\n";
+
+ print "\tCartridge Revision:\t\t\t\t\"";
+ print pack("cccc",$bytes[2],$bytes[3],$bytes[4],$bytes[5]);
+ print "\"\n";
+ printf("\tSubstrate Rev. Software ID:\t\t\t0x%.2X\n",
+ ($bbytes[6] & 0xC0) >> 6);
+
+ print "\t\t----=== Xeon ROM Part Number Data ===----\n";
+
+ print "\tProcessor Part Number:\t\t\t\t\"";
+ print pack("ccccccc",$bytes[8],$bytes[9],$bytes[10],
+ $bytes[11],$bytes[12],$bytes[13],$bytes[14]);
+ print "\"\n";
+ $byte15=$byte[15];
+
+# Decode next 16 bytes (64-79)
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/40`;
+ @bytes=split(" ");
+
+ print "\tProcessor BOM ID:\t\t\t\t\"";
+ print pack("cccccccccccccc",$byte15,$bytes[0],$bytes[1],
+ $bytes[2],$bytes[3],$bytes[4],$bytes[5],$bytes[6],
+ $bytes[7],$bytes[8],$bytes[9],$bytes[10],$bytes[11],
+ $bytes[12]);
+ print "\"\n";
+
+# Decode next 16 bytes (80-95)
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/50`;
+ @bbytes=split(" ");
+ printf("\tProcessor Electronic Signature: \t\t0x%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X\n",
+ $bytes[13],$bytes[14],$bytes[15],$bbytes[0],
+ $bbytes[1],$bbytes[2],$bbytes[3],$bbytes[4]);
+
+# Decode next 16 bytes (96-111)
+# Not used...
+
+# Decode next 16 bytes (112-127)
+ $_=`cat /proc/sys/dev/sensors/$dimm_list[$i]/70`;
+ @bytes=split(" ");
+
+ print "\t\t----=== Xeon Thermal Reference Data ===----\n";
+
+ printf("\tThermal Reference Byte: \t\t\t0x%.2X\n", $bytes[0]);
+
+ print "\t\t----=== Xeon ROM Feature Data ===----\n";
+
+ printf("\tProcessor Core Feature Flags: \t\t\t0x%.2X%.2X%.2X%.2X\n",
+ $bytes[4],$bytes[5],$bytes[6],$bytes[7]);
+ printf("\tCartridge Feature Flags: \t\t\t0x%.2X%.2X%.2X%.2X\n",
+ $bytes[8],$bytes[9],$bytes[10],$bytes[11]);
+ printf("\tNumber of Devices in TAP Chain:\t\t\t%d\n",
+ ($bytes[12] & 0xF0) >> 4);
+
+ }
+}
+print "\n\nNumber of Xeon ROMs detected and decoded: $dimm_count\n";