blob: b4d19168610f01c3535731eda0ca4279a1b5d8b0 [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 Wright71a14132022-01-28 09:46:46 -060052 /** @copydoc PowerSequencerMonitor::onFailure() */
53 void onFailure(bool timeout, const std::string& powerSupplyError) override;
54
Jim Wright7945dd22021-04-06 16:55:15 -050055 private:
56 /**
Jim Wrightd8fc0682022-01-11 15:36:00 -060057 * Set of GPIO lines to monitor in this UCD chip.
58 */
59 gpiod::line_bulk lines;
60
61 /**
Jim Wright56ae78e2021-12-01 14:46:15 -060062 * The match to Entity Manager interfaces added.
63 */
64 sdbusplus::bus::match_t match;
65
66 /**
Jim Wrightd8a86172021-12-08 11:38:26 -060067 * List of pins
68 */
69 std::vector<Pin> pins;
70
71 /**
Jim Wright7945dd22021-04-06 16:55:15 -050072 * The read/write interface to this hardware
73 */
Jim Wright56ae78e2021-12-01 14:46:15 -060074 pmbus::PMBus pmbusInterface;
75
76 /**
Jim Wrightd8a86172021-12-08 11:38:26 -060077 * List of rail names
78 */
79 std::vector<std::string> rails;
80
81 /**
Jim Wright71a14132022-01-28 09:46:46 -060082 * Checks for PGOOD faults on the device.
83 * @param[in] additionalData AdditionalData property of the error log entry
84 * @return bool true if an error log was created
85 */
86 bool checkPGOODFaults(std::map<std::string, std::string>& additionalData);
87
88 /**
89 * Checks for VOUT faults on the device.
90 * @param[in] additionalData AdditionalData property of the error log entry
91 * @return bool true if an error log was created
92 */
93 bool checkVOUTFaults(std::map<std::string, std::string>& additionalData);
94
95 /**
Jim Wright56ae78e2021-12-01 14:46:15 -060096 * Finds the list of compatible system types using D-Bus methods.
97 * This list is used to find the correct JSON configuration file for the
98 * current system.
99 */
100 void findCompatibleSystemTypes();
Jim Wrightd8a86172021-12-08 11:38:26 -0600101
102 /**
103 * Finds the JSON configuration file.
104 * Looks for a configuration file based on the list of compatible system
105 * types.
106 * Throws an exception if an operating system error occurs while checking
107 * for the existance of a file.
108 * @param[in] compatibleSystemTypes List of compatible system types
109 */
110 void findConfigFile(const std::vector<std::string>& compatibleSystemTypes);
111
112 /**
113 * Parse the JSON configuration file.
114 * @param[in] pathName the path name
115 */
116 void parseConfigFile(const std::filesystem::path& pathName);
Jim Wrightd8fc0682022-01-11 15:36:00 -0600117
118 /**
Jim Wright71a14132022-01-28 09:46:46 -0600119 * Reads the mfr_status register
120 * @return uint32_t the register contents
121 */
122 uint32_t readMFRStatus();
123
124 /**
125 * Reads the status_word register
126 * @return uint16_t the register contents
127 */
128 uint16_t readStatusWord();
129
130 /**
Jim Wrightd8fc0682022-01-11 15:36:00 -0600131 * Set up GPIOs
132 * @param[in] offsets the list of pin offsets
133 */
134 void setUpGpio(const std::vector<unsigned int>& offsets);
Jim Wright7945dd22021-04-06 16:55:15 -0500135};
136
137} // namespace phosphor::power::sequencer