xref: /openbmc/phosphor-power/phosphor-power-supply/new_power_supply.hpp (revision 9ed0f38e1d59564106c6020b854416ece6753776)
1*9ed0f38eSFaisal Awada #pragma once
2*9ed0f38eSFaisal Awada 
3*9ed0f38eSFaisal Awada #include "pmbus.hpp"
4*9ed0f38eSFaisal Awada #include "types.hpp"
5*9ed0f38eSFaisal Awada #include "util.hpp"
6*9ed0f38eSFaisal Awada #include "utility.hpp"
7*9ed0f38eSFaisal Awada 
8*9ed0f38eSFaisal Awada #include <gpiod.hpp>
9*9ed0f38eSFaisal Awada #include <sdbusplus/bus/match.hpp>
10*9ed0f38eSFaisal Awada #include <xyz/openbmc_project/Association/Definitions/server.hpp>
11*9ed0f38eSFaisal Awada #include <xyz/openbmc_project/Sensor/Value/server.hpp>
12*9ed0f38eSFaisal Awada #include <xyz/openbmc_project/State/Decorator/Availability/server.hpp>
13*9ed0f38eSFaisal Awada #include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp>
14*9ed0f38eSFaisal Awada 
15*9ed0f38eSFaisal Awada #include <filesystem>
16*9ed0f38eSFaisal Awada #include <stdexcept>
17*9ed0f38eSFaisal Awada 
18*9ed0f38eSFaisal Awada namespace phosphor::power::psu
19*9ed0f38eSFaisal Awada {
20*9ed0f38eSFaisal Awada 
21*9ed0f38eSFaisal Awada #if IBM_VPD
22*9ed0f38eSFaisal Awada // PMBus device driver "file name" to read for CCIN value.
23*9ed0f38eSFaisal Awada constexpr auto CCIN = "ccin";
24*9ed0f38eSFaisal Awada constexpr auto PART_NUMBER = "mfr_revision";
25*9ed0f38eSFaisal Awada constexpr auto FRU_NUMBER = "mfr_model";
26*9ed0f38eSFaisal Awada constexpr auto SERIAL_HEADER = "mfr_location";
27*9ed0f38eSFaisal Awada constexpr auto SERIAL_NUMBER = "mfr_serial";
28*9ed0f38eSFaisal Awada constexpr auto FW_VERSION = "fw_version";
29*9ed0f38eSFaisal Awada 
30*9ed0f38eSFaisal Awada // The D-Bus property name to update with the CCIN value.
31*9ed0f38eSFaisal Awada constexpr auto MODEL_PROP = "Model";
32*9ed0f38eSFaisal Awada constexpr auto PN_PROP = "PartNumber";
33*9ed0f38eSFaisal Awada constexpr auto SPARE_PN_PROP = "SparePartNumber";
34*9ed0f38eSFaisal Awada constexpr auto SN_PROP = "SerialNumber";
35*9ed0f38eSFaisal Awada constexpr auto VERSION_PROP = "Version";
36*9ed0f38eSFaisal Awada 
37*9ed0f38eSFaisal Awada // ipzVPD Keyword sizes
38*9ed0f38eSFaisal Awada static constexpr auto FL_KW_SIZE = 20;
39*9ed0f38eSFaisal Awada static constexpr auto FN_KW_SIZE = 7;
40*9ed0f38eSFaisal Awada static constexpr auto PN_KW_SIZE = 7;
41*9ed0f38eSFaisal Awada // For IBM power supplies, the SN is 6-byte header + 6-byte serial.
42*9ed0f38eSFaisal Awada static constexpr auto SN_KW_SIZE = 12;
43*9ed0f38eSFaisal Awada static constexpr auto CC_KW_SIZE = 4;
44*9ed0f38eSFaisal Awada #endif
45*9ed0f38eSFaisal Awada 
46*9ed0f38eSFaisal Awada constexpr auto LOG_LIMIT = 3;
47*9ed0f38eSFaisal Awada constexpr auto DEGLITCH_LIMIT = 3;
48*9ed0f38eSFaisal Awada constexpr auto PGOOD_DEGLITCH_LIMIT = 5;
49*9ed0f38eSFaisal Awada // Number of polls to remember that an AC fault occured. Should remain greater
50*9ed0f38eSFaisal Awada // than PGOOD_DEGLITCH_LIMIT.
51*9ed0f38eSFaisal Awada constexpr auto AC_FAULT_LIMIT = 6;
52*9ed0f38eSFaisal Awada 
53*9ed0f38eSFaisal Awada constexpr auto IBMCFFPS_DD_NAME = "ibm-cffps";
54*9ed0f38eSFaisal Awada constexpr auto ACBEL_FSG032_DD_NAME = "acbel-fsg032";
55*9ed0f38eSFaisal Awada 
56*9ed0f38eSFaisal Awada using AvailabilityInterface =
57*9ed0f38eSFaisal Awada     sdbusplus::xyz::openbmc_project::State::Decorator::server::Availability;
58*9ed0f38eSFaisal Awada using OperationalStatusInterface = sdbusplus::xyz::openbmc_project::State::
59*9ed0f38eSFaisal Awada     Decorator::server::OperationalStatus;
60*9ed0f38eSFaisal Awada using AssocDefInterface =
61*9ed0f38eSFaisal Awada     sdbusplus::xyz::openbmc_project::Association::server::Definitions;
62*9ed0f38eSFaisal Awada using SensorInterface = sdbusplus::xyz::openbmc_project::Sensor::server::Value;
63*9ed0f38eSFaisal Awada using SensorObject = sdbusplus::server::object_t<SensorInterface>;
64*9ed0f38eSFaisal Awada using PowerSensorObject =
65*9ed0f38eSFaisal Awada     sdbusplus::server::object_t<SensorInterface, OperationalStatusInterface,
66*9ed0f38eSFaisal Awada                                 AvailabilityInterface, AssocDefInterface>;
67*9ed0f38eSFaisal Awada 
68*9ed0f38eSFaisal Awada using AssociationTuple = std::tuple<std::string, std::string, std::string>;
69*9ed0f38eSFaisal Awada 
70*9ed0f38eSFaisal Awada /**
71*9ed0f38eSFaisal Awada  * @class PowerSupply
72*9ed0f38eSFaisal Awada  * Represents a PMBus power supply device.
73*9ed0f38eSFaisal Awada  */
74*9ed0f38eSFaisal Awada class PowerSupply
75*9ed0f38eSFaisal Awada {
76*9ed0f38eSFaisal Awada   public:
77*9ed0f38eSFaisal Awada     PowerSupply() = delete;
78*9ed0f38eSFaisal Awada     PowerSupply(const PowerSupply&) = delete;
79*9ed0f38eSFaisal Awada     PowerSupply(PowerSupply&&) = delete;
80*9ed0f38eSFaisal Awada     PowerSupply& operator=(const PowerSupply&) = delete;
81*9ed0f38eSFaisal Awada     PowerSupply& operator=(PowerSupply&&) = delete;
82*9ed0f38eSFaisal Awada     ~PowerSupply() = default;
83*9ed0f38eSFaisal Awada 
84*9ed0f38eSFaisal Awada     /**
85*9ed0f38eSFaisal Awada      * @param[in] invpath - String for inventory path to use
86*9ed0f38eSFaisal Awada      * @param[in] i2cbus - The bus number this power supply is on
87*9ed0f38eSFaisal Awada      * @param[in] i2caddr - The 16-bit I2C address of the power supply
88*9ed0f38eSFaisal Awada      * @param[in] driver - i2c driver name for power supply
89*9ed0f38eSFaisal Awada      * @param[in] gpioLineName - The gpio-line-name to read for presence. See
90*9ed0f38eSFaisal Awada      * https://github.com/openbmc/docs/blob/master/designs/device-tree-gpio-naming.md
91*9ed0f38eSFaisal Awada      * @param[in] callback - Get the power on status of the psu manager class
92*9ed0f38eSFaisal Awada      */
93*9ed0f38eSFaisal Awada     PowerSupply(sdbusplus::bus_t& bus, const std::string& invpath,
94*9ed0f38eSFaisal Awada                 std::uint8_t i2cbus, const std::uint16_t i2caddr,
95*9ed0f38eSFaisal Awada                 const std::string& driver, const std::string& gpioLineName,
96*9ed0f38eSFaisal Awada                 std::function<bool()>&& callback);
97*9ed0f38eSFaisal Awada 
98*9ed0f38eSFaisal Awada     /**
99*9ed0f38eSFaisal Awada      * @param[in] invpath - String for inventory path to use
100*9ed0f38eSFaisal Awada      * @param[in] i2cbus - The bus number this power supply is on
101*9ed0f38eSFaisal Awada      * @param[in] i2caddr - The 16-bit I2C address of the power supply
102*9ed0f38eSFaisal Awada      * @param[in] driver - i2c driver name for power supply
103*9ed0f38eSFaisal Awada      * @param[in] gpioLineName - The gpio-line-name to read for presence. See
104*9ed0f38eSFaisal Awada      * https://github.com/openbmc/docs/blob/master/designs/device-tree-gpio-naming.md
105*9ed0f38eSFaisal Awada      * @param[in] callback - Get the power on status of the psu manager class
106*9ed0f38eSFaisal Awada      * @param[in] chassisShortName - Chassis name
107*9ed0f38eSFaisal Awada      */
108*9ed0f38eSFaisal Awada     PowerSupply(sdbusplus::bus_t& bus, const std::string& invpath,
109*9ed0f38eSFaisal Awada                 std::uint8_t i2cbus, const std::uint16_t i2caddr,
110*9ed0f38eSFaisal Awada                 const std::string& driver, const std::string& gpioLineName,
111*9ed0f38eSFaisal Awada                 std::function<bool()>&& callback,
112*9ed0f38eSFaisal Awada                 const std::string& chassisShortName);
113*9ed0f38eSFaisal Awada 
getPMBus()114*9ed0f38eSFaisal Awada     phosphor::pmbus::PMBusBase& getPMBus()
115*9ed0f38eSFaisal Awada     {
116*9ed0f38eSFaisal Awada         return *pmbusIntf;
117*9ed0f38eSFaisal Awada     }
118*9ed0f38eSFaisal Awada 
getPresenceGPIO()119*9ed0f38eSFaisal Awada     GPIOInterfaceBase* getPresenceGPIO()
120*9ed0f38eSFaisal Awada     {
121*9ed0f38eSFaisal Awada         return presenceGPIO.get();
122*9ed0f38eSFaisal Awada     }
123*9ed0f38eSFaisal Awada 
getPresenceGPIOName() const124*9ed0f38eSFaisal Awada     std::string getPresenceGPIOName() const
125*9ed0f38eSFaisal Awada     {
126*9ed0f38eSFaisal Awada         if (presenceGPIO != nullptr)
127*9ed0f38eSFaisal Awada         {
128*9ed0f38eSFaisal Awada             return presenceGPIO->getName();
129*9ed0f38eSFaisal Awada         }
130*9ed0f38eSFaisal Awada         else
131*9ed0f38eSFaisal Awada         {
132*9ed0f38eSFaisal Awada             return std::string();
133*9ed0f38eSFaisal Awada         }
134*9ed0f38eSFaisal Awada     }
135*9ed0f38eSFaisal Awada 
136*9ed0f38eSFaisal Awada     /**
137*9ed0f38eSFaisal Awada      * Power supply specific function to analyze for faults/errors.
138*9ed0f38eSFaisal Awada      *
139*9ed0f38eSFaisal Awada      * Various PMBus status bits will be checked for fault conditions.
140*9ed0f38eSFaisal Awada      * If a certain fault bits are on, the appropriate error will be
141*9ed0f38eSFaisal Awada      * committed.
142*9ed0f38eSFaisal Awada      */
143*9ed0f38eSFaisal Awada     void analyze();
144*9ed0f38eSFaisal Awada 
145*9ed0f38eSFaisal Awada     /**
146*9ed0f38eSFaisal Awada      * Write PMBus ON_OFF_CONFIG
147*9ed0f38eSFaisal Awada      *
148*9ed0f38eSFaisal Awada      * This function will be called to cause the PMBus device driver to send the
149*9ed0f38eSFaisal Awada      * ON_OFF_CONFIG command. Takes one byte of data.
150*9ed0f38eSFaisal Awada      *
151*9ed0f38eSFaisal Awada      * @param[in] data - The ON_OFF_CONFIG data byte mask.
152*9ed0f38eSFaisal Awada      */
153*9ed0f38eSFaisal Awada     void onOffConfig(uint8_t data);
154*9ed0f38eSFaisal Awada 
155*9ed0f38eSFaisal Awada     /**
156*9ed0f38eSFaisal Awada      * Clears all the member variables that indicate if a fault bit was seen as
157*9ed0f38eSFaisal Awada      * on in the STATUS_WORD or STATUS_MFR_SPECIFIC response.
158*9ed0f38eSFaisal Awada      */
clearFaultFlags()159*9ed0f38eSFaisal Awada     void clearFaultFlags()
160*9ed0f38eSFaisal Awada     {
161*9ed0f38eSFaisal Awada         inputFault = 0;
162*9ed0f38eSFaisal Awada         mfrFault = 0;
163*9ed0f38eSFaisal Awada         statusMFR = 0;
164*9ed0f38eSFaisal Awada         vinUVFault = 0;
165*9ed0f38eSFaisal Awada         cmlFault = 0;
166*9ed0f38eSFaisal Awada         voutOVFault = 0;
167*9ed0f38eSFaisal Awada         ioutOCFault = 0;
168*9ed0f38eSFaisal Awada         voutUVFault = 0;
169*9ed0f38eSFaisal Awada         fanFault = 0;
170*9ed0f38eSFaisal Awada         tempFault = 0;
171*9ed0f38eSFaisal Awada         pgoodFault = 0;
172*9ed0f38eSFaisal Awada         psKillFault = 0;
173*9ed0f38eSFaisal Awada         ps12VcsFault = 0;
174*9ed0f38eSFaisal Awada         psCS12VFault = 0;
175*9ed0f38eSFaisal Awada         faultLogged = false;
176*9ed0f38eSFaisal Awada     }
177*9ed0f38eSFaisal Awada 
178*9ed0f38eSFaisal Awada     /**
179*9ed0f38eSFaisal Awada      * @brief Function to specifically clear VIN_UV/OFF fault(s).
180*9ed0f38eSFaisal Awada      *
181*9ed0f38eSFaisal Awada      * The PMBus HWMON device driver has various alarm "files" to read out of
182*9ed0f38eSFaisal Awada      * sysfs. Reading those files will indicate if various alarms are active or
183*9ed0f38eSFaisal Awada      * not, and then specifically clear those faults that go with that alarm.
184*9ed0f38eSFaisal Awada      *
185*9ed0f38eSFaisal Awada      * The VIN_UV fault, indicated in STATUS_INPUT, goes with in1_lcrit_alarm.
186*9ed0f38eSFaisal Awada      * When a VIN_UV fault occurs, the "Unit Off For Insufficient Input Voltage"
187*9ed0f38eSFaisal Awada      * may also be active. Reading in1_lcrit_alarm should clear both fault bits,
188*9ed0f38eSFaisal Awada      * resulting in the corresponding fault bits in STATUS_WORD also clearing.
189*9ed0f38eSFaisal Awada      *
190*9ed0f38eSFaisal Awada      * See: https://www.kernel.org/doc/html/latest/hwmon/pmbus.html
191*9ed0f38eSFaisal Awada      */
192*9ed0f38eSFaisal Awada     void clearVinUVFault();
193*9ed0f38eSFaisal Awada 
194*9ed0f38eSFaisal Awada     /**
195*9ed0f38eSFaisal Awada      * Write PMBus CLEAR_FAULTS
196*9ed0f38eSFaisal Awada      *
197*9ed0f38eSFaisal Awada      * This function will be called in various situations in order to clear
198*9ed0f38eSFaisal Awada      * any fault status bits that may have been set, in order to start over
199*9ed0f38eSFaisal Awada      * with a clean state. Presence changes and power state changes will
200*9ed0f38eSFaisal Awada      * want to clear any faults logged.
201*9ed0f38eSFaisal Awada      */
202*9ed0f38eSFaisal Awada     void clearFaults();
203*9ed0f38eSFaisal Awada 
204*9ed0f38eSFaisal Awada     /**
205*9ed0f38eSFaisal Awada      * @brief Adds properties to the inventory.
206*9ed0f38eSFaisal Awada      *
207*9ed0f38eSFaisal Awada      * Reads the values from the device and writes them to the
208*9ed0f38eSFaisal Awada      * associated power supply D-Bus inventory object.
209*9ed0f38eSFaisal Awada      *
210*9ed0f38eSFaisal Awada      * This needs to be done on startup, and each time the presence
211*9ed0f38eSFaisal Awada      * state changes.
212*9ed0f38eSFaisal Awada      *
213*9ed0f38eSFaisal Awada      * Properties added:
214*9ed0f38eSFaisal Awada      * - Serial Number
215*9ed0f38eSFaisal Awada      * - Part Number
216*9ed0f38eSFaisal Awada      * - CCIN (Customer Card Identification Number) - added as the Model
217*9ed0f38eSFaisal Awada      * - Firmware version
218*9ed0f38eSFaisal Awada      */
219*9ed0f38eSFaisal Awada     void updateInventory();
220*9ed0f38eSFaisal Awada 
221*9ed0f38eSFaisal Awada     /**
222*9ed0f38eSFaisal Awada      * @brief Accessor function to indicate present status
223*9ed0f38eSFaisal Awada      */
isPresent() const224*9ed0f38eSFaisal Awada     bool isPresent() const
225*9ed0f38eSFaisal Awada     {
226*9ed0f38eSFaisal Awada         return present;
227*9ed0f38eSFaisal Awada     }
228*9ed0f38eSFaisal Awada 
229*9ed0f38eSFaisal Awada     /**
230*9ed0f38eSFaisal Awada      * @brief Returns the last read value from STATUS_WORD.
231*9ed0f38eSFaisal Awada      */
getStatusWord() const232*9ed0f38eSFaisal Awada     uint64_t getStatusWord() const
233*9ed0f38eSFaisal Awada     {
234*9ed0f38eSFaisal Awada         return statusWord;
235*9ed0f38eSFaisal Awada     }
236*9ed0f38eSFaisal Awada 
237*9ed0f38eSFaisal Awada     /**
238*9ed0f38eSFaisal Awada      * @brief Returns the last read value from STATUS_INPUT.
239*9ed0f38eSFaisal Awada      */
getStatusInput() const240*9ed0f38eSFaisal Awada     uint64_t getStatusInput() const
241*9ed0f38eSFaisal Awada     {
242*9ed0f38eSFaisal Awada         return statusInput;
243*9ed0f38eSFaisal Awada     }
244*9ed0f38eSFaisal Awada 
245*9ed0f38eSFaisal Awada     /**
246*9ed0f38eSFaisal Awada      * @brief Returns the last read value from STATUS_MFR.
247*9ed0f38eSFaisal Awada      */
getMFRFault() const248*9ed0f38eSFaisal Awada     uint64_t getMFRFault() const
249*9ed0f38eSFaisal Awada     {
250*9ed0f38eSFaisal Awada         return statusMFR;
251*9ed0f38eSFaisal Awada     }
252*9ed0f38eSFaisal Awada 
253*9ed0f38eSFaisal Awada     /**
254*9ed0f38eSFaisal Awada      * @brief Returns the last read value from STATUS_CML.
255*9ed0f38eSFaisal Awada      */
getStatusCML() const256*9ed0f38eSFaisal Awada     uint64_t getStatusCML() const
257*9ed0f38eSFaisal Awada     {
258*9ed0f38eSFaisal Awada         return statusCML;
259*9ed0f38eSFaisal Awada     }
260*9ed0f38eSFaisal Awada 
261*9ed0f38eSFaisal Awada     /**
262*9ed0f38eSFaisal Awada      * @brief Returns the last read value from STATUS_VOUT.
263*9ed0f38eSFaisal Awada      */
getStatusVout() const264*9ed0f38eSFaisal Awada     uint64_t getStatusVout() const
265*9ed0f38eSFaisal Awada     {
266*9ed0f38eSFaisal Awada         return statusVout;
267*9ed0f38eSFaisal Awada     }
268*9ed0f38eSFaisal Awada 
269*9ed0f38eSFaisal Awada     /**
270*9ed0f38eSFaisal Awada      * @brief Returns the last value read from STATUS_IOUT.
271*9ed0f38eSFaisal Awada      */
getStatusIout() const272*9ed0f38eSFaisal Awada     uint64_t getStatusIout() const
273*9ed0f38eSFaisal Awada     {
274*9ed0f38eSFaisal Awada         return statusIout;
275*9ed0f38eSFaisal Awada     }
276*9ed0f38eSFaisal Awada 
277*9ed0f38eSFaisal Awada     /**
278*9ed0f38eSFaisal Awada      * @brief Returns the last value read from STATUS_FANS_1_2.
279*9ed0f38eSFaisal Awada      */
getStatusFans12() const280*9ed0f38eSFaisal Awada     uint64_t getStatusFans12() const
281*9ed0f38eSFaisal Awada     {
282*9ed0f38eSFaisal Awada         return statusFans12;
283*9ed0f38eSFaisal Awada     }
284*9ed0f38eSFaisal Awada 
285*9ed0f38eSFaisal Awada     /**
286*9ed0f38eSFaisal Awada      * @brief Returns the last value read from STATUS_TEMPERATURE.
287*9ed0f38eSFaisal Awada      */
getStatusTemperature() const288*9ed0f38eSFaisal Awada     uint64_t getStatusTemperature() const
289*9ed0f38eSFaisal Awada     {
290*9ed0f38eSFaisal Awada         return statusTemperature;
291*9ed0f38eSFaisal Awada     }
292*9ed0f38eSFaisal Awada 
293*9ed0f38eSFaisal Awada     /**
294*9ed0f38eSFaisal Awada      * @brief Returns true if a fault was found.
295*9ed0f38eSFaisal Awada      */
isFaulted() const296*9ed0f38eSFaisal Awada     bool isFaulted() const
297*9ed0f38eSFaisal Awada     {
298*9ed0f38eSFaisal Awada         return (hasCommFault() || (vinUVFault >= DEGLITCH_LIMIT) ||
299*9ed0f38eSFaisal Awada                 (inputFault >= DEGLITCH_LIMIT) ||
300*9ed0f38eSFaisal Awada                 (voutOVFault >= DEGLITCH_LIMIT) ||
301*9ed0f38eSFaisal Awada                 (ioutOCFault >= DEGLITCH_LIMIT) ||
302*9ed0f38eSFaisal Awada                 (voutUVFault >= DEGLITCH_LIMIT) ||
303*9ed0f38eSFaisal Awada                 (fanFault >= DEGLITCH_LIMIT) || (tempFault >= DEGLITCH_LIMIT) ||
304*9ed0f38eSFaisal Awada                 (pgoodFault >= PGOOD_DEGLITCH_LIMIT) ||
305*9ed0f38eSFaisal Awada                 (mfrFault >= DEGLITCH_LIMIT));
306*9ed0f38eSFaisal Awada     }
307*9ed0f38eSFaisal Awada 
308*9ed0f38eSFaisal Awada     /**
309*9ed0f38eSFaisal Awada      * @brief Return whether a fault has been logged for this power supply
310*9ed0f38eSFaisal Awada      */
isFaultLogged() const311*9ed0f38eSFaisal Awada     bool isFaultLogged() const
312*9ed0f38eSFaisal Awada     {
313*9ed0f38eSFaisal Awada         return faultLogged;
314*9ed0f38eSFaisal Awada     }
315*9ed0f38eSFaisal Awada 
316*9ed0f38eSFaisal Awada     /**
317*9ed0f38eSFaisal Awada      * @brief Called when a fault for this power supply has been logged.
318*9ed0f38eSFaisal Awada      */
setFaultLogged()319*9ed0f38eSFaisal Awada     void setFaultLogged()
320*9ed0f38eSFaisal Awada     {
321*9ed0f38eSFaisal Awada         faultLogged = true;
322*9ed0f38eSFaisal Awada     }
323*9ed0f38eSFaisal Awada 
324*9ed0f38eSFaisal Awada     /**
325*9ed0f38eSFaisal Awada      * @brief Returns true if INPUT fault occurred.
326*9ed0f38eSFaisal Awada      */
hasInputFault() const327*9ed0f38eSFaisal Awada     bool hasInputFault() const
328*9ed0f38eSFaisal Awada     {
329*9ed0f38eSFaisal Awada         return (inputFault >= DEGLITCH_LIMIT);
330*9ed0f38eSFaisal Awada     }
331*9ed0f38eSFaisal Awada 
332*9ed0f38eSFaisal Awada     /**
333*9ed0f38eSFaisal Awada      * @brief Returns true if MFRSPECIFIC occurred.
334*9ed0f38eSFaisal Awada      */
hasMFRFault() const335*9ed0f38eSFaisal Awada     bool hasMFRFault() const
336*9ed0f38eSFaisal Awada     {
337*9ed0f38eSFaisal Awada         return (mfrFault >= DEGLITCH_LIMIT);
338*9ed0f38eSFaisal Awada     }
339*9ed0f38eSFaisal Awada 
340*9ed0f38eSFaisal Awada     /**
341*9ed0f38eSFaisal Awada      * @brief Returns true if VIN_UV_FAULT occurred.
342*9ed0f38eSFaisal Awada      */
hasVINUVFault() const343*9ed0f38eSFaisal Awada     bool hasVINUVFault() const
344*9ed0f38eSFaisal Awada     {
345*9ed0f38eSFaisal Awada         return (vinUVFault >= DEGLITCH_LIMIT);
346*9ed0f38eSFaisal Awada     }
347*9ed0f38eSFaisal Awada 
348*9ed0f38eSFaisal Awada     /**
349*9ed0f38eSFaisal Awada      * @brief Returns true if VOUT_OV_FAULT occurred.
350*9ed0f38eSFaisal Awada      */
hasVoutOVFault() const351*9ed0f38eSFaisal Awada     bool hasVoutOVFault() const
352*9ed0f38eSFaisal Awada     {
353*9ed0f38eSFaisal Awada         return (voutOVFault >= DEGLITCH_LIMIT);
354*9ed0f38eSFaisal Awada     }
355*9ed0f38eSFaisal Awada 
356*9ed0f38eSFaisal Awada     /**
357*9ed0f38eSFaisal Awada      * @brief Returns true if IOUT_OC fault occurred (bit 4 STATUS_BYTE).
358*9ed0f38eSFaisal Awada      */
hasIoutOCFault() const359*9ed0f38eSFaisal Awada     bool hasIoutOCFault() const
360*9ed0f38eSFaisal Awada     {
361*9ed0f38eSFaisal Awada         return (ioutOCFault >= DEGLITCH_LIMIT);
362*9ed0f38eSFaisal Awada     }
363*9ed0f38eSFaisal Awada 
364*9ed0f38eSFaisal Awada     /**
365*9ed0f38eSFaisal Awada      * @brief Returns true if VOUT_UV_FAULT occurred.
366*9ed0f38eSFaisal Awada      */
hasVoutUVFault() const367*9ed0f38eSFaisal Awada     bool hasVoutUVFault() const
368*9ed0f38eSFaisal Awada     {
369*9ed0f38eSFaisal Awada         return (voutUVFault >= DEGLITCH_LIMIT);
370*9ed0f38eSFaisal Awada     }
371*9ed0f38eSFaisal Awada 
372*9ed0f38eSFaisal Awada     /**
373*9ed0f38eSFaisal Awada      *@brief Returns true if fan fault occurred.
374*9ed0f38eSFaisal Awada      */
hasFanFault() const375*9ed0f38eSFaisal Awada     bool hasFanFault() const
376*9ed0f38eSFaisal Awada     {
377*9ed0f38eSFaisal Awada         return (fanFault >= DEGLITCH_LIMIT);
378*9ed0f38eSFaisal Awada     }
379*9ed0f38eSFaisal Awada 
380*9ed0f38eSFaisal Awada     /**
381*9ed0f38eSFaisal Awada      * @brief Returns true if TEMPERATURE fault occurred.
382*9ed0f38eSFaisal Awada      */
hasTempFault() const383*9ed0f38eSFaisal Awada     bool hasTempFault() const
384*9ed0f38eSFaisal Awada     {
385*9ed0f38eSFaisal Awada         return (tempFault >= DEGLITCH_LIMIT);
386*9ed0f38eSFaisal Awada     }
387*9ed0f38eSFaisal Awada 
388*9ed0f38eSFaisal Awada     /**
389*9ed0f38eSFaisal Awada      * @brief Returns true if there is a PGood fault (PGOOD# inactive, or OFF
390*9ed0f38eSFaisal Awada      * bit on).
391*9ed0f38eSFaisal Awada      */
hasPgoodFault() const392*9ed0f38eSFaisal Awada     bool hasPgoodFault() const
393*9ed0f38eSFaisal Awada     {
394*9ed0f38eSFaisal Awada         return (pgoodFault >= PGOOD_DEGLITCH_LIMIT);
395*9ed0f38eSFaisal Awada     }
396*9ed0f38eSFaisal Awada 
397*9ed0f38eSFaisal Awada     /**
398*9ed0f38eSFaisal Awada      * @brief Return true if there is a PS_Kill fault.
399*9ed0f38eSFaisal Awada      */
hasPSKillFault() const400*9ed0f38eSFaisal Awada     bool hasPSKillFault() const
401*9ed0f38eSFaisal Awada     {
402*9ed0f38eSFaisal Awada         return (psKillFault >= DEGLITCH_LIMIT);
403*9ed0f38eSFaisal Awada     }
404*9ed0f38eSFaisal Awada 
405*9ed0f38eSFaisal Awada     /**
406*9ed0f38eSFaisal Awada      * @brief Returns true if there is a 12Vcs (standy power) fault.
407*9ed0f38eSFaisal Awada      */
hasPS12VcsFault() const408*9ed0f38eSFaisal Awada     bool hasPS12VcsFault() const
409*9ed0f38eSFaisal Awada     {
410*9ed0f38eSFaisal Awada         return (ps12VcsFault >= DEGLITCH_LIMIT);
411*9ed0f38eSFaisal Awada     }
412*9ed0f38eSFaisal Awada 
413*9ed0f38eSFaisal Awada     /**
414*9ed0f38eSFaisal Awada      * @brief Returns true if there is a 12V current-share fault.
415*9ed0f38eSFaisal Awada      */
hasPSCS12VFault() const416*9ed0f38eSFaisal Awada     bool hasPSCS12VFault() const
417*9ed0f38eSFaisal Awada     {
418*9ed0f38eSFaisal Awada         return (psCS12VFault >= DEGLITCH_LIMIT);
419*9ed0f38eSFaisal Awada     }
420*9ed0f38eSFaisal Awada 
421*9ed0f38eSFaisal Awada     /**
422*9ed0f38eSFaisal Awada      * @brief Returns true if an AC fault has occurred in the window of
423*9ed0f38eSFaisal Awada      * interest.
424*9ed0f38eSFaisal Awada      */
hasACFault() const425*9ed0f38eSFaisal Awada     bool hasACFault() const
426*9ed0f38eSFaisal Awada     {
427*9ed0f38eSFaisal Awada         return acFault != 0;
428*9ed0f38eSFaisal Awada     }
429*9ed0f38eSFaisal Awada 
430*9ed0f38eSFaisal Awada     /**
431*9ed0f38eSFaisal Awada      * @brief Returns the device path
432*9ed0f38eSFaisal Awada      *
433*9ed0f38eSFaisal Awada      * This can be used for error call outs.
434*9ed0f38eSFaisal Awada      * Example: /sys/bus/i2c/devices/3-0068
435*9ed0f38eSFaisal Awada      */
getDevicePath() const436*9ed0f38eSFaisal Awada     const std::string getDevicePath() const
437*9ed0f38eSFaisal Awada     {
438*9ed0f38eSFaisal Awada         return pmbusIntf->path();
439*9ed0f38eSFaisal Awada     }
440*9ed0f38eSFaisal Awada 
441*9ed0f38eSFaisal Awada     /**
442*9ed0f38eSFaisal Awada      * @brief Returns this power supply's inventory path.
443*9ed0f38eSFaisal Awada      *
444*9ed0f38eSFaisal Awada      * This can be used for error call outs.
445*9ed0f38eSFaisal Awada      * Example:
446*9ed0f38eSFaisal Awada      * /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
447*9ed0f38eSFaisal Awada      */
getInventoryPath() const448*9ed0f38eSFaisal Awada     const std::string& getInventoryPath() const
449*9ed0f38eSFaisal Awada     {
450*9ed0f38eSFaisal Awada         return inventoryPath;
451*9ed0f38eSFaisal Awada     }
452*9ed0f38eSFaisal Awada 
453*9ed0f38eSFaisal Awada     /**
454*9ed0f38eSFaisal Awada      * @brief Returns the short name (last part of inventoryPath).
455*9ed0f38eSFaisal Awada      */
getShortName() const456*9ed0f38eSFaisal Awada     const std::string& getShortName() const
457*9ed0f38eSFaisal Awada     {
458*9ed0f38eSFaisal Awada         return shortName;
459*9ed0f38eSFaisal Awada     }
460*9ed0f38eSFaisal Awada 
461*9ed0f38eSFaisal Awada     /**
462*9ed0f38eSFaisal Awada      * @brief Returns the firmware revision version read from the power supply
463*9ed0f38eSFaisal Awada      */
getFWVersion() const464*9ed0f38eSFaisal Awada     const std::string& getFWVersion() const
465*9ed0f38eSFaisal Awada     {
466*9ed0f38eSFaisal Awada         return fwVersion;
467*9ed0f38eSFaisal Awada     }
468*9ed0f38eSFaisal Awada 
469*9ed0f38eSFaisal Awada     /**
470*9ed0f38eSFaisal Awada      * @brief Returns the model name of the power supply
471*9ed0f38eSFaisal Awada      */
getModelName() const472*9ed0f38eSFaisal Awada     const std::string& getModelName() const
473*9ed0f38eSFaisal Awada     {
474*9ed0f38eSFaisal Awada         return modelName;
475*9ed0f38eSFaisal Awada     }
476*9ed0f38eSFaisal Awada 
477*9ed0f38eSFaisal Awada     /**
478*9ed0f38eSFaisal Awada      * @brief Returns true if the number of failed reads exceeds limit
479*9ed0f38eSFaisal Awada      */
hasCommFault() const480*9ed0f38eSFaisal Awada     bool hasCommFault() const
481*9ed0f38eSFaisal Awada     {
482*9ed0f38eSFaisal Awada         return (readFail >= LOG_LIMIT);
483*9ed0f38eSFaisal Awada     }
484*9ed0f38eSFaisal Awada 
485*9ed0f38eSFaisal Awada     /**
486*9ed0f38eSFaisal Awada      * @brief Reads the pmbus input voltage and returns that actual voltage
487*9ed0f38eSFaisal Awada      *        reading and the calculated input voltage based on thresholds.
488*9ed0f38eSFaisal Awada      * @param[out] actualInputVoltage - The actual voltage reading, in Volts.
489*9ed0f38eSFaisal Awada      * @param[out] inputVoltage - A rounded up/down value of the actual input
490*9ed0f38eSFaisal Awada      *             voltage based on thresholds, in Volts.
491*9ed0f38eSFaisal Awada      */
492*9ed0f38eSFaisal Awada     void getInputVoltage(double& actualInputVoltage, int& inputVoltage) const;
493*9ed0f38eSFaisal Awada 
494*9ed0f38eSFaisal Awada     /**
495*9ed0f38eSFaisal Awada      * @brief Check if the PS is considered to be available or not
496*9ed0f38eSFaisal Awada      *
497*9ed0f38eSFaisal Awada      * It is unavailable if any of:
498*9ed0f38eSFaisal Awada      * - not present
499*9ed0f38eSFaisal Awada      * - input fault active
500*9ed0f38eSFaisal Awada      * - Vin UV fault active
501*9ed0f38eSFaisal Awada      * - PS KILL fault active
502*9ed0f38eSFaisal Awada      * - Iout OC fault active
503*9ed0f38eSFaisal Awada      *
504*9ed0f38eSFaisal Awada      * Other faults will, through creating error logs with callouts, already
505*9ed0f38eSFaisal Awada      * be setting the Functional property to false.
506*9ed0f38eSFaisal Awada      *
507*9ed0f38eSFaisal Awada      * On changes, the Available property is updated in the inventory.
508*9ed0f38eSFaisal Awada      */
509*9ed0f38eSFaisal Awada     void checkAvailability();
510*9ed0f38eSFaisal Awada 
511*9ed0f38eSFaisal Awada     /**
512*9ed0f38eSFaisal Awada      * @brief Returns true when INPUT_HISTORY sync is required.
513*9ed0f38eSFaisal Awada      */
isSyncHistoryRequired() const514*9ed0f38eSFaisal Awada     bool isSyncHistoryRequired() const
515*9ed0f38eSFaisal Awada     {
516*9ed0f38eSFaisal Awada         return syncHistoryRequired;
517*9ed0f38eSFaisal Awada     }
518*9ed0f38eSFaisal Awada 
519*9ed0f38eSFaisal Awada     /**
520*9ed0f38eSFaisal Awada      * @brief Clears the indicator that sync required for INPUT_HISTORY.
521*9ed0f38eSFaisal Awada      *
522*9ed0f38eSFaisal Awada      * Sets variable to false to indicate that the sync is no longer required.
523*9ed0f38eSFaisal Awada      * This can be used after the PSUManager has reacted to the need for the
524*9ed0f38eSFaisal Awada      * INPUT_HISTORY data to be synchronized.
525*9ed0f38eSFaisal Awada      */
clearSyncHistoryRequired()526*9ed0f38eSFaisal Awada     void clearSyncHistoryRequired()
527*9ed0f38eSFaisal Awada     {
528*9ed0f38eSFaisal Awada         syncHistoryRequired = false;
529*9ed0f38eSFaisal Awada     }
530*9ed0f38eSFaisal Awada 
531*9ed0f38eSFaisal Awada     /**
532*9ed0f38eSFaisal Awada      * @brief Puts the input voltage rating on D-Bus.
533*9ed0f38eSFaisal Awada      *
534*9ed0f38eSFaisal Awada      * The rating is like 0, 110, 220.
535*9ed0f38eSFaisal Awada      */
536*9ed0f38eSFaisal Awada     void setInputVoltageRating();
537*9ed0f38eSFaisal Awada 
538*9ed0f38eSFaisal Awada     /**
539*9ed0f38eSFaisal Awada      * @brief Returns the peak input power value if there is one,
540*9ed0f38eSFaisal Awada      *        otherwise std::nullopt.
541*9ed0f38eSFaisal Awada      */
getPeakInputPower() const542*9ed0f38eSFaisal Awada     std::optional<double> getPeakInputPower() const
543*9ed0f38eSFaisal Awada     {
544*9ed0f38eSFaisal Awada         std::optional<double> value;
545*9ed0f38eSFaisal Awada         if (peakInputPowerSensor)
546*9ed0f38eSFaisal Awada         {
547*9ed0f38eSFaisal Awada             value = peakInputPowerSensor->value();
548*9ed0f38eSFaisal Awada         }
549*9ed0f38eSFaisal Awada         return value;
550*9ed0f38eSFaisal Awada     }
551*9ed0f38eSFaisal Awada 
552*9ed0f38eSFaisal Awada     /**
553*9ed0f38eSFaisal Awada      * @brief Converts a Linear Format power number to an integer
554*9ed0f38eSFaisal Awada      *
555*9ed0f38eSFaisal Awada      * The PMBus spec describes a 2 byte Linear Format
556*9ed0f38eSFaisal Awada      * number that is composed of an exponent and mantissa
557*9ed0f38eSFaisal Awada      * in two's complement notation.
558*9ed0f38eSFaisal Awada      *
559*9ed0f38eSFaisal Awada      * Value = Mantissa * 2**Exponent
560*9ed0f38eSFaisal Awada      *
561*9ed0f38eSFaisal Awada      * @return double - The converted value
562*9ed0f38eSFaisal Awada      */
563*9ed0f38eSFaisal Awada     static double linearToInteger(uint16_t data);
564*9ed0f38eSFaisal Awada 
565*9ed0f38eSFaisal Awada     /**
566*9ed0f38eSFaisal Awada      * @brief Retrieve device driver name
567*9ed0f38eSFaisal Awada      */
getDriverName() const568*9ed0f38eSFaisal Awada     const std::string& getDriverName() const
569*9ed0f38eSFaisal Awada     {
570*9ed0f38eSFaisal Awada         return driverName;
571*9ed0f38eSFaisal Awada     }
572*9ed0f38eSFaisal Awada 
573*9ed0f38eSFaisal Awada     /**
574*9ed0f38eSFaisal Awada      * @brief Set device driver name
575*9ed0f38eSFaisal Awada      * @param[in] newDriver - device driver name.
576*9ed0f38eSFaisal Awada      */
setDriverName(const std::string & newDriver)577*9ed0f38eSFaisal Awada     void setDriverName(const std::string& newDriver)
578*9ed0f38eSFaisal Awada     {
579*9ed0f38eSFaisal Awada         driverName = newDriver;
580*9ed0f38eSFaisal Awada     }
581*9ed0f38eSFaisal Awada 
582*9ed0f38eSFaisal Awada   private:
583*9ed0f38eSFaisal Awada     /**
584*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for CML (communication, memory, logic fault).
585*9ed0f38eSFaisal Awada      */
586*9ed0f38eSFaisal Awada     void analyzeCMLFault();
587*9ed0f38eSFaisal Awada 
588*9ed0f38eSFaisal Awada     /**
589*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for INPUT bit on.
590*9ed0f38eSFaisal Awada      *
591*9ed0f38eSFaisal Awada      * "An input voltage, input current, or input power fault or warning has
592*9ed0f38eSFaisal Awada      * occurred."
593*9ed0f38eSFaisal Awada      */
594*9ed0f38eSFaisal Awada     void analyzeInputFault();
595*9ed0f38eSFaisal Awada 
596*9ed0f38eSFaisal Awada     /**
597*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for VOUT being set.
598*9ed0f38eSFaisal Awada      *
599*9ed0f38eSFaisal Awada      * If VOUT is on, "An output voltage fault or warning has occurred.", and
600*9ed0f38eSFaisal Awada      * VOUT_OV_FAULT is on, there is an output over-voltage fault.
601*9ed0f38eSFaisal Awada      */
602*9ed0f38eSFaisal Awada     void analyzeVoutOVFault();
603*9ed0f38eSFaisal Awada 
604*9ed0f38eSFaisal Awada     /**
605*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD value read for IOUT_OC_FAULT.
606*9ed0f38eSFaisal Awada      *
607*9ed0f38eSFaisal Awada      * "An output overcurrent fault has occurred." If it is on, and fault not
608*9ed0f38eSFaisal Awada      * set, trace STATUS_WORD, STATUS_MFR_SPECIFIC, and STATUS_IOUT values.
609*9ed0f38eSFaisal Awada      */
610*9ed0f38eSFaisal Awada     void analyzeIoutOCFault();
611*9ed0f38eSFaisal Awada 
612*9ed0f38eSFaisal Awada     /**
613*9ed0f38eSFaisal Awada      * @brief Examines STATUS_WORD value read to see if there is a UV fault.
614*9ed0f38eSFaisal Awada      *
615*9ed0f38eSFaisal Awada      * Checks if the VOUT bit is on, indicating "An output voltage fault or
616*9ed0f38eSFaisal Awada      * warning has occurred", if it is on, but VOUT_OV_FAULT is off, it is
617*9ed0f38eSFaisal Awada      * determined to be an indication of an output under-voltage fault.
618*9ed0f38eSFaisal Awada      */
619*9ed0f38eSFaisal Awada     void analyzeVoutUVFault();
620*9ed0f38eSFaisal Awada 
621*9ed0f38eSFaisal Awada     /**
622*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for the fan fault/warning bit.
623*9ed0f38eSFaisal Awada      *
624*9ed0f38eSFaisal Awada      * If fanFault is not on, trace that the bit now came on, include
625*9ed0f38eSFaisal Awada      * STATUS_WORD, STATUS_MFR_SPECIFIC, and STATUS_FANS_1_2 values as well, to
626*9ed0f38eSFaisal Awada      * help with understanding what may have caused it to be set.
627*9ed0f38eSFaisal Awada      */
628*9ed0f38eSFaisal Awada     void analyzeFanFault();
629*9ed0f38eSFaisal Awada 
630*9ed0f38eSFaisal Awada     /**
631*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for temperature fault.
632*9ed0f38eSFaisal Awada      */
633*9ed0f38eSFaisal Awada     void analyzeTemperatureFault();
634*9ed0f38eSFaisal Awada 
635*9ed0f38eSFaisal Awada     /**
636*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD for pgood or unit off faults.
637*9ed0f38eSFaisal Awada      */
638*9ed0f38eSFaisal Awada     void analyzePgoodFault();
639*9ed0f38eSFaisal Awada 
640*9ed0f38eSFaisal Awada     /**
641*9ed0f38eSFaisal Awada      * @brief Determine possible manufacturer-specific faults from bits in
642*9ed0f38eSFaisal Awada      * STATUS_MFR.
643*9ed0f38eSFaisal Awada      *
644*9ed0f38eSFaisal Awada      * The bits in the STATUS_MFR_SPECIFIC command response have "Manufacturer
645*9ed0f38eSFaisal Awada      * Defined" meanings. Determine which faults, if any, are present based on
646*9ed0f38eSFaisal Awada      * the power supply (device driver) type.
647*9ed0f38eSFaisal Awada      */
648*9ed0f38eSFaisal Awada     void determineMFRFault();
649*9ed0f38eSFaisal Awada 
650*9ed0f38eSFaisal Awada     /**
651*9ed0f38eSFaisal Awada      * @brief Examine STATUS_WORD value read for MFRSPECIFIC bit on.
652*9ed0f38eSFaisal Awada      *
653*9ed0f38eSFaisal Awada      * "A manufacturer specific fault or warning has occurred."
654*9ed0f38eSFaisal Awada      *
655*9ed0f38eSFaisal Awada      * If it is on, call the determineMFRFault() helper function to examine the
656*9ed0f38eSFaisal Awada      * value read from STATUS_MFR_SPECIFIC.
657*9ed0f38eSFaisal Awada      */
658*9ed0f38eSFaisal Awada     void analyzeMFRFault();
659*9ed0f38eSFaisal Awada 
660*9ed0f38eSFaisal Awada     /**
661*9ed0f38eSFaisal Awada      * @brief Analyzes the STATUS_WORD for a VIN_UV_FAULT indicator.
662*9ed0f38eSFaisal Awada      */
663*9ed0f38eSFaisal Awada     void analyzeVinUVFault();
664*9ed0f38eSFaisal Awada 
665*9ed0f38eSFaisal Awada     /**
666*9ed0f38eSFaisal Awada      * @brief Given a full inventory path, returns the last node of the path as
667*9ed0f38eSFaisal Awada      * the "short name"
668*9ed0f38eSFaisal Awada      */
findShortName(const std::string & invPath)669*9ed0f38eSFaisal Awada     std::string findShortName(const std::string& invPath)
670*9ed0f38eSFaisal Awada     {
671*9ed0f38eSFaisal Awada         const auto lastSlashPos = invPath.find_last_of('/');
672*9ed0f38eSFaisal Awada 
673*9ed0f38eSFaisal Awada         if ((lastSlashPos == std::string::npos) ||
674*9ed0f38eSFaisal Awada             ((lastSlashPos + 1) == invPath.size()))
675*9ed0f38eSFaisal Awada         {
676*9ed0f38eSFaisal Awada             return invPath;
677*9ed0f38eSFaisal Awada         }
678*9ed0f38eSFaisal Awada         else
679*9ed0f38eSFaisal Awada         {
680*9ed0f38eSFaisal Awada             return invPath.substr(lastSlashPos + 1);
681*9ed0f38eSFaisal Awada         }
682*9ed0f38eSFaisal Awada     }
683*9ed0f38eSFaisal Awada 
684*9ed0f38eSFaisal Awada     /**
685*9ed0f38eSFaisal Awada      * @brief Binds or unbinds the power supply device driver
686*9ed0f38eSFaisal Awada      *
687*9ed0f38eSFaisal Awada      * Called when a presence change is detected to either bind the device
688*9ed0f38eSFaisal Awada      * driver for the power supply when it is installed, or unbind the device
689*9ed0f38eSFaisal Awada      * driver when the power supply is removed.
690*9ed0f38eSFaisal Awada      *
691*9ed0f38eSFaisal Awada      * Note:
692*9ed0f38eSFaisal Awada      *    Bind device when device present and i2cbus-i2caddr does not exist
693*9ed0f38eSFaisal Awada      *    UnBind device when device not present and i2cbus-i2caddr  exist
694*9ed0f38eSFaisal Awada 
695*9ed0f38eSFaisal Awada      * Writes <device> to <path>/bind (or unbind)
696*9ed0f38eSFaisal Awada      *
697*9ed0f38eSFaisal Awada      * @param present - when true, will bind the device driver
698*9ed0f38eSFaisal Awada      *                  when false, will unbind the device driver
699*9ed0f38eSFaisal Awada      */
700*9ed0f38eSFaisal Awada     void bindOrUnbindDriver(bool present);
701*9ed0f38eSFaisal Awada 
702*9ed0f38eSFaisal Awada     /**
703*9ed0f38eSFaisal Awada      *  @brief Updates the presence status by querying D-Bus
704*9ed0f38eSFaisal Awada      *
705*9ed0f38eSFaisal Awada      * The D-Bus inventory properties for this power supply will be read to
706*9ed0f38eSFaisal Awada      * determine if the power supply is present or not and update this
707*9ed0f38eSFaisal Awada      * object's present member variable to reflect current status.
708*9ed0f38eSFaisal Awada      **/
709*9ed0f38eSFaisal Awada     void updatePresence();
710*9ed0f38eSFaisal Awada 
711*9ed0f38eSFaisal Awada     /**
712*9ed0f38eSFaisal Awada      * @brief Updates the power supply presence by reading the GPIO line.
713*9ed0f38eSFaisal Awada      */
714*9ed0f38eSFaisal Awada     void updatePresenceGPIO();
715*9ed0f38eSFaisal Awada 
716*9ed0f38eSFaisal Awada     /**
717*9ed0f38eSFaisal Awada      * @brief Callback for inventory property changes
718*9ed0f38eSFaisal Awada      *
719*9ed0f38eSFaisal Awada      * Process change of Present property for power supply.
720*9ed0f38eSFaisal Awada      *
721*9ed0f38eSFaisal Awada      * This is used if we are watching the D-Bus properties instead of reading
722*9ed0f38eSFaisal Awada      * the GPIO presence line ourselves.
723*9ed0f38eSFaisal Awada      *
724*9ed0f38eSFaisal Awada      * @param[in]  msg - Data associated with Present change signal
725*9ed0f38eSFaisal Awada      **/
726*9ed0f38eSFaisal Awada     void inventoryChanged(sdbusplus::message_t& msg);
727*9ed0f38eSFaisal Awada 
728*9ed0f38eSFaisal Awada     /**
729*9ed0f38eSFaisal Awada      * @brief Callback for inventory property added.
730*9ed0f38eSFaisal Awada      *
731*9ed0f38eSFaisal Awada      * Process add of the interface with the Present property for power supply.
732*9ed0f38eSFaisal Awada      *
733*9ed0f38eSFaisal Awada      * This is used if we are watching the D-Bus properties instead of reading
734*9ed0f38eSFaisal Awada      * the GPIO presence line ourselves.
735*9ed0f38eSFaisal Awada      *
736*9ed0f38eSFaisal Awada      * @param[in]  msg - Data associated with Present add signal
737*9ed0f38eSFaisal Awada      **/
738*9ed0f38eSFaisal Awada     void inventoryAdded(sdbusplus::message_t& msg);
739*9ed0f38eSFaisal Awada 
740*9ed0f38eSFaisal Awada     /**
741*9ed0f38eSFaisal Awada      * @brief Reads the pmbus MFR_POUT_MAX value.
742*9ed0f38eSFaisal Awada      *
743*9ed0f38eSFaisal Awada      * "The MFR_POUT_MAX command sets or retrieves the maximum rated output
744*9ed0f38eSFaisal Awada      * power, in watts, that the unit is rated to supply."
745*9ed0f38eSFaisal Awada      *
746*9ed0f38eSFaisal Awada      * @return max_power_out value converted from string.
747*9ed0f38eSFaisal Awada      */
748*9ed0f38eSFaisal Awada     auto getMaxPowerOut() const;
749*9ed0f38eSFaisal Awada 
750*9ed0f38eSFaisal Awada     /**
751*9ed0f38eSFaisal Awada      * @brief Reads a VPD value from PMBus, correct size, and contents.
752*9ed0f38eSFaisal Awada      *
753*9ed0f38eSFaisal Awada      * If the VPD data read is not the passed in size, resize and fill with
754*9ed0f38eSFaisal Awada      * spaces. If the data contains a non-alphanumeric value, replace any of
755*9ed0f38eSFaisal Awada      * those values with spaces.
756*9ed0f38eSFaisal Awada      *
757*9ed0f38eSFaisal Awada      * @param[in] vpdName - The name of the sysfs "file" to read data from.
758*9ed0f38eSFaisal Awada      * @param[in] type - The HWMON file type to read from.
759*9ed0f38eSFaisal Awada      * @param[in] vpdSize - The expacted size of the data for this VPD/property
760*9ed0f38eSFaisal Awada      *
761*9ed0f38eSFaisal Awada      * @return A string containing the VPD data read, resized if necessary
762*9ed0f38eSFaisal Awada      */
763*9ed0f38eSFaisal Awada     auto readVPDValue(const std::string& vpdName,
764*9ed0f38eSFaisal Awada                       const phosphor::pmbus::Type& type,
765*9ed0f38eSFaisal Awada                       const std::size_t& vpdSize);
766*9ed0f38eSFaisal Awada 
767*9ed0f38eSFaisal Awada     /**
768*9ed0f38eSFaisal Awada      * @brief Retrieve PSU VPD keyword from D-Bus
769*9ed0f38eSFaisal Awada      *
770*9ed0f38eSFaisal Awada      * It retrieves PSU VPD keyword from D-Bus and assign the associated
771*9ed0f38eSFaisal Awada      * string to vpdStr.
772*9ed0f38eSFaisal Awada      * @param[in] keyword - The VPD search keyword
773*9ed0f38eSFaisal Awada      * @param[out] vpdStr - The VPD string associated with the keyword.
774*9ed0f38eSFaisal Awada      */
775*9ed0f38eSFaisal Awada     void getPsuVpdFromDbus(const std::string& keyword, std::string& vpdStr);
776*9ed0f38eSFaisal Awada 
777*9ed0f38eSFaisal Awada     /**
778*9ed0f38eSFaisal Awada      * @brief Creates the appropriate sensor D-Bus objects.
779*9ed0f38eSFaisal Awada      */
780*9ed0f38eSFaisal Awada     void setupSensors();
781*9ed0f38eSFaisal Awada 
782*9ed0f38eSFaisal Awada     /**
783*9ed0f38eSFaisal Awada      * @brief Monitors sensor values and updates D-Bus.
784*9ed0f38eSFaisal Awada      *        Called from analyze().
785*9ed0f38eSFaisal Awada      */
786*9ed0f38eSFaisal Awada     void monitorSensors();
787*9ed0f38eSFaisal Awada 
788*9ed0f38eSFaisal Awada     /**
789*9ed0f38eSFaisal Awada      * @brief Creates the peak input power sensor D-Bus object
790*9ed0f38eSFaisal Awada      *        if the PS supports it.
791*9ed0f38eSFaisal Awada      */
792*9ed0f38eSFaisal Awada     void setupInputPowerPeakSensor();
793*9ed0f38eSFaisal Awada 
794*9ed0f38eSFaisal Awada     /**
795*9ed0f38eSFaisal Awada      * @brief Monitors the peak input power sensor
796*9ed0f38eSFaisal Awada      */
797*9ed0f38eSFaisal Awada     void monitorPeakInputPowerSensor();
798*9ed0f38eSFaisal Awada 
799*9ed0f38eSFaisal Awada     /**
800*9ed0f38eSFaisal Awada      * @brief Sets any sensor objects to Available = false on D-Bus.
801*9ed0f38eSFaisal Awada      */
802*9ed0f38eSFaisal Awada     void setSensorsNotAvailable();
803*9ed0f38eSFaisal Awada 
804*9ed0f38eSFaisal Awada     /**
805*9ed0f38eSFaisal Awada      * @brief Returns the associations to create for a sensor on this
806*9ed0f38eSFaisal Awada      *        power supply.
807*9ed0f38eSFaisal Awada      */
808*9ed0f38eSFaisal Awada     std::vector<AssociationTuple> getSensorAssociations();
809*9ed0f38eSFaisal Awada 
810*9ed0f38eSFaisal Awada     /**
811*9ed0f38eSFaisal Awada      * @brief systemd bus member
812*9ed0f38eSFaisal Awada      */
813*9ed0f38eSFaisal Awada     sdbusplus::bus_t& bus;
814*9ed0f38eSFaisal Awada 
815*9ed0f38eSFaisal Awada     /**
816*9ed0f38eSFaisal Awada      * @brief D-Bus path to use for this power supply's inventory status.
817*9ed0f38eSFaisal Awada      **/
818*9ed0f38eSFaisal Awada     std::string inventoryPath;
819*9ed0f38eSFaisal Awada 
820*9ed0f38eSFaisal Awada     /**
821*9ed0f38eSFaisal Awada      * @brief The file system path used for binding the device driver.
822*9ed0f38eSFaisal Awada      */
823*9ed0f38eSFaisal Awada     std::filesystem::path bindPath;
824*9ed0f38eSFaisal Awada 
825*9ed0f38eSFaisal Awada     /**
826*9ed0f38eSFaisal Awada      * @brief Get the power on status of the psu manager class.
827*9ed0f38eSFaisal Awada      *
828*9ed0f38eSFaisal Awada      * This is a callback method used to get the power on status of the psu
829*9ed0f38eSFaisal Awada      * manager class.
830*9ed0f38eSFaisal Awada      */
831*9ed0f38eSFaisal Awada     std::function<bool()> isPowerOn;
832*9ed0f38eSFaisal Awada 
833*9ed0f38eSFaisal Awada     /**
834*9ed0f38eSFaisal Awada      * @brief Set to true when INPUT_HISTORY sync is required.
835*9ed0f38eSFaisal Awada      *
836*9ed0f38eSFaisal Awada      * A power supply will need to synchronize its INPUT_HISTORY data with the
837*9ed0f38eSFaisal Awada      * other power supplies installed in the system when it goes from missing to
838*9ed0f38eSFaisal Awada      * present.
839*9ed0f38eSFaisal Awada      */
840*9ed0f38eSFaisal Awada     bool syncHistoryRequired{false};
841*9ed0f38eSFaisal Awada 
842*9ed0f38eSFaisal Awada     /**
843*9ed0f38eSFaisal Awada      * @brief Store the short name to avoid string processing.
844*9ed0f38eSFaisal Awada      *
845*9ed0f38eSFaisal Awada      * The short name will be something like powersupply1, the last part of the
846*9ed0f38eSFaisal Awada      * inventoryPath.
847*9ed0f38eSFaisal Awada      */
848*9ed0f38eSFaisal Awada     std::string shortName;
849*9ed0f38eSFaisal Awada 
850*9ed0f38eSFaisal Awada     /**
851*9ed0f38eSFaisal Awada      * @brief The libgpiod object for monitoring PSU presence
852*9ed0f38eSFaisal Awada      */
853*9ed0f38eSFaisal Awada     std::unique_ptr<GPIOInterfaceBase> presenceGPIO = nullptr;
854*9ed0f38eSFaisal Awada 
855*9ed0f38eSFaisal Awada     /**
856*9ed0f38eSFaisal Awada      * @brief True if the power supply is present.
857*9ed0f38eSFaisal Awada      */
858*9ed0f38eSFaisal Awada     bool present = false;
859*9ed0f38eSFaisal Awada 
860*9ed0f38eSFaisal Awada     /**
861*9ed0f38eSFaisal Awada      * @brief Power supply model name.
862*9ed0f38eSFaisal Awada      */
863*9ed0f38eSFaisal Awada     std::string modelName;
864*9ed0f38eSFaisal Awada 
865*9ed0f38eSFaisal Awada     /**
866*9ed0f38eSFaisal Awada      * @brief D-Bus match variable used to subscribe to Present property
867*9ed0f38eSFaisal Awada      * changes.
868*9ed0f38eSFaisal Awada      **/
869*9ed0f38eSFaisal Awada     std::unique_ptr<sdbusplus::bus::match_t> presentMatch;
870*9ed0f38eSFaisal Awada 
871*9ed0f38eSFaisal Awada     /**
872*9ed0f38eSFaisal Awada      * @brief D-Bus match variable used to subscribe for Present property
873*9ed0f38eSFaisal Awada      * interface added.
874*9ed0f38eSFaisal Awada      */
875*9ed0f38eSFaisal Awada     std::unique_ptr<sdbusplus::bus::match_t> presentAddedMatch;
876*9ed0f38eSFaisal Awada 
877*9ed0f38eSFaisal Awada     /**
878*9ed0f38eSFaisal Awada      * @brief Pointer to the PMBus interface
879*9ed0f38eSFaisal Awada      *
880*9ed0f38eSFaisal Awada      * Used to read or write to/from PMBus power supply devices.
881*9ed0f38eSFaisal Awada      */
882*9ed0f38eSFaisal Awada     std::unique_ptr<phosphor::pmbus::PMBusBase> pmbusIntf = nullptr;
883*9ed0f38eSFaisal Awada 
884*9ed0f38eSFaisal Awada     /**
885*9ed0f38eSFaisal Awada      * @brief Stored copy of the firmware version/revision string
886*9ed0f38eSFaisal Awada      */
887*9ed0f38eSFaisal Awada     std::string fwVersion;
888*9ed0f38eSFaisal Awada 
889*9ed0f38eSFaisal Awada     /**
890*9ed0f38eSFaisal Awada      * @brief The string to pass in for binding the device driver.
891*9ed0f38eSFaisal Awada      */
892*9ed0f38eSFaisal Awada     std::string bindDevice;
893*9ed0f38eSFaisal Awada 
894*9ed0f38eSFaisal Awada     /**
895*9ed0f38eSFaisal Awada      * @brief The result of the most recent availability check
896*9ed0f38eSFaisal Awada      *
897*9ed0f38eSFaisal Awada      * Saved on the object so changes can be detected.
898*9ed0f38eSFaisal Awada      */
899*9ed0f38eSFaisal Awada     bool available = false;
900*9ed0f38eSFaisal Awada 
901*9ed0f38eSFaisal Awada     /**
902*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/lastvalue read from STATUS_WORD.
903*9ed0f38eSFaisal Awada      */
904*9ed0f38eSFaisal Awada     uint64_t statusWord = 0;
905*9ed0f38eSFaisal Awada 
906*9ed0f38eSFaisal Awada     /**
907*9ed0f38eSFaisal Awada      * @brief Will be set to the last read value of STATUS_WORD.
908*9ed0f38eSFaisal Awada      */
909*9ed0f38eSFaisal Awada     uint64_t statusWordOld = 0;
910*9ed0f38eSFaisal Awada 
911*9ed0f38eSFaisal Awada     /**
912*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/lastvalue read from STATUS_INPUT.
913*9ed0f38eSFaisal Awada      */
914*9ed0f38eSFaisal Awada     uint64_t statusInput = 0;
915*9ed0f38eSFaisal Awada 
916*9ed0f38eSFaisal Awada     /**
917*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/lastvalue read from STATUS_MFR.
918*9ed0f38eSFaisal Awada      */
919*9ed0f38eSFaisal Awada     uint64_t statusMFR = 0;
920*9ed0f38eSFaisal Awada 
921*9ed0f38eSFaisal Awada     /**
922*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/last value read from STATUS_CML.
923*9ed0f38eSFaisal Awada      */
924*9ed0f38eSFaisal Awada     uint64_t statusCML = 0;
925*9ed0f38eSFaisal Awada 
926*9ed0f38eSFaisal Awada     /**
927*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/last value read from STATUS_VOUT.
928*9ed0f38eSFaisal Awada      */
929*9ed0f38eSFaisal Awada     uint64_t statusVout = 0;
930*9ed0f38eSFaisal Awada 
931*9ed0f38eSFaisal Awada     /**
932*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/last value read from STATUS_IOUT.
933*9ed0f38eSFaisal Awada      */
934*9ed0f38eSFaisal Awada     uint64_t statusIout = 0;
935*9ed0f38eSFaisal Awada 
936*9ed0f38eSFaisal Awada     /**
937*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/last value read from
938*9ed0f38eSFaisal Awada      * STATUS_FANS_1_2.
939*9ed0f38eSFaisal Awada      */
940*9ed0f38eSFaisal Awada     uint64_t statusFans12 = 0;
941*9ed0f38eSFaisal Awada 
942*9ed0f38eSFaisal Awada     /**
943*9ed0f38eSFaisal Awada      * @brief Will be updated to the latest/last value read from
944*9ed0f38eSFaisal Awada      * STATUS_TEMPERATURE.
945*9ed0f38eSFaisal Awada      */
946*9ed0f38eSFaisal Awada     uint64_t statusTemperature = 0;
947*9ed0f38eSFaisal Awada 
948*9ed0f38eSFaisal Awada     /**
949*9ed0f38eSFaisal Awada      * @brief Will be updated with latest converted value read from READ_VIN
950*9ed0f38eSFaisal Awada      */
951*9ed0f38eSFaisal Awada     int inputVoltage = phosphor::pmbus::in_input::VIN_VOLTAGE_0;
952*9ed0f38eSFaisal Awada 
953*9ed0f38eSFaisal Awada     /**
954*9ed0f38eSFaisal Awada      * @brief Will be updated with the actual voltage last read from READ_VIN
955*9ed0f38eSFaisal Awada      */
956*9ed0f38eSFaisal Awada     double actualInputVoltage = 0;
957*9ed0f38eSFaisal Awada 
958*9ed0f38eSFaisal Awada     /**
959*9ed0f38eSFaisal Awada      * @brief True if an error for a fault has already been logged.
960*9ed0f38eSFaisal Awada      */
961*9ed0f38eSFaisal Awada     bool faultLogged = false;
962*9ed0f38eSFaisal Awada 
963*9ed0f38eSFaisal Awada     /**
964*9ed0f38eSFaisal Awada      * @brief Incremented if bit 1 of STATUS_WORD low byte is on.
965*9ed0f38eSFaisal Awada      *
966*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
967*9ed0f38eSFaisal Awada      */
968*9ed0f38eSFaisal Awada     size_t cmlFault = 0;
969*9ed0f38eSFaisal Awada 
970*9ed0f38eSFaisal Awada     /**
971*9ed0f38eSFaisal Awada      * @brief Incremented if bit 5 of STATUS_WORD high byte is on.
972*9ed0f38eSFaisal Awada      *
973*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
974*9ed0f38eSFaisal Awada      */
975*9ed0f38eSFaisal Awada     size_t inputFault = 0;
976*9ed0f38eSFaisal Awada 
977*9ed0f38eSFaisal Awada     /**
978*9ed0f38eSFaisal Awada      * @brief Incremented if bit 4 of STATUS_WORD high byte is on.
979*9ed0f38eSFaisal Awada      *
980*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
981*9ed0f38eSFaisal Awada      */
982*9ed0f38eSFaisal Awada     size_t mfrFault = 0;
983*9ed0f38eSFaisal Awada 
984*9ed0f38eSFaisal Awada     /**
985*9ed0f38eSFaisal Awada      * @brief Incremented if bit 3 of STATUS_WORD low byte is on.
986*9ed0f38eSFaisal Awada      *
987*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
988*9ed0f38eSFaisal Awada      */
989*9ed0f38eSFaisal Awada     size_t vinUVFault = 0;
990*9ed0f38eSFaisal Awada 
991*9ed0f38eSFaisal Awada     /**
992*9ed0f38eSFaisal Awada      * @brief Incremented if bit 5 of STATUS_WORD low byte is on.
993*9ed0f38eSFaisal Awada      *
994*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
995*9ed0f38eSFaisal Awada      */
996*9ed0f38eSFaisal Awada     size_t voutOVFault = 0;
997*9ed0f38eSFaisal Awada 
998*9ed0f38eSFaisal Awada     /**
999*9ed0f38eSFaisal Awada      * @brief Incremented if bit 4 of STATUS_WORD low byte is on.
1000*9ed0f38eSFaisal Awada      *
1001*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
1002*9ed0f38eSFaisal Awada      */
1003*9ed0f38eSFaisal Awada     size_t ioutOCFault = 0;
1004*9ed0f38eSFaisal Awada 
1005*9ed0f38eSFaisal Awada     /**
1006*9ed0f38eSFaisal Awada      * @brief Incremented if bit 7 of STATUS_WORD high byte is on and bit 5
1007*9ed0f38eSFaisal Awada      * (VOUT_OV) of low byte is off.
1008*9ed0f38eSFaisal Awada      *
1009*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
1010*9ed0f38eSFaisal Awada      */
1011*9ed0f38eSFaisal Awada     size_t voutUVFault = 0;
1012*9ed0f38eSFaisal Awada 
1013*9ed0f38eSFaisal Awada     /**
1014*9ed0f38eSFaisal Awada      * @brief Incremented if FANS fault/warn bit on in STATUS_WORD.
1015*9ed0f38eSFaisal Awada      *
1016*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
1017*9ed0f38eSFaisal Awada      */
1018*9ed0f38eSFaisal Awada     size_t fanFault = 0;
1019*9ed0f38eSFaisal Awada 
1020*9ed0f38eSFaisal Awada     /**
1021*9ed0f38eSFaisal Awada      * @brief Incremented if bit 2 of STATUS_WORD low byte is on.
1022*9ed0f38eSFaisal Awada      *
1023*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
1024*9ed0f38eSFaisal Awada      */
1025*9ed0f38eSFaisal Awada     size_t tempFault = 0;
1026*9ed0f38eSFaisal Awada 
1027*9ed0f38eSFaisal Awada     /**
1028*9ed0f38eSFaisal Awada      * @brief Incremented if bit 11 or 6 of STATUS_WORD is on. PGOOD# is
1029*9ed0f38eSFaisal Awada      * inactive, or the unit is off.
1030*9ed0f38eSFaisal Awada      *
1031*9ed0f38eSFaisal Awada      * Considered faulted if reaches DEGLITCH_LIMIT.
1032*9ed0f38eSFaisal Awada      */
1033*9ed0f38eSFaisal Awada     size_t pgoodFault = 0;
1034*9ed0f38eSFaisal Awada 
1035*9ed0f38eSFaisal Awada     /**
1036*9ed0f38eSFaisal Awada      * @brief Power Supply Kill fault.
1037*9ed0f38eSFaisal Awada      *
1038*9ed0f38eSFaisal Awada      * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
1039*9ed0f38eSFaisal Awada      * bit 4 to indicate this fault. Considered faulted if it reaches
1040*9ed0f38eSFaisal Awada      * DEGLITCH_LIMIT.
1041*9ed0f38eSFaisal Awada      */
1042*9ed0f38eSFaisal Awada     size_t psKillFault = 0;
1043*9ed0f38eSFaisal Awada 
1044*9ed0f38eSFaisal Awada     /**
1045*9ed0f38eSFaisal Awada      * @brief Power Supply 12Vcs fault (standby power).
1046*9ed0f38eSFaisal Awada      *
1047*9ed0f38eSFaisal Awada      * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
1048*9ed0f38eSFaisal Awada      * bit 6 to indicate this fault. Considered faulted if it reaches
1049*9ed0f38eSFaisal Awada      * DEGLITCH_LIMIT.
1050*9ed0f38eSFaisal Awada      */
1051*9ed0f38eSFaisal Awada     size_t ps12VcsFault = 0;
1052*9ed0f38eSFaisal Awada 
1053*9ed0f38eSFaisal Awada     /**
1054*9ed0f38eSFaisal Awada      * @brief Power Supply Current-Share fault in 12V domain.
1055*9ed0f38eSFaisal Awada      *
1056*9ed0f38eSFaisal Awada      * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
1057*9ed0f38eSFaisal Awada      * bit 7 to indicate this fault. Considered faulted if it reaches
1058*9ed0f38eSFaisal Awada      * DEGLITCH_LIMIT.
1059*9ed0f38eSFaisal Awada      */
1060*9ed0f38eSFaisal Awada     size_t psCS12VFault = 0;
1061*9ed0f38eSFaisal Awada 
1062*9ed0f38eSFaisal Awada     /**
1063*9ed0f38eSFaisal Awada      * @brief Set to AC_FAULT_LIMIT when AC fault is detected, decremented when
1064*9ed0f38eSFaisal Awada      * AC fault has cleared. Effectively forms a timer since last AC failure.
1065*9ed0f38eSFaisal Awada      * Zero indicates being outside the window of concern.
1066*9ed0f38eSFaisal Awada      */
1067*9ed0f38eSFaisal Awada     size_t acFault = 0;
1068*9ed0f38eSFaisal Awada 
1069*9ed0f38eSFaisal Awada     /**
1070*9ed0f38eSFaisal Awada      * @brief Count of the number of read failures.
1071*9ed0f38eSFaisal Awada      */
1072*9ed0f38eSFaisal Awada     size_t readFail = 0;
1073*9ed0f38eSFaisal Awada 
1074*9ed0f38eSFaisal Awada     /**
1075*9ed0f38eSFaisal Awada      * @brief The D-Bus object for the input voltage rating
1076*9ed0f38eSFaisal Awada      *
1077*9ed0f38eSFaisal Awada      * It is updated at startup and power on.  If a power supply is
1078*9ed0f38eSFaisal Awada      * added or removed after that, it does not need to be updated
1079*9ed0f38eSFaisal Awada      * again (though that could be done as a future improvement).
1080*9ed0f38eSFaisal Awada      */
1081*9ed0f38eSFaisal Awada     std::unique_ptr<SensorObject> inputVoltageRatingIface;
1082*9ed0f38eSFaisal Awada 
1083*9ed0f38eSFaisal Awada     /**
1084*9ed0f38eSFaisal Awada      * @brief The D-Bus object for the peak input power sensor.
1085*9ed0f38eSFaisal Awada      */
1086*9ed0f38eSFaisal Awada     std::unique_ptr<PowerSensorObject> peakInputPowerSensor;
1087*9ed0f38eSFaisal Awada 
1088*9ed0f38eSFaisal Awada     /**
1089*9ed0f38eSFaisal Awada      * @brief The device driver name
1090*9ed0f38eSFaisal Awada      */
1091*9ed0f38eSFaisal Awada     std::string driverName;
1092*9ed0f38eSFaisal Awada 
1093*9ed0f38eSFaisal Awada     /**
1094*9ed0f38eSFaisal Awada      * @brief The chassis unique name
1095*9ed0f38eSFaisal Awada      */
1096*9ed0f38eSFaisal Awada     std::string chassisName;
1097*9ed0f38eSFaisal Awada };
1098*9ed0f38eSFaisal Awada 
1099*9ed0f38eSFaisal Awada } // namespace phosphor::power::psu
1100