blob: 050fee6c0a6b20f8d343848c3a0fa7694d8a24cd [file] [log] [blame]
Matt Spinler8df7be82017-01-09 15:42:05 -06001package Util;
2
3#Holds common utility functions for MRW processing.
4
5use strict;
6use warnings;
7
8use mrw::Targets;
9
10#Returns the BMC target for a system.
11# param[in] $targetObj = The Targets object
12sub getBMCTarget
13{
14 my ($targetObj) = @_;
15
16 for my $target (keys %{$targetObj->getAllTargets()}) {
17 if ($targetObj->getType($target) eq "BMC") {
18 return $target;
19 }
20 }
21
22 die "Could not find BMC target in the MRW XML\n";
23}
24
25
26#Returns an array of child units based on their Target Type.
27# param[in] $targetObj = The Targets object
28# param[in] $unitTargetType = The target type of the units to find
29# param[in] $chip = The chip target to find the units on
30sub getChildUnitsWithTargetType
31{
32 my ($targetObj, $unitTargetType, $chip) = @_;
33 my @units;
34
35 my @children = $targetObj->getAllTargetChildren($chip);
36
37 for my $child (@children) {
38 if ($targetObj->getTargetType($child) eq $unitTargetType) {
39 push @units, $child;
40 }
41 }
42
43 return @units;
44}
45
Deepak Kodihalli6225e932017-02-07 12:14:55 -060046# Returns OBMC name corresponding to a Target name
47# param[in] \@inventory = reference to array of inventory items
48# param[in] $targetName = A Target name
49sub getObmcName
50{
51 my ($inventory_ref, $targetName) = @_;
52 my @inventory = @{ $inventory_ref };
53
54 for my $item (@inventory)
55 {
56 if($item->{TARGET} eq $targetName)
57 {
58 return $item->{OBMC_NAME};
59 }
60 }
61 return undef;
62}
63
Ratan Guptad92101d2017-02-15 19:40:39 +053064#Returns the array of all the device paths based on the type.
65# param[in] \@inventory = reference to array of inventory items.
66# param[in] $targetObj = The Targets object.
67# param[in] $type = The target type.
68sub getDevicePath
69{
70 my ($inventory_ref, $targetObj, $type) = @_;
71 my @inventory = @{ $inventory_ref };
72 my $fruType = "";
73 my @devices;
74 for my $item (@inventory)
75 {
76 if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) {
77 $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE");
78 if ($fruType eq $type) {
79 push(@devices,$item->{OBMC_NAME});
80 }
81 }
82 }
83 return @devices;
84}
85
Deepak Kodihallic1b12a42017-02-22 04:00:54 -060086#Convert the MRW I2C address into the standard 7-bit format
87# $addr = the I2C Address
88sub adjustI2CAddress
89{
90 my $addr = shift;
91
92 #MRW holds the 8 bit value. We need the 7 bit one.
93 $addr = $addr >> 1;
94 $addr = sprintf("0x%X", $addr);
95 $addr = lc $addr;
96
97 return $addr;
98}
Ratan Guptad92101d2017-02-15 19:40:39 +053099
Deepak Kodihalli9283add2017-02-22 04:14:01 -0600100#Return nearest FRU enclosing the input target
101# $targets = the Targets object
102# $targetName = the target name
103sub getEnclosingFru
104{
105 my ($targets, $targetName) = @_;
106
107 if (($targetName eq "") || (!defined $targetName))
108 {
109 return "";
110 }
111
112 if (!$targets->isBadAttribute($targetName, "RU_TYPE"))
113 {
114 my $ruType = $targets->getAttribute($targetName, "RU_TYPE");
115 if (($ruType eq "FRU") || ($ruType eq "CRU"))
116 {
117 return $targetName;
118 }
119 }
120
121 my $parent = $targets->getTargetParent($targetName);
122 return getEnclosingFru($targets, $parent);
123}
124
Matt Spinler8df7be82017-01-09 15:42:05 -06001251;
126
127=head1 NAME
128
129Util
130
131=head1 DESCRIPTION
132
133Contains utility functions for the MRW parsers.
134
135=head1 METHODS
136
137=over 4
138
139=item getBMCTarget(C<TargetsObj>)
140
141Returns the target string for the BMC chip. If it can't find one,
142it will die. Currently supports single BMC systems.
143
144=item getChildUnitsWithTargetType(C<TargetsObj>, C<TargetType>, C<ChipTarget>)
145
146Returns an array of targets that have target-type C<TargetType>
147and are children (any level) of target C<ChipTarget>.
148
Deepak Kodihalli6225e932017-02-07 12:14:55 -0600149=item getObmcName(C<InventoryItems>, C<TargetName>)
150
151Returns an OBMC name corresponding to a Target name. Returns
152undef if the Target name is not found.
153
Ratan Guptad92101d2017-02-15 19:40:39 +0530154=item getDevicePath(C<InventoryItems>, C<TargetsObj>, C<TargetType>)
155#Returns the array of all the device path based on the C<TargetType>.
156
Deepak Kodihallic1b12a42017-02-22 04:00:54 -0600157=item adjustI2CAddress(C<I2CAddress>)
158
159Returns C<I2CAddress> converted from MRW format (8-bit) to the standard 7-bit
160format.
161
Deepak Kodihalli9283add2017-02-22 04:14:01 -0600162=item getEnclosingFru(C<TargetsObj>, C<Target>)
163
164Finds the nearest FRU enclosing the input Target.
165
Matt Spinler8df7be82017-01-09 15:42:05 -0600166=back
167
168=cut