diff options
Diffstat (limited to 'eeprom/decode-xeon')
-rwxr-xr-x | eeprom/decode-xeon | 197 |
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"; |