1#!/usr/bin/env perl 2 3use strict; 4use warnings; 5 6 7use mrw::Targets; 8use mrw::Inventory; 9use mrw::Util; 10use Getopt::Long; 11 12 13my $mrwFile = ""; 14my $outFile = ""; 15 16 17GetOptions( 18"m=s" => \$mrwFile, 19"o=s" => \$outFile, 20) 21or printUsage(); 22 23 24if (($mrwFile eq "") or ($outFile eq "")) 25{ 26 printUsage(); 27} 28 29 30# Load system MRW 31my $targets = Targets->new; 32$targets->loadXML($mrwFile); 33 34 35# Load inventory 36my @inventory = Inventory::getInventory($targets); 37 38 39# paths 40my $i2cPath = "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus\@1e78a000/1e78a100.i2c-bus/i2c-<port>/<port>-00<address>"; 41my $fsiMasterPath = "/sys/devices/platform/gpio-fsi/fsi0/slave\@00:00/raw"; 42my $fsiSlavePath = "/sys/devices/platform/gpio-fsi/fsi0/slave\@00:00/00:00:00:0a/fsi1/slave\@<link>:00/raw"; 43 44 45open(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!"; 46 47genI2CCallouts(); 48genProcFSICallouts(); 49 50close $fh; 51 52 53sub genI2CCallouts 54{ 55 my $bmc = Util::getBMCTarget($targets); 56 my $connections = $targets->findConnections($bmc, "I2C"); 57 # hash of arrays - {I2C master port : list of connected slave Targets} 58 my %masters; 59 60 for my $i2c (@{$connections->{CONN}}) 61 { 62 my $master = $i2c->{SOURCE}; 63 my $port = $targets->getAttribute($master,"I2C_PORT"); 64 $port = Util::adjustI2CPort($port); 65 my $slave = $i2c->{DEST}; 66 push(@{$masters{$port}}, $slave); 67 } 68 69 for my $m (keys %masters) 70 { 71 for my $s(@{$masters{$m}}) 72 { 73 my $addr = $targets->getAttribute($s,"I2C_ADDRESS"); 74 $addr = Util::adjustI2CAddress(hex($addr)); 75 $addr = substr $addr, 2; # strip 0x 76 my $path = $i2cPath; 77 $path =~ s/<port>/$m/g; 78 $path =~ s/<address>/$addr/g; 79 print $fh $path.": "; 80 my $fru = Util::getEnclosingFru($targets, $s); 81 print $fh Util::getObmcName(\@inventory, $fru)."\n"; 82 } 83 } 84} 85 86 87sub genProcFSICallouts 88{ 89 my @procs; 90 for my $target (keys %{$targets->getAllTargets()}) 91 { 92 if ($targets->getType($target) eq "PROC") 93 { 94 push @procs, $target; 95 } 96 } 97 98 for my $proc (@procs) 99 { 100 my $connections = $targets->findConnections($proc, "FSIM"); 101 if ("" ne $connections) 102 { 103 # This is a master processor 104 my $path = $fsiMasterPath; # revisit on a multinode system 105 my $fru = Util::getEnclosingFru($targets, $proc); 106 print $fh $path.": ".Util::getObmcName(\@inventory, $fru); 107 for my $fsi (@{$connections->{CONN}}) 108 { 109 my $master = $fsi->{SOURCE}; 110 my $slave = $fsi->{DEST}; 111 my $link = $targets->getAttribute($master, "FSI_LINK"); 112 $link = substr $link, 2; # strip 0x 113 my $fru = Util::getEnclosingFru($targets, $slave); 114 $path = $fsiSlavePath; 115 $path =~ s/<link>/$link/g; 116 print $fh "\n".$path.": ".Util::getObmcName(\@inventory, $fru); 117 } 118 } 119 } 120} 121 122 123sub printUsage 124{ 125 print " 126 $0 -m [MRW file] -o [Output filename]\n"; 127 exit(1); 128} 129