summaryrefslogtreecommitdiffstats
path: root/hwmon.pl
diff options
context:
space:
mode:
authorMatt Spinler <spinler@us.ibm.com>2017-01-09 15:42:05 -0600
committerMatt Spinler <spinler@us.ibm.com>2017-01-17 10:27:27 -0600
commit8df7be8f60050469b8989e9656b061bc6c3c37f1 (patch)
tree590a724873017f9f09bb32265cd1897566954788 /hwmon.pl
parent3706646aa8cc16897b3af96969eb133f9ba0d2f8 (diff)
downloadphosphor-mrw-tools-8df7be8f60050469b8989e9656b061bc6c3c37f1.tar.gz
phosphor-mrw-tools-8df7be8f60050469b8989e9656b061bc6c3c37f1.zip
Create hwmon.pl
This script will create configuration files for hwmon sensors for the phosphor-hwmon daemon. This is the first of several commits for this script. Change-Id: Ie8f59b0c94fe9c61c454ed7dde816d7c819728fc Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Diffstat (limited to 'hwmon.pl')
-rwxr-xr-xhwmon.pl97
1 files changed, 97 insertions, 0 deletions
diff --git a/hwmon.pl b/hwmon.pl
new file mode 100755
index 0000000..1baf104
--- /dev/null
+++ b/hwmon.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/env perl
+
+#Creates a configuration file for each hwmon sensor in the MRW
+#for use by phosphor-hwmon. These configuration files contain
+#labels and thresholds for the hwmon features for that sensor.
+
+use strict;
+use warnings;
+
+use mrw::Targets;
+use mrw::Util;
+use Getopt::Long;
+
+use constant {
+ I2C_TYPE => "i2c"
+};
+
+my $serverwizFile;
+my @hwmon;
+
+GetOptions("x=s" => \$serverwizFile) or printUsage();
+
+if (not defined $serverwizFile) {
+ printUsage();
+}
+
+my $g_targetObj = Targets->new;
+$g_targetObj->loadXML($serverwizFile);
+
+my $bmc = Util::getBMCTarget($g_targetObj);
+
+getI2CSensors($bmc, \@hwmon);
+
+exit 0;
+
+
+#Returns an array of hashes that represent hwmon enabled I2C sensors.
+sub getI2CSensors
+{
+ my ($bmc, $hwmon) = @_;
+ my $connections = $g_targetObj->findConnections($bmc, "I2C");
+
+ return if ($connections eq "");
+
+ for my $i2c (@{$connections->{CONN}}) {
+
+ my $chip = $i2c->{DEST_PARENT};
+ my @hwmonUnits = Util::getChildUnitsWithTargetType($g_targetObj,
+ "unit-hwmon-feature",
+ $chip);
+
+ #If chip didn't have hwmon units, it isn't hwmon enabled.
+ next unless (scalar @hwmonUnits > 0);
+
+ my %entry;
+ $entry{type} = I2C_TYPE;
+ $entry{name} = lc $g_targetObj->getInstanceName($chip);
+
+ push @$hwmon, { %entry };
+ }
+}
+
+
+#Reads the I2C attributes for the chip and adds them to the hash.
+#This includes the i2C address, and register base address and
+#offset for the I2C bus the chip is on.
+sub getI2CAttributes
+{
+ my ($i2c, $entry) = @_;
+
+ #The address comes from the destination unit, and needs
+ #to be the 7 bit value in hex without the 0x.
+ my $addr = $g_targetObj->getAttribute($i2c->{DEST}, "I2C_ADDRESS");
+ $addr = hex($addr) >> 1;
+ $entry->{addr} = sprintf("%x", $addr);
+
+ #The reg base address and offset may be optional depending on
+ #the BMC chip type. We'll check later if it's required but missing.
+ if (!$g_targetObj->isBadAttribute($i2c->{SOURCE}, "REG_BASE_ADDRESS")) {
+ my $addr = $g_targetObj->getAttribute($i2c->{SOURCE},
+ "REG_BASE_ADDRESS");
+ $entry->{regBaseAddress} = sprintf("%x", hex($addr));
+ }
+
+ if (!$g_targetObj->isBadAttribute($i2c->{SOURCE}, "REG_OFFSET")) {
+ my $offset = $g_targetObj->getAttribute($i2c->{SOURCE},
+ "REG_OFFSET");
+ $entry->{regOffset} = sprintf("%x", hex($offset));
+ }
+}
+
+
+sub printUsage
+{
+ print "$0 -x [XML filename]\n";
+ exit(1);
+}
OpenPOWER on IntegriCloud