#!/usr/bin/perl # This file will display the edac settings for poweredge servers # Format is: socket,channel,dimm => DIMM slot my %sysmap = ( # [R]320 R320 => { "0,1,0" => 'A1', "0,1,1" => 'A4', "0,2,0" => 'A2', "0,2,1" => 'A5', "0,3,0" => 'A3', "0,3,1" => 'A6', }, R520 => { "0,1,0" => 'A1', "0,1,1" => 'A4', "0,2,0" => 'A2', "0,2,1" => 'A5', "0,3,0" => 'A3', "0,3,1" => 'A6', "1,1,0" => 'B1', "1,1,1" => 'B4', "1,2,0" => 'B2', "1,2,1" => 'B5', "1,3,0" => 'B3', "1,3,1" => 'B6', }, # [TMR]620 M620 => { "0,0,0" => 'A1', "0,0,1" => 'A5', "0,0,2" => 'A9', "0,1,0" => 'A2', "0,1,1" => 'A6', "0,1,2" => 'A10', "0,2,0" => 'A3', "0,2,1" => 'A7', "0,2,2" => 'A11', "0,3,0" => 'A4', "0,3,1" => 'A8', "0,2,3" => 'A12', "1,0,0" => 'B1', "1,0,1" => 'B5', "1,0,2" => 'B9', "1,1,0" => 'B2', "1,1,1" => 'B6', "1,1,2" => 'B10', "1,2,0" => 'B3', "1,2,1" => 'B7', "1,2,2" => 'B11', "1,3,0" => 'B4', "1,3,1" => 'B8', "1,3,2" => 'B12', }, T620 => { "0,0,0" => 'A1', "0,0,1" => 'A5', "0,0,2" => 'A9', "0,1,0" => 'A2', "0,1,1" => 'A6', "0,1,2" => 'A10', "0,2,0" => 'A3', "0,2,1" => 'A7', "0,2,2" => 'A11', "0,3,0" => 'A4', "0,3,1" => 'A8', "0,2,3" => 'A12', "1,0,0" => 'B1', "1,0,1" => 'B5', "1,0,2" => 'B9', "1,1,0" => 'B2', "1,1,1" => 'B6', "1,1,2" => 'B10', "1,2,0" => 'B3', "1,2,1" => 'B7', "1,2,2" => 'B11', "1,3,0" => 'B4', "1,3,1" => 'B8', "1,3,2" => 'B12', }, R620 => { "0,0,0" => 'A1', "0,0,1" => 'A5', "0,0,2" => 'A9', "0,1,0" => 'A2', "0,1,1" => 'A6', "0,1,2" => 'A10', "0,2,0" => 'A3', "0,2,1" => 'A7', "0,2,2" => 'A11', "0,3,0" => 'A4', "0,3,1" => 'A8', "0,3,2" => 'A12', "1,0,0" => 'B1', "1,0,1" => 'B5', "1,0,2" => 'B9', "1,1,0" => 'B2', "1,1,1" => 'B6', "1,1,2" => 'B10', "1,2,0" => 'B3', "1,2,1" => 'B7', "1,2,2" => 'B11', "1,3,0" => 'B4', "1,3,1" => 'B8', "1,3,2" => 'B12', }, # [R]720 R720 => { "0,0,0" => 'A1', "0,0,1" => 'A5', "0,0,2" => 'A9', "0,1,0" => 'A2', "0,1,1" => 'A6', "0,1,2" => 'A10', "0,2,0" => 'A3', "0,2,1" => 'A7', "0,2,2" => 'A11', "0,3,0" => 'A4', "0,3,1" => 'A8', "0,3,2" => 'A12', "1,0,0" => 'B1', "1,0,1" => 'B5', "1,0,2" => 'B9', "1,1,0" => 'B2', "1,1,1" => 'B6', "1,1,2" => 'B10', "1,2,0" => 'B3', "1,2,1" => 'B7', "1,2,2" => 'B11', "1,3,0" => 'B4', "1,3,1" => 'B8', "1,3,2" => 'B12', }, # [R]820 R820 => { "0,0,0" => 'A1', "0,0,1" => 'A5', "0,0,2" => 'A9', "0,1,0" => 'A2', "0,1,1" => 'A6', "0,1,2" => 'A10', "0,2,0" => 'A3', "0,2,1" => 'A7', "0,2,2" => 'A11', "0,3,0" => 'A4', "0,3,1" => 'A8', "0,3,2" => 'A12', "1,0,0" => 'B1', "1,0,1" => 'B5', "1,0,2" => 'B9', "1,1,0" => 'B2', "1,1,1" => 'B6', "1,1,2" => 'B10', "1,2,0" => 'B3', "1,2,1" => 'B7', "1,2,2" => 'B11', "1,3,0" => 'B4', "1,3,1" => 'B8', "1,3,2" => 'B12', "2,0,0" => 'C1', "2,0,1" => 'C5', "2,0,2" => 'C9', "2,1,0" => 'C2', "2,1,1" => 'C6', "2,1,2" => 'C10', "2,2,0" => 'C3', "2,2,1" => 'C7', "2,2,2" => 'C11', "2,3,0" => 'C4', "2,3,1" => 'C8', "2,3,2" => 'C12', "3,0,0" => 'D1', "3,0,1" => 'D5', "3,0,2" => 'D9', "3,1,0" => 'D2', "3,1,1" => 'D6', "3,1,2" => 'D10', "3,2,0" => 'D3', "3,2,1" => 'D7', "3,2,2" => 'D11', "3,3,0" => 'D4', "3,3,1" => 'D8', "3,3,2" => 'D12', }, ); # Get System ID open(F,"/sys/devices/virtual/dmi/id/product_name") || die("no dmi"); chomp($product = ); if ($product =~ /PowerEdge ([MTR]\d+)/) { $sysid = $1; } close(F); # Get Board Vendor open(F,"/sys/devices/virtual/dmi/id/board_vendor") || die("no dmi"); chomp($vendor = ); close(F); # Get Board Name open(F,"/sys/devices/virtual/dmi/id/board_name") || die("no dmi"); chomp($model = ); close(F); # Find dimm_label files open(BAR,"find /sys/devices/system/edac -iname *_dimm_label |"); while() { chomp($file = $_); open(F, $file); $label = ; close(F); # Extract OS mc/csrow/channel IDs $mc = $csrow = $ch = -1; if ($file = /mc(\d+)\/csrow(\d+)\/ch(\d+)/) { $mc = $1; $csrow = $2; $ch = $3; } # Extract Hardware Socket/Channel/DIMM IDs if ($label =~ /CPU.*#(\d+).*Channel.*#(\d+).*DIMM.*#(\d+)/) { $cpu = $1; $channel = $2; $dimm = $3; # Lookup in table $idstr = "$cpu,$channel,$dimm"; $dimm = $sysmap{$sysid}{$idstr}; $dimm_map{$dimm} .= "$mc.$csrow.$ch; "; } } close(BAR); print "Vendor: $vendor\n\tModel: $model\n"; map { print "\t\t$_: $dimm_map{$_}\n"; } sort(keys %dimm_map); print "# Populated from dmidecode:\n"; open(BAR, "dmidecode -t 17 |"); while() { if (/^Handle/) { $valid = 0; $label = 0; } if (/^.Size: (\d+)/) { $valid = 1; } if (/^.Locator: (.*)$/ && $valid) { print "# $1\n"; } }