xref: /openbmc/phosphor-mrw-tools/gen_fru_properties.pl (revision b4edc27a3c25cf78c6eeb06f5e45c3b379da445d)
1*b4edc27aSAndrew Geissler#!/usr/bin/env perl
265ca8e19SAndrew Geissler
39f3e1c1eSDeepak Kodihalliuse strict;
49f3e1c1eSDeepak Kodihalliuse warnings;
59f3e1c1eSDeepak Kodihalli
69f3e1c1eSDeepak Kodihalli
79f3e1c1eSDeepak Kodihalliuse mrw::Targets;
89f3e1c1eSDeepak Kodihalliuse mrw::Inventory;
99f3e1c1eSDeepak Kodihalliuse mrw::Util;
109f3e1c1eSDeepak Kodihalliuse Getopt::Long;
119f3e1c1eSDeepak Kodihalliuse YAML::Tiny qw(LoadFile);
129f3e1c1eSDeepak Kodihalli
139f3e1c1eSDeepak Kodihalli
149f3e1c1eSDeepak Kodihallimy $mrwFile = "";
159f3e1c1eSDeepak Kodihallimy $outFile = "";
169f3e1c1eSDeepak Kodihallimy $configFile = "";
1751041fc8SSantosh Puranikmy $skipBrokenMrw = 0;
189f3e1c1eSDeepak Kodihalli
199f3e1c1eSDeepak Kodihalli
209f3e1c1eSDeepak KodihalliGetOptions(
219f3e1c1eSDeepak Kodihalli"m=s" => \$mrwFile,
229f3e1c1eSDeepak Kodihalli"c=s" => \$configFile,
239f3e1c1eSDeepak Kodihalli"o=s" => \$outFile,
2451041fc8SSantosh Puranik"skip-broken-mrw" => \$skipBrokenMrw
259f3e1c1eSDeepak Kodihalli)
269f3e1c1eSDeepak Kodihallior printUsage();
279f3e1c1eSDeepak Kodihalli
289f3e1c1eSDeepak Kodihalli
299f3e1c1eSDeepak Kodihalliif (($mrwFile eq "") or ($configFile eq "") or ($outFile eq ""))
309f3e1c1eSDeepak Kodihalli{
319f3e1c1eSDeepak Kodihalli    printUsage();
329f3e1c1eSDeepak Kodihalli}
339f3e1c1eSDeepak Kodihalli
349f3e1c1eSDeepak Kodihalli
359f3e1c1eSDeepak Kodihalli# Load system MRW
369f3e1c1eSDeepak Kodihallimy $targets = Targets->new;
379f3e1c1eSDeepak Kodihalli$targets->loadXML($mrwFile);
389f3e1c1eSDeepak Kodihallimy @inventory = Inventory::getInventory($targets);
399f3e1c1eSDeepak Kodihalli
409f3e1c1eSDeepak Kodihalli
419f3e1c1eSDeepak Kodihalli# Parse config YAML
429f3e1c1eSDeepak Kodihallimy $targetItems = LoadFile($configFile);
439f3e1c1eSDeepak Kodihalli
449f3e1c1eSDeepak Kodihalli
459f3e1c1eSDeepak Kodihalli# Targets we're interested in, from the config YAML
469f3e1c1eSDeepak Kodihallimy @targetNames = keys %{$targetItems};
479f3e1c1eSDeepak Kodihallimy %targetHash;
489f3e1c1eSDeepak Kodihalli@targetHash{@targetNames} = ();
499f3e1c1eSDeepak Kodihalli
509f3e1c1eSDeepak Kodihalli
519f3e1c1eSDeepak Kodihalli# Target Type : Target inventory path
529f3e1c1eSDeepak Kodihallimy %defaultPaths = (
539f3e1c1eSDeepak Kodihalli    "ETHERNET",
549f3e1c1eSDeepak Kodihalli     Util::getObmcName(
559f3e1c1eSDeepak Kodihalli         \@inventory,
569f3e1c1eSDeepak Kodihalli         Util::getBMCTarget($targets))."/ethernet"
579f3e1c1eSDeepak Kodihalli);
589f3e1c1eSDeepak Kodihalli
599f3e1c1eSDeepak Kodihalli
609f3e1c1eSDeepak Kodihalliopen(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!";
619f3e1c1eSDeepak Kodihalli# Retrieve OBMC path of targets we're interested in
629f3e1c1eSDeepak Kodihallifor my $item (@inventory) {
639f3e1c1eSDeepak Kodihalli    my $targetType = "";
649f3e1c1eSDeepak Kodihalli    my $path = "";
659f3e1c1eSDeepak Kodihalli
669f3e1c1eSDeepak Kodihalli    if (!$targets->isBadAttribute($item->{TARGET}, "TYPE")) {
679f3e1c1eSDeepak Kodihalli        $targetType = $targets->getAttribute($item->{TARGET}, "TYPE");
689f3e1c1eSDeepak Kodihalli    }
699f3e1c1eSDeepak Kodihalli    next if (not exists $targetItems->{$targetType});
709f3e1c1eSDeepak Kodihalli
719f3e1c1eSDeepak Kodihalli    writeOutput($targetType,
729f3e1c1eSDeepak Kodihalli                $item,
739f3e1c1eSDeepak Kodihalli                $targetItems);
749f3e1c1eSDeepak Kodihalli    delete($targetHash{$targetType});
759f3e1c1eSDeepak Kodihalli}
769f3e1c1eSDeepak KodihalliwriteRemaining($targetItems);
779f3e1c1eSDeepak Kodihalliclose $fh;
789f3e1c1eSDeepak Kodihalli
799f3e1c1eSDeepak Kodihalli
809f3e1c1eSDeepak Kodihallisub writeRemaining
819f3e1c1eSDeepak Kodihalli{
829f3e1c1eSDeepak Kodihalli    my ($yamlDict) = @_;
839f3e1c1eSDeepak Kodihalli    for my $type (keys %targetHash)
849f3e1c1eSDeepak Kodihalli    {
8551041fc8SSantosh Puranik        if($skipBrokenMrw and !exists $defaultPaths{$type})
8651041fc8SSantosh Puranik        {
8751041fc8SSantosh Puranik            next;
8851041fc8SSantosh Puranik        }
899f3e1c1eSDeepak Kodihalli        print $fh $defaultPaths{$type}.":";
909f3e1c1eSDeepak Kodihalli        print $fh "\n";
919f3e1c1eSDeepak Kodihalli        while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
929f3e1c1eSDeepak Kodihalli        {
939f3e1c1eSDeepak Kodihalli            print $fh "    ".$interface.":";
949f3e1c1eSDeepak Kodihalli            print $fh "\n";
959f3e1c1eSDeepak Kodihalli            while (my ($property,$value) = each %{$propertyMap})
969f3e1c1eSDeepak Kodihalli            {
979f3e1c1eSDeepak Kodihalli                $value = "'".$value."'";
989f3e1c1eSDeepak Kodihalli                print $fh "        ".$property.": ".$value;
999f3e1c1eSDeepak Kodihalli                print $fh "\n";
1009f3e1c1eSDeepak Kodihalli            }
1019f3e1c1eSDeepak Kodihalli        }
1029f3e1c1eSDeepak Kodihalli    }
1039f3e1c1eSDeepak Kodihalli}
1049f3e1c1eSDeepak Kodihalli
1059f3e1c1eSDeepak Kodihalli
1069f3e1c1eSDeepak Kodihallisub writeOutput
1079f3e1c1eSDeepak Kodihalli{
1089f3e1c1eSDeepak Kodihalli    my ($type, $item, $yamlDict) = @_;
1099f3e1c1eSDeepak Kodihalli    print $fh $item->{OBMC_NAME}.":";
1109f3e1c1eSDeepak Kodihalli    print $fh "\n";
1119f3e1c1eSDeepak Kodihalli    while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
1129f3e1c1eSDeepak Kodihalli    {
1139f3e1c1eSDeepak Kodihalli        print $fh "    ".$interface.":";
1149f3e1c1eSDeepak Kodihalli        print $fh "\n";
1159f3e1c1eSDeepak Kodihalli        while (my ($property,$value) = each %{$propertyMap})
1169f3e1c1eSDeepak Kodihalli        {
1179f3e1c1eSDeepak Kodihalli            $value = getValue($item, $property, $value);
1189f3e1c1eSDeepak Kodihalli            print $fh "        ".$property.": ".$value;
1199f3e1c1eSDeepak Kodihalli            print $fh "\n";
1209f3e1c1eSDeepak Kodihalli        }
1219f3e1c1eSDeepak Kodihalli    }
1229f3e1c1eSDeepak Kodihalli}
1239f3e1c1eSDeepak Kodihalli
1249f3e1c1eSDeepak Kodihalli
1259f3e1c1eSDeepak Kodihallisub getValue
1269f3e1c1eSDeepak Kodihalli{
1279f3e1c1eSDeepak Kodihalli    my ($item, $property, $value) = @_;
1289f3e1c1eSDeepak Kodihalli    $value = "'".$value."'";
1299f3e1c1eSDeepak Kodihalli
1309f3e1c1eSDeepak Kodihalli    if ($property eq "FieldReplaceable")
1319f3e1c1eSDeepak Kodihalli    {
1329f3e1c1eSDeepak Kodihalli        $value = "'false'";
1339f3e1c1eSDeepak Kodihalli        if (!$targets->isBadAttribute($item->{TARGET}, "RU_TYPE"))
1349f3e1c1eSDeepak Kodihalli        {
1359f3e1c1eSDeepak Kodihalli            my $ruType = $targets->getAttribute($item->{TARGET}, "RU_TYPE");
1369f3e1c1eSDeepak Kodihalli            if (($ruType eq "FRU") || ($ruType eq "CRU"))
1379f3e1c1eSDeepak Kodihalli            {
1389f3e1c1eSDeepak Kodihalli                $value = "'true'";
1399f3e1c1eSDeepak Kodihalli            }
1409f3e1c1eSDeepak Kodihalli        }
1419f3e1c1eSDeepak Kodihalli    }
1429f3e1c1eSDeepak Kodihalli
1439f3e1c1eSDeepak Kodihalli    return $value;
1449f3e1c1eSDeepak Kodihalli}
1459f3e1c1eSDeepak Kodihalli
1469f3e1c1eSDeepak Kodihalli
1479f3e1c1eSDeepak Kodihallisub printUsage
1489f3e1c1eSDeepak Kodihalli{
1499f3e1c1eSDeepak Kodihalli    print "
15051041fc8SSantosh Puranik    $0 -m [MRW file] -c [Config yaml] -o [Output filename] [OPTIONS]
15151041fc8SSantosh PuranikOptions:
15251041fc8SSantosh Puranik    --skip-broken-mrw = Skip broken MRW targets
15351041fc8SSantosh Puranik    \n";
1549f3e1c1eSDeepak Kodihalli    exit(1);
1559f3e1c1eSDeepak Kodihalli}
156