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