blob: 97958ceb42aa587c3bf9ba3f5d5b9c886daf3297 [file] [log] [blame]
Jim Wright7945dd22021-04-06 16:55:15 -05001#pragma once
2
3#include "pmbus.hpp"
4#include "power_sequencer_monitor.hpp"
5
Jim Wrightd8fc0682022-01-11 15:36:00 -06006#include <gpiod.hpp>
Jim Wright7945dd22021-04-06 16:55:15 -05007#include <sdbusplus/bus.hpp>
Jim Wright56ae78e2021-12-01 14:46:15 -06008#include <sdbusplus/bus/match.hpp>
Jim Wright7945dd22021-04-06 16:55:15 -05009
Jim Wrightd8a86172021-12-08 11:38:26 -060010#include <filesystem>
11#include <vector>
12
Jim Wright7945dd22021-04-06 16:55:15 -050013namespace phosphor::power::sequencer
14{
15
Jim Wrightd8a86172021-12-08 11:38:26 -060016struct Pin
17{
18 std::string name;
Jim Wrightd8fc0682022-01-11 15:36:00 -060019 unsigned int line;
Jim Wrightd8a86172021-12-08 11:38:26 -060020};
21
Jim Wright7945dd22021-04-06 16:55:15 -050022/**
23 * @class UCD90320Monitor
24 * This class implements fault analysis for the UCD90320
25 * power sequencer device.
26 */
27class UCD90320Monitor : public PowerSequencerMonitor
28{
29 public:
30 UCD90320Monitor() = delete;
31 UCD90320Monitor(const UCD90320Monitor&) = delete;
32 UCD90320Monitor& operator=(const UCD90320Monitor&) = delete;
33 UCD90320Monitor(UCD90320Monitor&&) = delete;
34 UCD90320Monitor& operator=(UCD90320Monitor&&) = delete;
35 virtual ~UCD90320Monitor() = default;
36
37 /**
38 * Create a device object for UCD90320 monitoring.
39 * @param[in] bus D-Bus bus object
40 * @param[in] i2cBus The bus number of the power sequencer device
41 * @param[in] i2cAddress The I2C address of the power sequencer device
42 */
43 UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
Jim Wrightd8fc0682022-01-11 15:36:00 -060044 std::uint16_t i2cAddress);
Jim Wright7945dd22021-04-06 16:55:15 -050045
Jim Wright56ae78e2021-12-01 14:46:15 -060046 /**
47 * Callback function to handle interfacesAdded D-Bus signals
48 * @param msg Expanded sdbusplus message data
49 */
50 void interfacesAddedHandler(sdbusplus::message::message& msg);
51
Jim Wright7945dd22021-04-06 16:55:15 -050052 private:
53 /**
Jim Wrightd8fc0682022-01-11 15:36:00 -060054 * Set of GPIO lines to monitor in this UCD chip.
55 */
56 gpiod::line_bulk lines;
57
58 /**
Jim Wright56ae78e2021-12-01 14:46:15 -060059 * The match to Entity Manager interfaces added.
60 */
61 sdbusplus::bus::match_t match;
62
63 /**
Jim Wrightd8a86172021-12-08 11:38:26 -060064 * List of pins
65 */
66 std::vector<Pin> pins;
67
68 /**
Jim Wright7945dd22021-04-06 16:55:15 -050069 * The read/write interface to this hardware
70 */
Jim Wright56ae78e2021-12-01 14:46:15 -060071 pmbus::PMBus pmbusInterface;
72
73 /**
Jim Wrightd8a86172021-12-08 11:38:26 -060074 * List of rail names
75 */
76 std::vector<std::string> rails;
77
78 /**
Jim Wright56ae78e2021-12-01 14:46:15 -060079 * Finds the list of compatible system types using D-Bus methods.
80 * This list is used to find the correct JSON configuration file for the
81 * current system.
82 */
83 void findCompatibleSystemTypes();
Jim Wrightd8a86172021-12-08 11:38:26 -060084
85 /**
86 * Finds the JSON configuration file.
87 * Looks for a configuration file based on the list of compatible system
88 * types.
89 * Throws an exception if an operating system error occurs while checking
90 * for the existance of a file.
91 * @param[in] compatibleSystemTypes List of compatible system types
92 */
93 void findConfigFile(const std::vector<std::string>& compatibleSystemTypes);
94
95 /**
96 * Parse the JSON configuration file.
97 * @param[in] pathName the path name
98 */
99 void parseConfigFile(const std::filesystem::path& pathName);
Jim Wrightd8fc0682022-01-11 15:36:00 -0600100
101 /**
102 * Set up GPIOs
103 * @param[in] offsets the list of pin offsets
104 */
105 void setUpGpio(const std::vector<unsigned int>& offsets);
Jim Wright7945dd22021-04-06 16:55:15 -0500106};
107
108} // namespace phosphor::power::sequencer