xref: /openbmc/phosphor-mrw-tools/gen_callouts.pl (revision b4edc27a3c25cf78c6eeb06f5e45c3b379da445d)
1*b4edc27aSAndrew Geissler#!/usr/bin/env perl
265ca8e19SAndrew Geissler
365682175SDeepak Kodihalliuse strict;
465682175SDeepak Kodihalliuse warnings;
565682175SDeepak Kodihalli
665682175SDeepak Kodihalli
765682175SDeepak Kodihalliuse mrw::Targets;
865682175SDeepak Kodihalliuse mrw::Inventory;
965682175SDeepak Kodihalliuse mrw::Util;
1065682175SDeepak Kodihalliuse Getopt::Long;
1165682175SDeepak Kodihalli
1265682175SDeepak Kodihalli
1365682175SDeepak Kodihallimy $mrwFile = "";
1465682175SDeepak Kodihallimy $outFile = "";
1565682175SDeepak Kodihalli
1665682175SDeepak Kodihalli
1765682175SDeepak KodihalliGetOptions(
1865682175SDeepak Kodihalli"m=s" => \$mrwFile,
1965682175SDeepak Kodihalli"o=s" => \$outFile,
2065682175SDeepak Kodihalli)
2165682175SDeepak Kodihallior printUsage();
2265682175SDeepak Kodihalli
2365682175SDeepak Kodihalli
2465682175SDeepak Kodihalliif (($mrwFile eq "") or ($outFile eq ""))
2565682175SDeepak Kodihalli{
2665682175SDeepak Kodihalli    printUsage();
2765682175SDeepak Kodihalli}
2865682175SDeepak Kodihalli
2965682175SDeepak Kodihalli
3065682175SDeepak Kodihalli# Load system MRW
3165682175SDeepak Kodihallimy $targets = Targets->new;
3265682175SDeepak Kodihalli$targets->loadXML($mrwFile);
3365682175SDeepak Kodihalli
3465682175SDeepak Kodihalli
3565682175SDeepak Kodihalli# Load inventory
3665682175SDeepak Kodihallimy @inventory = Inventory::getInventory($targets);
3765682175SDeepak Kodihalli
3865682175SDeepak Kodihalli
3965682175SDeepak Kodihalli# paths
40605b2e9cSMatt Spinlermy $i2cPath = "/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus\@1e78a000/1e78a100.i2c-bus/i2c-<port>/<port>-00<address>";
41fff3da49SDeepak Kodihallimy $fsiMasterPath = "/sys/devices/platform/gpio-fsi/fsi0/slave\@00:00/raw";
42fff3da49SDeepak Kodihallimy $fsiSlavePath = "/sys/devices/platform/gpio-fsi/fsi0/slave\@00:00/00:00:00:0a/fsi1/slave\@<link>:00/raw";
4365682175SDeepak Kodihalli
4465682175SDeepak Kodihalli
4565682175SDeepak Kodihalliopen(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!";
4665682175SDeepak Kodihalli
4765682175SDeepak KodihalligenI2CCallouts();
4865682175SDeepak KodihalligenProcFSICallouts();
4965682175SDeepak Kodihalli
5065682175SDeepak Kodihalliclose $fh;
5165682175SDeepak Kodihalli
5265682175SDeepak Kodihalli
5365682175SDeepak Kodihallisub genI2CCallouts
5465682175SDeepak Kodihalli{
5565682175SDeepak Kodihalli    my $bmc = Util::getBMCTarget($targets);
5665682175SDeepak Kodihalli    my $connections = $targets->findConnections($bmc, "I2C");
5765682175SDeepak Kodihalli    # hash of arrays - {I2C master port : list of connected slave Targets}
5865682175SDeepak Kodihalli    my %masters;
5965682175SDeepak Kodihalli
6065682175SDeepak Kodihalli    for my $i2c (@{$connections->{CONN}})
6165682175SDeepak Kodihalli    {
6265682175SDeepak Kodihalli        my $master = $i2c->{SOURCE};
6365682175SDeepak Kodihalli        my $port = $targets->getAttribute($master,"I2C_PORT");
6465682175SDeepak Kodihalli        $port = Util::adjustI2CPort($port);
6565682175SDeepak Kodihalli        my $slave = $i2c->{DEST};
6665682175SDeepak Kodihalli        push(@{$masters{$port}}, $slave);
6765682175SDeepak Kodihalli    }
6865682175SDeepak Kodihalli
6965682175SDeepak Kodihalli    for my $m (keys %masters)
7065682175SDeepak Kodihalli    {
7165682175SDeepak Kodihalli        for my $s(@{$masters{$m}})
7265682175SDeepak Kodihalli        {
7365682175SDeepak Kodihalli            my $addr = $targets->getAttribute($s,"I2C_ADDRESS");
7465682175SDeepak Kodihalli            $addr = Util::adjustI2CAddress(hex($addr));
7565682175SDeepak Kodihalli            $addr = substr $addr, 2; # strip 0x
7665682175SDeepak Kodihalli            my $path = $i2cPath;
7765682175SDeepak Kodihalli            $path =~ s/<port>/$m/g;
7865682175SDeepak Kodihalli            $path =~ s/<address>/$addr/g;
7965682175SDeepak Kodihalli            print $fh $path.": ";
8065682175SDeepak Kodihalli            my $fru = Util::getEnclosingFru($targets, $s);
8165682175SDeepak Kodihalli            print $fh Util::getObmcName(\@inventory, $fru)."\n";
8265682175SDeepak Kodihalli        }
8365682175SDeepak Kodihalli    }
8465682175SDeepak Kodihalli}
8565682175SDeepak Kodihalli
8665682175SDeepak Kodihalli
8765682175SDeepak Kodihallisub genProcFSICallouts
8865682175SDeepak Kodihalli{
8965682175SDeepak Kodihalli    my @procs;
9065682175SDeepak Kodihalli    for my $target (keys %{$targets->getAllTargets()})
9165682175SDeepak Kodihalli    {
9265682175SDeepak Kodihalli        if ($targets->getType($target) eq "PROC")
9365682175SDeepak Kodihalli        {
9465682175SDeepak Kodihalli            push @procs, $target;
9565682175SDeepak Kodihalli        }
9665682175SDeepak Kodihalli    }
9765682175SDeepak Kodihalli
9865682175SDeepak Kodihalli    for my $proc (@procs)
9965682175SDeepak Kodihalli    {
10065682175SDeepak Kodihalli        my $connections = $targets->findConnections($proc, "FSIM");
10165682175SDeepak Kodihalli        if ("" ne $connections)
10265682175SDeepak Kodihalli        {
10365682175SDeepak Kodihalli            # This is a master processor
10465682175SDeepak Kodihalli            my $path = $fsiMasterPath; # revisit on a multinode system
10565682175SDeepak Kodihalli            my $fru = Util::getEnclosingFru($targets, $proc);
10665682175SDeepak Kodihalli            print $fh $path.": ".Util::getObmcName(\@inventory, $fru);
10765682175SDeepak Kodihalli            for my $fsi (@{$connections->{CONN}})
10865682175SDeepak Kodihalli            {
10965682175SDeepak Kodihalli                my $master = $fsi->{SOURCE};
11065682175SDeepak Kodihalli                my $slave = $fsi->{DEST};
11165682175SDeepak Kodihalli                my $link = $targets->getAttribute($master, "FSI_LINK");
11265682175SDeepak Kodihalli                $link = substr $link, 2; # strip 0x
11365682175SDeepak Kodihalli                my $fru = Util::getEnclosingFru($targets, $slave);
11465682175SDeepak Kodihalli                $path = $fsiSlavePath;
11565682175SDeepak Kodihalli                $path =~ s/<link>/$link/g;
11665682175SDeepak Kodihalli                print $fh "\n".$path.": ".Util::getObmcName(\@inventory, $fru);
11765682175SDeepak Kodihalli            }
11865682175SDeepak Kodihalli        }
11965682175SDeepak Kodihalli    }
12065682175SDeepak Kodihalli}
12165682175SDeepak Kodihalli
12265682175SDeepak Kodihalli
12365682175SDeepak Kodihallisub printUsage
12465682175SDeepak Kodihalli{
12565682175SDeepak Kodihalli    print "
12665682175SDeepak Kodihalli    $0 -m [MRW file] -o [Output filename]\n";
12765682175SDeepak Kodihalli    exit(1);
12865682175SDeepak Kodihalli}
129