pseq: Add base and UCD90320 device monitor classes
Add a power sequencer device monitoring base class and a UCD90320
subclass. Update power controller class to construct and pass device
information to device class. Update build file to support.
Signed-off-by: Jim Wright <jlwright@us.ibm.com>
Change-Id: Idf3ef53011b23f15841d93795f9f0995892b10b9
diff --git a/phosphor-power-sequencer/src/meson.build b/phosphor-power-sequencer/src/meson.build
index 8f74c7e..4ea4b9c 100644
--- a/phosphor-power-sequencer/src/meson.build
+++ b/phosphor-power-sequencer/src/meson.build
@@ -8,6 +8,7 @@
'power_control_main.cpp',
'power_control.cpp',
'power_interface.cpp',
+ 'ucd90320_monitor.cpp',
dependencies: [
libgpiodcxx,
phosphor_logging,
diff --git a/phosphor-power-sequencer/src/power_control.cpp b/phosphor-power-sequencer/src/power_control.cpp
index 6e9fa58..aa47598 100644
--- a/phosphor-power-sequencer/src/power_control.cpp
+++ b/phosphor-power-sequencer/src/power_control.cpp
@@ -17,6 +17,7 @@
#include "power_control.hpp"
#include "types.hpp"
+#include "ucd90320_monitor.hpp"
#include <fmt/format.h>
#include <sys/types.h>
@@ -92,12 +93,13 @@
if (i2cBus && i2cAddress && name && !name->empty())
{
- log<level::INFO>(
+ log<level::DEBUG>(
fmt::format(
"Found power sequencer device properties, name: {}, bus: {} addr: {:#02x} ",
*name, *i2cBus, *i2cAddress)
.c_str());
// Create device object
+ device = std::make_unique<UCD90320Monitor>(bus, *i2cBus, *i2cAddress);
}
}
diff --git a/phosphor-power-sequencer/src/power_control.hpp b/phosphor-power-sequencer/src/power_control.hpp
index 1699dcc..62dfce2 100644
--- a/phosphor-power-sequencer/src/power_control.hpp
+++ b/phosphor-power-sequencer/src/power_control.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "power_interface.hpp"
+#include "power_sequencer_monitor.hpp"
#include "utility.hpp"
#include <gpiod.hpp>
@@ -69,6 +70,11 @@
sdbusplus::bus::bus& bus;
/**
+ * The power sequencer device to monitor.
+ */
+ std::unique_ptr<PowerSequencerMonitor> device;
+
+ /**
* Indicates if a state transistion is taking place
*/
bool inStateTransition{false};
diff --git a/phosphor-power-sequencer/src/power_sequencer_monitor.hpp b/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
new file mode 100644
index 0000000..e714d08
--- /dev/null
+++ b/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+namespace phosphor::power::sequencer
+{
+
+/**
+ * @class PowerSequencerMonitor
+ * Define a base class for monitoring a power sequencer device.
+ */
+class PowerSequencerMonitor
+{
+ public:
+ PowerSequencerMonitor() = default;
+ PowerSequencerMonitor(const PowerSequencerMonitor&) = delete;
+ PowerSequencerMonitor& operator=(const PowerSequencerMonitor&) = delete;
+ PowerSequencerMonitor(PowerSequencerMonitor&&) = delete;
+ PowerSequencerMonitor& operator=(PowerSequencerMonitor&&) = delete;
+ virtual ~PowerSequencerMonitor() = default;
+};
+
+} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.cpp b/phosphor-power-sequencer/src/ucd90320_monitor.cpp
index 698b0d0..36301b4 100644
--- a/phosphor-power-sequencer/src/ucd90320_monitor.cpp
+++ b/phosphor-power-sequencer/src/ucd90320_monitor.cpp
@@ -14,7 +14,22 @@
* limitations under the License.
*/
-int main()
+#include "ucd90320_monitor.hpp"
+
+#include <fmt/format.h>
+
+#include <string>
+
+namespace phosphor::power::sequencer
{
- return 0;
+
+UCD90320Monitor::UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
+ std::uint16_t i2cAddress) :
+ PowerSequencerMonitor(),
+ bus{bus}, interface {
+ fmt::format("/sys/bus/i2c/devices/{}-{:04x}", i2cBus, i2cAddress).c_str(),
+ "ucd9000", 0
}
+{}
+
+} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.hpp b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
new file mode 100644
index 0000000..9512190
--- /dev/null
+++ b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
@@ -0,0 +1,47 @@
+#pragma once
+
+#include "pmbus.hpp"
+#include "power_sequencer_monitor.hpp"
+
+#include <sdbusplus/bus.hpp>
+
+namespace phosphor::power::sequencer
+{
+
+/**
+ * @class UCD90320Monitor
+ * This class implements fault analysis for the UCD90320
+ * power sequencer device.
+ */
+class UCD90320Monitor : public PowerSequencerMonitor
+{
+ public:
+ UCD90320Monitor() = delete;
+ UCD90320Monitor(const UCD90320Monitor&) = delete;
+ UCD90320Monitor& operator=(const UCD90320Monitor&) = delete;
+ UCD90320Monitor(UCD90320Monitor&&) = delete;
+ UCD90320Monitor& operator=(UCD90320Monitor&&) = delete;
+ virtual ~UCD90320Monitor() = default;
+
+ /**
+ * Create a device object for UCD90320 monitoring.
+ * @param[in] bus D-Bus bus object
+ * @param[in] i2cBus The bus number of the power sequencer device
+ * @param[in] i2cAddress The I2C address of the power sequencer device
+ */
+ UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
+ const std::uint16_t i2cAddress);
+
+ private:
+ /**
+ * The D-Bus bus object
+ */
+ sdbusplus::bus::bus& bus;
+
+ /**
+ * The read/write interface to this hardware
+ */
+ pmbus::PMBus interface;
+};
+
+} // namespace phosphor::power::sequencer