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