xref: /openbmc/phosphor-mrw-tools/Util.pm (revision 44aecce4)
18df7be8fSMatt Spinlerpackage Util;
28df7be8fSMatt Spinler
38df7be8fSMatt Spinler#Holds common utility functions for MRW processing.
48df7be8fSMatt Spinler
58df7be8fSMatt Spinleruse strict;
68df7be8fSMatt Spinleruse warnings;
78df7be8fSMatt Spinler
88df7be8fSMatt Spinleruse mrw::Targets;
98df7be8fSMatt Spinler
108df7be8fSMatt Spinler#Returns the BMC target for a system.
118df7be8fSMatt Spinler# param[in] $targetObj = The Targets object
128df7be8fSMatt Spinlersub getBMCTarget
138df7be8fSMatt Spinler{
148df7be8fSMatt Spinler    my ($targetObj) = @_;
158df7be8fSMatt Spinler
168df7be8fSMatt Spinler    for my $target (keys %{$targetObj->getAllTargets()}) {
178df7be8fSMatt Spinler        if ($targetObj->getType($target) eq "BMC") {
188df7be8fSMatt Spinler           return $target;
198df7be8fSMatt Spinler        }
208df7be8fSMatt Spinler    }
218df7be8fSMatt Spinler
228df7be8fSMatt Spinler    die "Could not find BMC target in the MRW XML\n";
238df7be8fSMatt Spinler}
248df7be8fSMatt Spinler
258df7be8fSMatt Spinler
268df7be8fSMatt Spinler#Returns an array of child units based on their Target Type.
278df7be8fSMatt Spinler# param[in] $targetObj = The Targets object
288df7be8fSMatt Spinler# param[in] $unitTargetType = The target type of the units to find
298df7be8fSMatt Spinler# param[in] $chip = The chip target to find the units on
308df7be8fSMatt Spinlersub getChildUnitsWithTargetType
318df7be8fSMatt Spinler{
328df7be8fSMatt Spinler    my ($targetObj, $unitTargetType, $chip) = @_;
338df7be8fSMatt Spinler    my @units;
348df7be8fSMatt Spinler
358df7be8fSMatt Spinler    my @children = $targetObj->getAllTargetChildren($chip);
368df7be8fSMatt Spinler
378df7be8fSMatt Spinler    for my $child (@children) {
388df7be8fSMatt Spinler        if ($targetObj->getTargetType($child) eq $unitTargetType) {
398df7be8fSMatt Spinler            push @units, $child;
408df7be8fSMatt Spinler        }
418df7be8fSMatt Spinler    }
428df7be8fSMatt Spinler
438df7be8fSMatt Spinler    return @units;
448df7be8fSMatt Spinler}
458df7be8fSMatt Spinler
46694e8dc7SMarri Devender Rao#Returns size of child units based on their Type.
47694e8dc7SMarri Devender Rao# param[in] $targetObj = The Targets object
48694e8dc7SMarri Devender Rao# param[in] $type = The type of the units to find
49694e8dc7SMarri Devender Rao# param[in] $chip = The chip target to find the units on
50694e8dc7SMarri Devender Raosub getSizeOfChildUnitsWithType
51694e8dc7SMarri Devender Rao{
52694e8dc7SMarri Devender Rao    my ($targetObj, $type, $chip) = @_;
53694e8dc7SMarri Devender Rao    my @units;
54694e8dc7SMarri Devender Rao    my @children = $targetObj->getAllTargetChildren($chip);
55694e8dc7SMarri Devender Rao    for my $child (@children) {
56694e8dc7SMarri Devender Rao        if ($targetObj->getType($child) eq $type) {
57694e8dc7SMarri Devender Rao            push @units, $child;
58694e8dc7SMarri Devender Rao        }
59694e8dc7SMarri Devender Rao    }
60694e8dc7SMarri Devender Rao    my $size = @units;
61694e8dc7SMarri Devender Rao    return $size;
62694e8dc7SMarri Devender Rao}
63694e8dc7SMarri Devender Rao
646225e93dSDeepak Kodihalli# Returns OBMC name corresponding to a Target name
656225e93dSDeepak Kodihalli# param[in] \@inventory = reference to array of inventory items
666225e93dSDeepak Kodihalli# param[in] $targetName = A Target name
676225e93dSDeepak Kodihallisub getObmcName
686225e93dSDeepak Kodihalli{
696225e93dSDeepak Kodihalli    my ($inventory_ref, $targetName) = @_;
706225e93dSDeepak Kodihalli    my @inventory = @{ $inventory_ref };
716225e93dSDeepak Kodihalli
726225e93dSDeepak Kodihalli    for my $item (@inventory)
736225e93dSDeepak Kodihalli    {
746225e93dSDeepak Kodihalli        if($item->{TARGET} eq $targetName)
756225e93dSDeepak Kodihalli        {
766225e93dSDeepak Kodihalli            return $item->{OBMC_NAME};
776225e93dSDeepak Kodihalli        }
786225e93dSDeepak Kodihalli    }
796225e93dSDeepak Kodihalli    return undef;
806225e93dSDeepak Kodihalli}
816225e93dSDeepak Kodihalli
82d92101d5SRatan Gupta#Returns the array of all the device paths based on the type.
83d92101d5SRatan Gupta# param[in] \@inventory = reference to array of inventory items.
84d92101d5SRatan Gupta# param[in] $targetObj = The Targets object.
85d92101d5SRatan Gupta# param[in] $type = The target type.
86d92101d5SRatan Guptasub getDevicePath
87d92101d5SRatan Gupta{
88d92101d5SRatan Gupta    my ($inventory_ref, $targetObj, $type) = @_;
89d92101d5SRatan Gupta    my @inventory = @{ $inventory_ref };
90d92101d5SRatan Gupta    my $fruType = "";
91d92101d5SRatan Gupta    my @devices;
92d92101d5SRatan Gupta    for my $item (@inventory)
93d92101d5SRatan Gupta    {
94d92101d5SRatan Gupta        if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) {
95d92101d5SRatan Gupta            $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE");
96d92101d5SRatan Gupta            if ($fruType eq $type) {
97d92101d5SRatan Gupta                push(@devices,$item->{OBMC_NAME});
98d92101d5SRatan Gupta            }
99d92101d5SRatan Gupta        }
100d92101d5SRatan Gupta    }
101d92101d5SRatan Gupta    return @devices;
102d92101d5SRatan Gupta}
103d92101d5SRatan Gupta
104c1b12a4dSDeepak Kodihalli#Convert the MRW I2C address into the standard 7-bit format
105c1b12a4dSDeepak Kodihalli# $addr = the I2C Address
106c1b12a4dSDeepak Kodihallisub adjustI2CAddress
107c1b12a4dSDeepak Kodihalli{
108c1b12a4dSDeepak Kodihalli    my $addr = shift;
109c1b12a4dSDeepak Kodihalli
110c1b12a4dSDeepak Kodihalli    #MRW holds the 8 bit value.  We need the 7 bit one.
111c1b12a4dSDeepak Kodihalli    $addr = $addr >> 1;
112c1b12a4dSDeepak Kodihalli    $addr = sprintf("0x%X", $addr);
113c1b12a4dSDeepak Kodihalli    $addr = lc $addr;
114c1b12a4dSDeepak Kodihalli
115c1b12a4dSDeepak Kodihalli    return $addr;
116c1b12a4dSDeepak Kodihalli}
117d92101d5SRatan Gupta
1189283add2SDeepak Kodihalli#Return nearest FRU enclosing the input target
1199283add2SDeepak Kodihalli# $targets = the Targets object
1209283add2SDeepak Kodihalli# $targetName = the target name
1219283add2SDeepak Kodihallisub getEnclosingFru
1229283add2SDeepak Kodihalli{
1239283add2SDeepak Kodihalli    my ($targets, $targetName) = @_;
1249283add2SDeepak Kodihalli
1259283add2SDeepak Kodihalli    if (($targetName eq "") || (!defined $targetName))
1269283add2SDeepak Kodihalli    {
1279283add2SDeepak Kodihalli        return "";
1289283add2SDeepak Kodihalli    }
1299283add2SDeepak Kodihalli
1309283add2SDeepak Kodihalli    if (!$targets->isBadAttribute($targetName, "RU_TYPE"))
1319283add2SDeepak Kodihalli    {
1329283add2SDeepak Kodihalli        my $ruType = $targets->getAttribute($targetName, "RU_TYPE");
1339283add2SDeepak Kodihalli        if (($ruType eq "FRU") || ($ruType eq "CRU"))
1349283add2SDeepak Kodihalli        {
1359283add2SDeepak Kodihalli            return $targetName;
1369283add2SDeepak Kodihalli        }
1379283add2SDeepak Kodihalli    }
1389283add2SDeepak Kodihalli
1399283add2SDeepak Kodihalli    my $parent = $targets->getTargetParent($targetName);
1409283add2SDeepak Kodihalli    return getEnclosingFru($targets, $parent);
1419283add2SDeepak Kodihalli}
1429283add2SDeepak Kodihalli
1438f5dec5cSDeepak Kodihalli#Convert I2C port number from MRW scheme to Linux numbering scheme
1448f5dec5cSDeepak Kodihalli# $port = the I2C port number
1458f5dec5cSDeepak Kodihallisub adjustI2CPort
1468f5dec5cSDeepak Kodihalli{
1478f5dec5cSDeepak Kodihalli    my $port = shift;
1488f5dec5cSDeepak Kodihalli
1498f5dec5cSDeepak Kodihalli    return $port - 1;
1508f5dec5cSDeepak Kodihalli}
1518f5dec5cSDeepak Kodihalli
152*44aecce4SMatt Spinler# Get the location code for the target passed in, like P1-C5.
153*44aecce4SMatt Spinler#  $targets = the targets object
154*44aecce4SMatt Spinler#  $target = target to get the location code of
155*44aecce4SMatt Spinlersub getLocationCode
156*44aecce4SMatt Spinler{
157*44aecce4SMatt Spinler    my ($targets, $passedInTarget) = @_;
158*44aecce4SMatt Spinler    my $locCode = undef;
159*44aecce4SMatt Spinler    my $target = $passedInTarget;
160*44aecce4SMatt Spinler    my $done = 0;
161*44aecce4SMatt Spinler
162*44aecce4SMatt Spinler    # Walk up the parent chain prepending segments until an absolute
163*44aecce4SMatt Spinler    # location code is found.
164*44aecce4SMatt Spinler    while (!$done)
165*44aecce4SMatt Spinler    {
166*44aecce4SMatt Spinler        if (!$targets->isBadAttribute($target, "LOCATION_CODE"))
167*44aecce4SMatt Spinler        {
168*44aecce4SMatt Spinler            my $loc = $targets->getAttribute($target, "LOCATION_CODE");
169*44aecce4SMatt Spinler            my $type = $targets->getAttribute($target, "LOCATION_CODE_TYPE");
170*44aecce4SMatt Spinler
171*44aecce4SMatt Spinler            if (length($loc) > 0 )
172*44aecce4SMatt Spinler            {
173*44aecce4SMatt Spinler                if (defined $locCode)
174*44aecce4SMatt Spinler                {
175*44aecce4SMatt Spinler                    $locCode = $loc . '-' . $locCode;
176*44aecce4SMatt Spinler                }
177*44aecce4SMatt Spinler                else
178*44aecce4SMatt Spinler                {
179*44aecce4SMatt Spinler                    $locCode = $loc;
180*44aecce4SMatt Spinler                }
181*44aecce4SMatt Spinler
182*44aecce4SMatt Spinler                if ($type eq "ABSOLUTE")
183*44aecce4SMatt Spinler                {
184*44aecce4SMatt Spinler                    $done = 1;
185*44aecce4SMatt Spinler                }
186*44aecce4SMatt Spinler            }
187*44aecce4SMatt Spinler            else
188*44aecce4SMatt Spinler            {
189*44aecce4SMatt Spinler                die "Missing location code on $target\n" if $type eq "ABSOLUTE";
190*44aecce4SMatt Spinler            }
191*44aecce4SMatt Spinler        }
192*44aecce4SMatt Spinler
193*44aecce4SMatt Spinler        if (!$done)
194*44aecce4SMatt Spinler        {
195*44aecce4SMatt Spinler            $target = $targets->getTargetParent($target);
196*44aecce4SMatt Spinler            if (not defined $target)
197*44aecce4SMatt Spinler            {
198*44aecce4SMatt Spinler                die "Did not find complete location " .
199*44aecce4SMatt Spinler                    "code for $passedInTarget\n";
200*44aecce4SMatt Spinler            }
201*44aecce4SMatt Spinler        }
202*44aecce4SMatt Spinler    }
203*44aecce4SMatt Spinler
204*44aecce4SMatt Spinler    return $locCode;
205*44aecce4SMatt Spinler}
206*44aecce4SMatt Spinler
2078df7be8fSMatt Spinler1;
2088df7be8fSMatt Spinler
2098df7be8fSMatt Spinler=head1 NAME
2108df7be8fSMatt Spinler
2118df7be8fSMatt SpinlerUtil
2128df7be8fSMatt Spinler
2138df7be8fSMatt Spinler=head1 DESCRIPTION
2148df7be8fSMatt Spinler
2158df7be8fSMatt SpinlerContains utility functions for the MRW parsers.
2168df7be8fSMatt Spinler
2178df7be8fSMatt Spinler=head1 METHODS
2188df7be8fSMatt Spinler
2198df7be8fSMatt Spinler=over 4
2208df7be8fSMatt Spinler
2218df7be8fSMatt Spinler=item getBMCTarget(C<TargetsObj>)
2228df7be8fSMatt Spinler
2238df7be8fSMatt SpinlerReturns the target string for the BMC chip.  If it can't find one,
2248df7be8fSMatt Spinlerit will die.  Currently supports single BMC systems.
2258df7be8fSMatt Spinler
2268df7be8fSMatt Spinler=item getChildUnitsWithTargetType(C<TargetsObj>, C<TargetType>, C<ChipTarget>)
2278df7be8fSMatt Spinler
2288df7be8fSMatt SpinlerReturns an array of targets that have target-type C<TargetType>
2298df7be8fSMatt Spinlerand are children (any level) of target C<ChipTarget>.
2308df7be8fSMatt Spinler
231694e8dc7SMarri Devender Rao=item getSizeOfChildUnitsWithType(C<TargetsObj>, C<Type>, C<ChipTarget>)
232694e8dc7SMarri Devender Rao
233694e8dc7SMarri Devender RaoReturns size of targets that have Type C<Type>
234694e8dc7SMarri Devender Raoand are children (any level) of target C<ChipTarget>.
235694e8dc7SMarri Devender Rao
2366225e93dSDeepak Kodihalli=item getObmcName(C<InventoryItems>, C<TargetName>)
2376225e93dSDeepak Kodihalli
2386225e93dSDeepak KodihalliReturns an OBMC name corresponding to a Target name. Returns
2396225e93dSDeepak Kodihalliundef if the Target name is not found.
2406225e93dSDeepak Kodihalli
241d92101d5SRatan Gupta=item getDevicePath(C<InventoryItems>, C<TargetsObj>, C<TargetType>)
2426474db85SDeepak Kodihalli
2436474db85SDeepak KodihalliReturns an array of all device paths (OBMC names)  based on C<TargetType>.
244d92101d5SRatan Gupta
245c1b12a4dSDeepak Kodihalli=item adjustI2CAddress(C<I2CAddress>)
246c1b12a4dSDeepak Kodihalli
247c1b12a4dSDeepak KodihalliReturns C<I2CAddress> converted from MRW format (8-bit) to the standard 7-bit
248c1b12a4dSDeepak Kodihalliformat.
249c1b12a4dSDeepak Kodihalli
2509283add2SDeepak Kodihalli=item getEnclosingFru(C<TargetsObj>, C<Target>)
2519283add2SDeepak Kodihalli
2529283add2SDeepak KodihalliFinds the nearest FRU enclosing the input Target.
2539283add2SDeepak Kodihalli
2548f5dec5cSDeepak Kodihalli=item adjustI2CPort(C<I2CPort>)
2558f5dec5cSDeepak Kodihalli
25693e1a7c0SGunnar MillsReturns C<I2CPort> converted from MRW numbering scheme to Linux numbering scheme.
2578f5dec5cSDeepak Kodihalli
258*44aecce4SMatt Spinler=item getLocationCode(C<TargetsObj, C<Target>)
259*44aecce4SMatt Spinler
260*44aecce4SMatt SpinlerGets the location code for the input Target.
261*44aecce4SMatt Spinler
2628df7be8fSMatt Spinler=back
2638df7be8fSMatt Spinler
2648df7be8fSMatt Spinler=cut
265