xref: /openbmc/phosphor-mrw-tools/gen_ipmi_sensor.pl (revision b4edc27a3c25cf78c6eeb06f5e45c3b379da445d)
1*b4edc27aSAndrew Geissler#!/usr/bin/env perl
265ca8e19SAndrew Geissler
3c7366706SRatan Guptause strict;
4c7366706SRatan Guptause warnings;
5c7366706SRatan Guptause mrw::Targets;
6c7366706SRatan Guptause mrw::Inventory;
7c7366706SRatan Guptause mrw::Util;
8c7366706SRatan Guptause Getopt::Long; # For parsing command line arguments
9c7366706SRatan Guptause YAML::Tiny qw(LoadFile);
10c7366706SRatan Gupta
11c7366706SRatan Gupta# Globals
12c7366706SRatan Guptamy $serverwizFile  = "";
13c7366706SRatan Guptamy $debug           = 0;
1439747a03SRatan Guptamy $outputFile     = "";
15611b90fcSDhruvaraj Subhashchandranmy $metaDataFile   = "";
1651041fc8SSantosh Puranikmy $skipBrokenMrw = 0;
17c7366706SRatan Gupta
18c7366706SRatan Gupta# Command line argument parsing
19c7366706SRatan GuptaGetOptions(
20c7366706SRatan Gupta"i=s" => \$serverwizFile,    # string
21611b90fcSDhruvaraj Subhashchandran"m=s" => \$metaDataFile,     # string
2239747a03SRatan Gupta"o=s" => \$outputFile,       # string
2351041fc8SSantosh Puranik"skip-broken-mrw" => \$skipBrokenMrw,
24c7366706SRatan Gupta"d"   => \$debug,
25c7366706SRatan Gupta)
26c7366706SRatan Guptaor printUsage();
27c7366706SRatan Gupta
28611b90fcSDhruvaraj Subhashchandranif (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
29c7366706SRatan Gupta{
30c7366706SRatan Gupta    printUsage();
31c7366706SRatan Gupta}
32c7366706SRatan Gupta
33c7366706SRatan Guptamy $targetObj = Targets->new;
34c7366706SRatan Gupta$targetObj->loadXML($serverwizFile);
35c7366706SRatan Gupta
36c7366706SRatan Gupta#open the mrw xml and the metaData file for the sensor.
37c7366706SRatan Gupta#Fetch the sensorid,sensortype,class,object path from the mrw.
3839747a03SRatan Gupta#Get the metadata for that sensor from the metadata file.
3939747a03SRatan Gupta#Merge the data into the outputfile
40c7366706SRatan Gupta
4139747a03SRatan Guptaopen(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
42611b90fcSDhruvaraj Subhashchandranmy $sensorTypeConfig = LoadFile($metaDataFile);
43c7366706SRatan Gupta
44c7366706SRatan Guptamy @interestedTypes = keys %{$sensorTypeConfig};
45c7366706SRatan Guptamy %types;
4698be5aceSTom Josephmy %entityDict;
47c7366706SRatan Gupta
48c7366706SRatan Gupta@types{@interestedTypes} = ();
49c7366706SRatan Gupta
50c7366706SRatan Guptamy @inventory = Inventory::getInventory($targetObj);
51c7366706SRatan Gupta#Process all the targets in the XML
52c7366706SRatan Guptaforeach my $target (sort keys %{$targetObj->getAllTargets()})
53c7366706SRatan Gupta{
54c7366706SRatan Gupta    my $sensorID = '';
55c7366706SRatan Gupta    my $sensorType = '';
56c7366706SRatan Gupta    my $sensorReadingType = '';
57c7366706SRatan Gupta    my $path = '';
58c7366706SRatan Gupta    my $obmcPath = '';
5900cef2c2SDeepak Kodihalli    my $sensorName = '';
6098be5aceSTom Joseph    my $entityID = '';
6198be5aceSTom Joseph    my $entityInstance = '';
62c7366706SRatan Gupta
63c7366706SRatan Gupta    if ($targetObj->getTargetType($target) eq "unit-ipmi-sensor") {
64c7366706SRatan Gupta
6500cef2c2SDeepak Kodihalli        $sensorName = $targetObj->getInstanceName($target);
6600cef2c2SDeepak Kodihalli        #not interested in this sensortype
6700cef2c2SDeepak Kodihalli        next if (not exists $types{$sensorName});
6800cef2c2SDeepak Kodihalli
6998be5aceSTom Joseph        $entityID = $targetObj->getAttribute($target, "IPMI_ENTITY_ID");
7098be5aceSTom Joseph        if (exists ($entityDict{$entityID}))
7198be5aceSTom Joseph        {
7298be5aceSTom Joseph            $entityDict{$entityID}++;
7398be5aceSTom Joseph        }
7498be5aceSTom Joseph        else
7598be5aceSTom Joseph        {
7698be5aceSTom Joseph            $entityDict{$entityID} = '1';
7798be5aceSTom Joseph        }
7898be5aceSTom Joseph        $entityInstance = $entityDict{$entityID};
7998be5aceSTom Joseph
80c7366706SRatan Gupta        $sensorID = $targetObj->getAttribute($target, "IPMI_SENSOR_ID");
81c7366706SRatan Gupta
82611b90fcSDhruvaraj Subhashchandran        $sensorType = hex($targetObj->getAttribute($target,
83611b90fcSDhruvaraj Subhashchandran                             "IPMI_SENSOR_TYPE"));
84c7366706SRatan Gupta
85c7366706SRatan Gupta        $sensorReadingType = $targetObj->getAttribute($target,
86c7366706SRatan Gupta                             "IPMI_SENSOR_READING_TYPE");
87c7366706SRatan Gupta
88c7366706SRatan Gupta        $path = $targetObj->getAttribute($target, "INSTANCE_PATH");
89c7366706SRatan Gupta
90c7366706SRatan Gupta        #if there is ipmi sensor without sensorid or sensorReadingType or
91c7366706SRatan Gupta        #Instance path then die
92c7366706SRatan Gupta
93c7366706SRatan Gupta        if ($sensorID eq '' or $sensorReadingType eq '' or $path eq '') {
9451041fc8SSantosh Puranik            next if $skipBrokenMrw;
9539747a03SRatan Gupta            close $fh;
96c7366706SRatan Gupta            die("sensor without info for target=$target");
97c7366706SRatan Gupta        }
98c7366706SRatan Gupta
9900cef2c2SDeepak Kodihalli        if (exists $sensorTypeConfig->{$sensorName}{"path"}) {
10000cef2c2SDeepak Kodihalli            $obmcPath = $sensorTypeConfig->{$sensorName}->{"path"};
1010c1aa51dSDhruvaraj Subhashchandran        }
1020c1aa51dSDhruvaraj Subhashchandran        else {
10300cef2c2SDeepak Kodihalli            #removing the string "instance:" from path
10400cef2c2SDeepak Kodihalli            $path =~ s/^instance:/\//;
10500cef2c2SDeepak Kodihalli            $obmcPath = Util::getObmcName(\@inventory,$path);
1066a6bd294SDhruvaraj Subhashchandran        }
10700cef2c2SDeepak Kodihalli
10800cef2c2SDeepak Kodihalli        # TODO via openbmc/openbmc#2144 - this fixup shouldn't be needed.
10900cef2c2SDeepak Kodihalli        $obmcPath = checkOccPathFixup($obmcPath);
110c7366706SRatan Gupta
111c7366706SRatan Gupta        if (not defined $obmcPath) {
11239747a03SRatan Gupta            close $fh;
113c7366706SRatan Gupta            die("Unable to get the obmc path for path=$path");
114c7366706SRatan Gupta        }
115c7366706SRatan Gupta
11639747a03SRatan Gupta        print $fh $sensorID.":\n";
11739747a03SRatan Gupta
118611b90fcSDhruvaraj Subhashchandran        my $serviceInterface =
11900cef2c2SDeepak Kodihalli            $sensorTypeConfig->{$sensorName}->{"serviceInterface"};
12000cef2c2SDeepak Kodihalli        my $readingType = $sensorTypeConfig->{$sensorName}->{"readingType"};
121694e8dc7SMarri Devender Rao        my $sensorNamePattern =
122694e8dc7SMarri Devender Rao                $sensorTypeConfig->{$sensorName}->{"sensorNamePattern"};
123af27cefeSJayanth Othayoth        my $mutability =
124af27cefeSJayanth Othayoth                $sensorTypeConfig->{$sensorName}->{"mutability"};
125694e8dc7SMarri Devender Rao
126694e8dc7SMarri Devender Rao        # store the values in hash
127694e8dc7SMarri Devender Rao        my %data;
128694e8dc7SMarri Devender Rao        $data{'SENSOR_NAME'} = $sensorName;
129694e8dc7SMarri Devender Rao        $data{'SENSOR_TYPE'} = $sensorType;
130694e8dc7SMarri Devender Rao        $data{'SERVICE_INTF'} = $serviceInterface;
131694e8dc7SMarri Devender Rao        $data{'READING_TYPE'} = $readingType;
132694e8dc7SMarri Devender Rao        $data{'SENSOR_NAME_PATTERN'} = $sensorNamePattern;
133af27cefeSJayanth Othayoth        $data{'MUTABILITY'} = $mutability;
134694e8dc7SMarri Devender Rao        $data{'ENTITY_ID'} = $entityID;
135694e8dc7SMarri Devender Rao        $data{'ENTITY_INSTANCE'} = $entityInstance;
136694e8dc7SMarri Devender Rao        $data{'FH'} = $fh;
137611b90fcSDhruvaraj Subhashchandran
13898be5aceSTom Joseph        my $debug = "$sensorID : $sensorName : $sensorType : ";
139694e8dc7SMarri Devender Rao        $debug .= "$serviceInterface: $readingType : $sensorNamePattern : ";
140af27cefeSJayanth Othayoth        $debug .= "$serviceInterface: $readingType : $mutability : ";
141694e8dc7SMarri Devender Rao        $debug .= "$entityID : $entityInstance : ";
142694e8dc7SMarri Devender Rao        # temperature sensor
143694e8dc7SMarri Devender Rao        if($sensorType == 0x01) {
144694e8dc7SMarri Devender Rao            my $dbusPath =
145694e8dc7SMarri Devender Rao                temperatureSensorPathFixup($sensorName, $target, $obmcPath);
146694e8dc7SMarri Devender Rao            if (not defined $dbusPath) {
147694e8dc7SMarri Devender Rao                warn("Unsupported sensor $sensorName, Ignoring\n");
148694e8dc7SMarri Devender Rao                next;
149694e8dc7SMarri Devender Rao            }
150694e8dc7SMarri Devender Rao            my $multiplierM = $sensorTypeConfig->{$sensorName}->{"multiplierM"};
151694e8dc7SMarri Devender Rao            my $offsetB = $sensorTypeConfig->{$sensorName}->{"offsetB"};
152694e8dc7SMarri Devender Rao            my $bExp = $sensorTypeConfig->{$sensorName}->{"bExp"};
153694e8dc7SMarri Devender Rao            my $rExp = $sensorTypeConfig->{$sensorName}->{"rExp"};
154694e8dc7SMarri Devender Rao            my $unit = $sensorTypeConfig->{$sensorName}->{"unit"};
155694e8dc7SMarri Devender Rao            my $scale = $sensorTypeConfig->{$sensorName}->{"scale"};
15649b3e649SMarri Devender Rao            # TODO: openbmc/openbmc#3026
15749b3e649SMarri Devender Rao            # Fix IPMI_SENSOR_READING_TYPE for vrm_vdd_temp_sensor
15849b3e649SMarri Devender Rao            if ($sensorName eq "vrm_vdd_temp_sensor") {
15949b3e649SMarri Devender Rao                $sensorReadingType = 1;
16049b3e649SMarri Devender Rao            }
161694e8dc7SMarri Devender Rao            $data{'MULTIPLIER_M'} = $multiplierM;
162694e8dc7SMarri Devender Rao            $data{'OFFSET_B'} = $offsetB;
163694e8dc7SMarri Devender Rao            $data{'B_EXP'} = $bExp;
164694e8dc7SMarri Devender Rao            $data{'R_EXP'} = $rExp;
165694e8dc7SMarri Devender Rao            $data{'UNIT'} = $unit;
166694e8dc7SMarri Devender Rao            $data{'SCALE'} = $scale;
167694e8dc7SMarri Devender Rao            $data{'PATH'} = $dbusPath;
168694e8dc7SMarri Devender Rao            $debug .= "$multiplierM : $offsetB : $bExp : $rExp : $unit : ";
169694e8dc7SMarri Devender Rao            $debug .= "$scale : $dbusPath : $obmcPath : ";
170694e8dc7SMarri Devender Rao        }
171694e8dc7SMarri Devender Rao        else {
172694e8dc7SMarri Devender Rao            $debug .= "$obmcPath : ";
173694e8dc7SMarri Devender Rao            $data{'PATH'} = $obmcPath;
174694e8dc7SMarri Devender Rao        }
175694e8dc7SMarri Devender Rao        $data{'SENSOR_READING_TYPE'} = $sensorReadingType;
176694e8dc7SMarri Devender Rao        writeToFile(%data);
177694e8dc7SMarri Devender Rao        $debug .= "$sensorReadingType\n";
17898be5aceSTom Joseph        printDebug("$debug");
179c7366706SRatan Gupta
180c7366706SRatan Gupta    }
181c7366706SRatan Gupta}
18239747a03SRatan Guptaclose $fh;
18339747a03SRatan Gupta
184694e8dc7SMarri Devender Rao# Construct DBus object path for temperature sensors
185694e8dc7SMarri Devender Raosub temperatureSensorPathFixup
186694e8dc7SMarri Devender Rao{
187694e8dc7SMarri Devender Rao    my ($sensorName, $target, $path) = @_;
188694e8dc7SMarri Devender Rao    $path = "/xyz/openbmc_project/sensors/temperature/";
189694e8dc7SMarri Devender Rao    if($sensorName eq "cpucore_temp_sensor") {
190694e8dc7SMarri Devender Rao        my $core = $targetObj->getTargetParent($target);
191694e8dc7SMarri Devender Rao        my $coreNo = $targetObj->getAttribute($core, "IPMI_INSTANCE");
192694e8dc7SMarri Devender Rao        my $proc = Util::getEnclosingFru($targetObj, $core);
193694e8dc7SMarri Devender Rao        my $procNo = $targetObj->getAttribute($proc, "POSITION");
194694e8dc7SMarri Devender Rao        my $size = Util::getSizeOfChildUnitsWithType($targetObj, "CORE", $proc);
195694e8dc7SMarri Devender Rao        $coreNo = $coreNo - ($procNo * $size);
196694e8dc7SMarri Devender Rao        $path .= "p" . $procNo . "_core" . $coreNo . "_temp";
197694e8dc7SMarri Devender Rao    }
198694e8dc7SMarri Devender Rao    elsif ($sensorName eq "dimm_temp_sensor") {
199694e8dc7SMarri Devender Rao        my $dimm = $targetObj->getTargetParent($target);
200694e8dc7SMarri Devender Rao        my $dimmconn = $targetObj->getTargetParent($dimm);
201694e8dc7SMarri Devender Rao        my $pos = $targetObj->getAttribute($dimmconn, "POSITION");
202694e8dc7SMarri Devender Rao        $path .= "dimm" . $pos . "_temp";
203694e8dc7SMarri Devender Rao    }
204694e8dc7SMarri Devender Rao    elsif ($sensorName eq "vrm_vdd_temp_sensor") {
205694e8dc7SMarri Devender Rao        my $proc = Util::getEnclosingFru($targetObj, $target);
206694e8dc7SMarri Devender Rao        my $procNo = $targetObj->getAttribute($proc, "POSITION");
207694e8dc7SMarri Devender Rao        $path .= "p" . $procNo . "_vdd_temp";
208694e8dc7SMarri Devender Rao    }
209694e8dc7SMarri Devender Rao    elsif ($sensorName eq "memory_temp_sensor") {
210694e8dc7SMarri Devender Rao        my $gvcard = $targetObj->getTargetParent($target);
211694e8dc7SMarri Devender Rao        my $pos = $targetObj->getAttribute($gvcard, "IPMI_INSTANCE");
212694e8dc7SMarri Devender Rao        $path .= "gpu" . $pos . "_mem_temp";
213694e8dc7SMarri Devender Rao    }
214694e8dc7SMarri Devender Rao    elsif ($sensorName eq "gpu_temp_sensor") {
215694e8dc7SMarri Devender Rao        my $gvcard = $targetObj->getTargetParent($target);
216694e8dc7SMarri Devender Rao        my $pos = $targetObj->getAttribute($gvcard, "IPMI_INSTANCE");
217694e8dc7SMarri Devender Rao        $path .= "gpu" . $pos . "_core_temp";
218694e8dc7SMarri Devender Rao    }
219694e8dc7SMarri Devender Rao    else {
220694e8dc7SMarri Devender Rao        return undef;
221694e8dc7SMarri Devender Rao    }
222694e8dc7SMarri Devender Rao    return $path;
223694e8dc7SMarri Devender Rao}
224694e8dc7SMarri Devender Rao
22517f0679bSMarri Devender Rao#Write the interfaces data into the output file
22617f0679bSMarri Devender Raosub writeInterfaces
22739747a03SRatan Gupta{
22817f0679bSMarri Devender Rao    my ($interfaces, $fh) = @_;
22939747a03SRatan Gupta    print $fh "  interfaces:"."\n";
23039747a03SRatan Gupta    #Walk over all the interfces as it needs to be written
23139747a03SRatan Gupta    while (my ($interface,$properties) = each %{$interfaces}) {
23239747a03SRatan Gupta        print $fh "    ".$interface.":\n";
23339747a03SRatan Gupta        #walk over all the properties as it needs to be written
23439747a03SRatan Gupta        while (my ($dbusProperty,$dbusPropertyValue) = each %{$properties}) {
23539747a03SRatan Gupta            #will write property named "Property" first then
23639747a03SRatan Gupta            #other properties.
23739747a03SRatan Gupta            print $fh "      ".$dbusProperty.":\n";
238bb3c54afSDhruvaraj Subhashchandran            while (my ($condition,$offsets) = each %{$dbusPropertyValue}) {
239bb3c54afSDhruvaraj Subhashchandran                print $fh "          $condition:\n";
240bb3c54afSDhruvaraj Subhashchandran                while (my ($offset,$values) = each %{$offsets}) {
24139747a03SRatan Gupta                    print $fh "            $offset:\n";
24239747a03SRatan Gupta                    while (my ($key,$value) = each %{$values})  {
24339747a03SRatan Gupta                        print $fh "              $key: ". $value."\n";
24439747a03SRatan Gupta                    }
24539747a03SRatan Gupta                }
24639747a03SRatan Gupta            }
24739747a03SRatan Gupta        }
24839747a03SRatan Gupta    }
249a93e2097SDhruvaraj Subhashchandran}
250c7366706SRatan Gupta
25117f0679bSMarri Devender Rao#Get the metadata for the incoming sensortype from the loaded config file.
25217f0679bSMarri Devender Rao#Write the sensor data into the output file
25317f0679bSMarri Devender Raosub writeToFile
25417f0679bSMarri Devender Rao{
255694e8dc7SMarri Devender Rao    my (%data) = @_;
256694e8dc7SMarri Devender Rao    my $sensorType = $data{'SENSOR_TYPE'};
257694e8dc7SMarri Devender Rao    my $fs = $data{'FH'};
258694e8dc7SMarri Devender Rao    print $fh "  entityID: ".$data{'ENTITY_ID'}."\n";
259694e8dc7SMarri Devender Rao    print $fh "  entityInstance: ".$data{'ENTITY_INSTANCE'}."\n";
260694e8dc7SMarri Devender Rao    print $fh "  sensorType: ".$data{'SENSOR_TYPE'}."\n";
261694e8dc7SMarri Devender Rao    print $fh "  path: ".$data{'PATH'}."\n";
262694e8dc7SMarri Devender Rao    print $fh "  sensorReadingType: ".$data{'SENSOR_READING_TYPE'}."\n";
263694e8dc7SMarri Devender Rao    print $fh "  serviceInterface: ".$data{'SERVICE_INTF'}."\n";
264694e8dc7SMarri Devender Rao    print $fh "  readingType: ".$data{'READING_TYPE'}."\n";
265694e8dc7SMarri Devender Rao    print $fh "  sensorNamePattern: ".$data{'SENSOR_NAME_PATTERN'}."\n";
266af27cefeSJayanth Othayoth    print $fh "  mutability: ".$data{'MUTABILITY'}."\n";
26717f0679bSMarri Devender Rao
268694e8dc7SMarri Devender Rao    # temperature sensor
269694e8dc7SMarri Devender Rao    if ($sensorType == 0x01) {
270694e8dc7SMarri Devender Rao        print $fh "  multiplierM: ".$data{'MULTIPLIER_M'}."\n";
271694e8dc7SMarri Devender Rao        print $fh "  offsetB: ".$data{'OFFSET_B'}."\n";
272694e8dc7SMarri Devender Rao        print $fh "  bExp: ".$data{'B_EXP'}."\n";
273694e8dc7SMarri Devender Rao        print $fh "  rExp: ".$data{'R_EXP'}."\n";
274694e8dc7SMarri Devender Rao        print $fh "  unit: ".$data{'UNIT'}."\n";
275694e8dc7SMarri Devender Rao        print $fh "  scale: ".$data{'SCALE'}."\n";
276694e8dc7SMarri Devender Rao    }
27717f0679bSMarri Devender Rao
278694e8dc7SMarri Devender Rao    my $sensorName = $data{'SENSOR_NAME'};
27917f0679bSMarri Devender Rao    my $interfaces = $sensorTypeConfig->{$sensorName}->{"interfaces"};
28017f0679bSMarri Devender Rao    writeInterfaces($interfaces, $fh);
28117f0679bSMarri Devender Rao}
28217f0679bSMarri Devender Rao
28300cef2c2SDeepak Kodihalli# Convert MRW OCC inventory path to application d-bus path
28400cef2c2SDeepak Kodihallisub checkOccPathFixup
28500cef2c2SDeepak Kodihalli{
28600cef2c2SDeepak Kodihalli    my ($path) = @_;
28700cef2c2SDeepak Kodihalli    if ("/system/chassis/motherboard/cpu0/occ" eq $path) {
28800cef2c2SDeepak Kodihalli        return "/org/open_power/control/occ0";
28900cef2c2SDeepak Kodihalli    }
2903d7698c2SBen Pai    if ("/system/chassis/motherboard/cpu/occ" eq $path) {
2913d7698c2SBen Pai        return "/org/open_power/control/occ0";
2923d7698c2SBen Pai    }
29300cef2c2SDeepak Kodihalli    if ("/system/chassis/motherboard/cpu1/occ" eq $path) {
29400cef2c2SDeepak Kodihalli        return "/org/open_power/control/occ1";
29500cef2c2SDeepak Kodihalli    }
29600cef2c2SDeepak Kodihalli    return $path;
29700cef2c2SDeepak Kodihalli}
29800cef2c2SDeepak Kodihalli
299c7366706SRatan Gupta# Usage
300c7366706SRatan Guptasub printUsage
301c7366706SRatan Gupta{
302c7366706SRatan Gupta    print "
30339747a03SRatan Gupta    $0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
304c7366706SRatan GuptaOptions:
30551041fc8SSantosh Puranik    --skip-broken-mrw = Skip broken MRW targets
306c7366706SRatan Gupta    -d = debug mode
307c7366706SRatan Gupta        \n";
308c7366706SRatan Gupta    exit(1);
309c7366706SRatan Gupta}
310c7366706SRatan Gupta
311c7366706SRatan Gupta# Helper function to put debug statements.
312c7366706SRatan Guptasub printDebug
313c7366706SRatan Gupta{
314c7366706SRatan Gupta    my $str = shift;
315c7366706SRatan Gupta    print "DEBUG: ", $str, "\n" if $debug;
316c7366706SRatan Gupta}
317