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