blob: 304185ef883d2d38188e0d4a5f3bf3bdd6739c1d [file] [log] [blame]
Brandon Wymana0f33ce2019-10-17 18:32:29 -05001#pragma once
2
Brandon Wymanc3324422022-03-24 20:30:57 +00003#include "average.hpp"
4#include "maximum.hpp"
Brandon Wyman8d195772020-01-27 15:03:51 -06005#include "pmbus.hpp"
Brandon Wymanc3324422022-03-24 20:30:57 +00006#include "record_manager.hpp"
Brandon Wymanaed1f752019-11-25 18:10:52 -06007#include "types.hpp"
B. J. Wyman681b2a32021-04-20 22:31:22 +00008#include "util.hpp"
Brandon Wyman3f1242f2020-01-28 13:11:25 -06009#include "utility.hpp"
Brandon Wymanaed1f752019-11-25 18:10:52 -060010
B. J. Wyman681b2a32021-04-20 22:31:22 +000011#include <gpiod.hpp>
Brandon Wymanaed1f752019-11-25 18:10:52 -060012#include <sdbusplus/bus/match.hpp>
Matt Spinlera068f422023-03-10 13:06:49 -060013#include <xyz/openbmc_project/Sensor/Value/server.hpp>
Brandon Wymanaed1f752019-11-25 18:10:52 -060014
B. J. Wyman681b2a32021-04-20 22:31:22 +000015#include <filesystem>
Brandon Wyman1d7a7df2020-03-26 10:14:05 -050016#include <stdexcept>
17
Brandon Wymana0f33ce2019-10-17 18:32:29 -050018namespace phosphor::power::psu
19{
Brandon Wyman3f1242f2020-01-28 13:11:25 -060020
Chanh Nguyenc12c53b2021-04-06 17:24:47 +070021#if IBM_VPD
Brandon Wyman1d7a7df2020-03-26 10:14:05 -050022// PMBus device driver "file name" to read for CCIN value.
23constexpr auto CCIN = "ccin";
Matt Spinlerb40f04c2023-03-20 11:07:44 -050024constexpr auto PART_NUMBER = "mfr_revision";
25constexpr auto FRU_NUMBER = "mfr_model";
26constexpr auto SERIAL_HEADER = "mfr_location";
27constexpr auto SERIAL_NUMBER = "mfr_serial";
Brandon Wyman1d7a7df2020-03-26 10:14:05 -050028constexpr auto FW_VERSION = "fw_version";
29
30// The D-Bus property name to update with the CCIN value.
31constexpr auto MODEL_PROP = "Model";
32constexpr auto PN_PROP = "PartNumber";
Brandon Wymana169b0f2021-12-07 20:18:06 +000033constexpr auto SPARE_PN_PROP = "SparePartNumber";
Brandon Wyman1d7a7df2020-03-26 10:14:05 -050034constexpr auto SN_PROP = "SerialNumber";
35constexpr auto VERSION_PROP = "Version";
36
37// ipzVPD Keyword sizes
38static constexpr auto FL_KW_SIZE = 20;
Brandon Wyman8393f462022-06-28 16:06:46 +000039static constexpr auto FN_KW_SIZE = 7;
40static constexpr auto PN_KW_SIZE = 7;
41// For IBM power supplies, the SN is 6-byte header + 6-byte serial.
42static constexpr auto SN_KW_SIZE = 12;
43static constexpr auto CC_KW_SIZE = 4;
Brandon Wyman1d7a7df2020-03-26 10:14:05 -050044#endif
45
Brandon Wymanf65c4062020-08-19 13:15:53 -050046constexpr auto LOG_LIMIT = 3;
Brandon Wyman06ca4592021-12-06 22:52:23 +000047constexpr auto DEGLITCH_LIMIT = 3;
Brandon Wyman6d469fd2022-06-15 16:58:21 +000048constexpr auto PGOOD_DEGLITCH_LIMIT = 5;
Jim Wright4ab86562022-11-18 14:05:46 -060049// Number of polls to remember that an AC fault occured. Should remain greater
50// than PGOOD_DEGLITCH_LIMIT.
51constexpr auto AC_FAULT_LIMIT = 6;
Brandon Wymanf65c4062020-08-19 13:15:53 -050052
Faisal Awadab66ae502023-04-01 18:30:32 -050053constexpr auto IBMCFFPS_DD_NAME = "ibm-cffps";
54
Matt Spinlera068f422023-03-10 13:06:49 -060055using SensorInterface = sdbusplus::xyz::openbmc_project::Sensor::server::Value;
56using SensorObject = sdbusplus::server::object_t<SensorInterface>;
57
Brandon Wymana0f33ce2019-10-17 18:32:29 -050058/**
59 * @class PowerSupply
60 * Represents a PMBus power supply device.
61 */
62class PowerSupply
63{
64 public:
Brandon Wymanaed1f752019-11-25 18:10:52 -060065 PowerSupply() = delete;
Brandon Wymana0f33ce2019-10-17 18:32:29 -050066 PowerSupply(const PowerSupply&) = delete;
67 PowerSupply(PowerSupply&&) = delete;
68 PowerSupply& operator=(const PowerSupply&) = delete;
69 PowerSupply& operator=(PowerSupply&&) = delete;
70 ~PowerSupply() = default;
71
72 /**
Brandon Wymanc63941c2020-01-27 16:49:33 -060073 * @param[in] invpath - String for inventory path to use
74 * @param[in] i2cbus - The bus number this power supply is on
75 * @param[in] i2caddr - The 16-bit I2C address of the power supply
Brandon Wymanc3324422022-03-24 20:30:57 +000076 * @param[in] driver - i2c driver name for power supply
B. J. Wyman681b2a32021-04-20 22:31:22 +000077 * @param[in] gpioLineName - The gpio-line-name to read for presence. See
78 * https://github.com/openbmc/docs/blob/master/designs/device-tree-gpio-naming.md
George Liu9464c422023-02-27 14:30:27 +080079 * @param[in] callback - Get the power on status of the psu manager class
Brandon Wymanaed1f752019-11-25 18:10:52 -060080 */
Patrick Williams7354ce62022-07-22 19:26:56 -050081 PowerSupply(sdbusplus::bus_t& bus, const std::string& invpath,
B. J. Wyman681b2a32021-04-20 22:31:22 +000082 std::uint8_t i2cbus, const std::uint16_t i2caddr,
George Liu9464c422023-02-27 14:30:27 +080083 const std::string& driver, const std::string& gpioLineName,
84 std::function<bool()>&& callback);
Brandon Wymanaed1f752019-11-25 18:10:52 -060085
Brandon Wyman3f1242f2020-01-28 13:11:25 -060086 phosphor::pmbus::PMBusBase& getPMBus()
87 {
88 return *pmbusIntf;
89 }
90
Adriana Kobylak3ca062a2021-10-20 15:27:23 +000091 GPIOInterfaceBase* getPresenceGPIO()
B. J. Wyman681b2a32021-04-20 22:31:22 +000092 {
93 return presenceGPIO.get();
94 }
95
B. J. Wymand8b8cb12021-07-15 22:03:34 +000096 std::string getPresenceGPIOName() const
97 {
98 if (presenceGPIO != nullptr)
99 {
100 return presenceGPIO->getName();
101 }
102 else
103 {
104 return std::string();
105 }
106 }
107
Brandon Wymanaed1f752019-11-25 18:10:52 -0600108 /**
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500109 * Power supply specific function to analyze for faults/errors.
110 *
111 * Various PMBus status bits will be checked for fault conditions.
112 * If a certain fault bits are on, the appropriate error will be
113 * committed.
114 */
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600115 void analyze();
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500116
117 /**
Brandon Wyman59a35792020-06-04 12:37:40 -0500118 * Write PMBus ON_OFF_CONFIG
119 *
120 * This function will be called to cause the PMBus device driver to send the
121 * ON_OFF_CONFIG command. Takes one byte of data.
122 *
123 * @param[in] data - The ON_OFF_CONFIG data byte mask.
124 */
125 void onOffConfig(uint8_t data);
126
127 /**
Brandon Wymane3f7ad22021-12-21 20:27:45 +0000128 * Clears all the member variables that indicate if a fault bit was seen as
129 * on in the STATUS_WORD or STATUS_MFR_SPECIFIC response.
130 */
131 void clearFaultFlags()
132 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000133 inputFault = 0;
134 mfrFault = 0;
Brandon Wymane3f7ad22021-12-21 20:27:45 +0000135 statusMFR = 0;
Brandon Wymanc2906f42021-12-21 20:14:56 +0000136 vinUVFault = 0;
137 cmlFault = 0;
138 voutOVFault = 0;
139 ioutOCFault = 0;
140 voutUVFault = 0;
141 fanFault = 0;
142 tempFault = 0;
Brandon Wymane3f7ad22021-12-21 20:27:45 +0000143 pgoodFault = 0;
Brandon Wymanc2906f42021-12-21 20:14:56 +0000144 psKillFault = 0;
145 ps12VcsFault = 0;
146 psCS12VFault = 0;
Brandon Wymanba6d9602022-05-02 18:10:47 +0000147 faultLogged = false;
Brandon Wymane3f7ad22021-12-21 20:27:45 +0000148 }
149
150 /**
Brandon Wyman3225a452022-03-18 18:51:49 +0000151 * @brief Function to specifically clear VIN_UV/OFF fault(s).
152 *
153 * The PMBus HWMON device driver has various alarm "files" to read out of
154 * sysfs. Reading those files will indicate if various alarms are active or
155 * not, and then specifically clear those faults that go with that alarm.
156 *
157 * The VIN_UV fault, indicated in STATUS_INPUT, goes with in1_lcrit_alarm.
158 * When a VIN_UV fault occurs, the "Unit Off For Insufficient Input Voltage"
159 * may also be active. Reading in1_lcrit_alarm should clear both fault bits,
160 * resulting in the corresponding fault bits in STATUS_WORD also clearing.
161 *
162 * See: https://www.kernel.org/doc/html/latest/hwmon/pmbus.html
163 */
164 void clearVinUVFault();
165
166 /**
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500167 * Write PMBus CLEAR_FAULTS
168 *
169 * This function will be called in various situations in order to clear
170 * any fault status bits that may have been set, in order to start over
171 * with a clean state. Presence changes and power state changes will
172 * want to clear any faults logged.
173 */
Brandon Wyman3c208462020-05-13 16:25:58 -0500174 void clearFaults();
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500175
176 /**
177 * @brief Adds properties to the inventory.
178 *
179 * Reads the values from the device and writes them to the
180 * associated power supply D-Bus inventory object.
181 *
182 * This needs to be done on startup, and each time the presence
183 * state changes.
184 *
185 * Properties added:
186 * - Serial Number
187 * - Part Number
188 * - CCIN (Customer Card Identification Number) - added as the Model
189 * - Firmware version
190 */
Brandon Wyman1d7a7df2020-03-26 10:14:05 -0500191 void updateInventory();
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500192
Brandon Wymanaed1f752019-11-25 18:10:52 -0600193 /**
194 * @brief Accessor function to indicate present status
195 */
196 bool isPresent() const
197 {
198 return present;
199 }
200
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600201 /**
Brandon Wymanfed0ba22020-09-26 20:02:51 -0500202 * @brief Returns the last read value from STATUS_WORD.
203 */
204 uint64_t getStatusWord() const
205 {
206 return statusWord;
207 }
208
209 /**
Brandon Wymanf07bc792021-10-12 19:00:35 +0000210 * @brief Returns the last read value from STATUS_INPUT.
211 */
212 uint64_t getStatusInput() const
213 {
214 return statusInput;
215 }
216
217 /**
Jay Meyer10d94052020-11-30 14:41:21 -0600218 * @brief Returns the last read value from STATUS_MFR.
219 */
220 uint64_t getMFRFault() const
221 {
222 return statusMFR;
223 }
224
225 /**
Brandon Wyman85c7bf42021-10-19 22:28:48 +0000226 * @brief Returns the last read value from STATUS_CML.
227 */
228 uint64_t getStatusCML() const
229 {
230 return statusCML;
231 }
232
233 /**
Brandon Wyman6710ba22021-10-27 17:39:31 +0000234 * @brief Returns the last read value from STATUS_VOUT.
235 */
236 uint64_t getStatusVout() const
237 {
238 return statusVout;
239 }
240
241 /**
Brandon Wymanb10b3be2021-11-09 22:12:15 +0000242 * @brief Returns the last value read from STATUS_IOUT.
243 */
244 uint64_t getStatusIout() const
245 {
246 return statusIout;
247 }
248
249 /**
Brandon Wyman7ee4d7e2021-11-19 20:48:23 +0000250 * @brief Returns the last value read from STATUS_FANS_1_2.
251 */
252 uint64_t getStatusFans12() const
253 {
254 return statusFans12;
255 }
256
257 /**
Brandon Wyman96893a42021-11-05 19:56:57 +0000258 * @brief Returns the last value read from STATUS_TEMPERATURE.
259 */
260 uint64_t getStatusTemperature() const
261 {
262 return statusTemperature;
263 }
264
265 /**
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600266 * @brief Returns true if a fault was found.
267 */
268 bool isFaulted() const
269 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000270 return (hasCommFault() || (vinUVFault >= DEGLITCH_LIMIT) ||
271 (inputFault >= DEGLITCH_LIMIT) ||
272 (voutOVFault >= DEGLITCH_LIMIT) ||
273 (ioutOCFault >= DEGLITCH_LIMIT) ||
274 (voutUVFault >= DEGLITCH_LIMIT) ||
275 (fanFault >= DEGLITCH_LIMIT) || (tempFault >= DEGLITCH_LIMIT) ||
Brandon Wyman6d469fd2022-06-15 16:58:21 +0000276 (pgoodFault >= PGOOD_DEGLITCH_LIMIT) ||
277 (mfrFault >= DEGLITCH_LIMIT));
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600278 }
279
280 /**
Brandon Wymanb76ab242020-09-16 18:06:06 -0500281 * @brief Return whether a fault has been logged for this power supply
282 */
283 bool isFaultLogged() const
284 {
285 return faultLogged;
286 }
287
288 /**
289 * @brief Called when a fault for this power supply has been logged.
290 */
291 void setFaultLogged()
292 {
293 faultLogged = true;
294 }
295
296 /**
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600297 * @brief Returns true if INPUT fault occurred.
298 */
299 bool hasInputFault() const
300 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000301 return (inputFault >= DEGLITCH_LIMIT);
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600302 }
303
304 /**
305 * @brief Returns true if MFRSPECIFIC occurred.
306 */
307 bool hasMFRFault() const
308 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000309 return (mfrFault >= DEGLITCH_LIMIT);
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600310 }
311
312 /**
313 * @brief Returns true if VIN_UV_FAULT occurred.
314 */
315 bool hasVINUVFault() const
316 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000317 return (vinUVFault >= DEGLITCH_LIMIT);
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600318 }
319
Brandon Wymanc9efe412020-10-09 15:42:50 -0500320 /**
Brandon Wyman6710ba22021-10-27 17:39:31 +0000321 * @brief Returns true if VOUT_OV_FAULT occurred.
322 */
323 bool hasVoutOVFault() const
324 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000325 return (voutOVFault >= DEGLITCH_LIMIT);
Brandon Wyman6710ba22021-10-27 17:39:31 +0000326 }
327
328 /**
Brandon Wymanb10b3be2021-11-09 22:12:15 +0000329 * @brief Returns true if IOUT_OC fault occurred (bit 4 STATUS_BYTE).
330 */
331 bool hasIoutOCFault() const
332 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000333 return (ioutOCFault >= DEGLITCH_LIMIT);
Brandon Wymanb10b3be2021-11-09 22:12:15 +0000334 }
335
336 /**
Brandon Wyman2cf46942021-10-28 19:09:16 +0000337 * @brief Returns true if VOUT_UV_FAULT occurred.
338 */
339 bool hasVoutUVFault() const
340 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000341 return (voutUVFault >= DEGLITCH_LIMIT);
Brandon Wyman2cf46942021-10-28 19:09:16 +0000342 }
343
344 /**
Brandon Wyman7ee4d7e2021-11-19 20:48:23 +0000345 *@brief Returns true if fan fault occurred.
346 */
347 bool hasFanFault() const
348 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000349 return (fanFault >= DEGLITCH_LIMIT);
Brandon Wyman7ee4d7e2021-11-19 20:48:23 +0000350 }
351
352 /**
Brandon Wyman96893a42021-11-05 19:56:57 +0000353 * @brief Returns true if TEMPERATURE fault occurred.
354 */
355 bool hasTempFault() const
356 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000357 return (tempFault >= DEGLITCH_LIMIT);
Brandon Wyman96893a42021-11-05 19:56:57 +0000358 }
359
360 /**
Brandon Wyman2916ea52021-11-06 03:31:18 +0000361 * @brief Returns true if there is a PGood fault (PGOOD# inactive, or OFF
362 * bit on).
363 */
364 bool hasPgoodFault() const
365 {
Brandon Wyman6d469fd2022-06-15 16:58:21 +0000366 return (pgoodFault >= PGOOD_DEGLITCH_LIMIT);
Brandon Wyman2916ea52021-11-06 03:31:18 +0000367 }
368
369 /**
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000370 * @brief Return true if there is a PS_Kill fault.
371 */
372 bool hasPSKillFault() const
373 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000374 return (psKillFault >= DEGLITCH_LIMIT);
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000375 }
376
377 /**
378 * @brief Returns true if there is a 12Vcs (standy power) fault.
379 */
380 bool hasPS12VcsFault() const
381 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000382 return (ps12VcsFault >= DEGLITCH_LIMIT);
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000383 }
384
385 /**
386 * @brief Returns true if there is a 12V current-share fault.
387 */
388 bool hasPSCS12VFault() const
389 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000390 return (psCS12VFault >= DEGLITCH_LIMIT);
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000391 }
392
393 /**
Jim Wright4ab86562022-11-18 14:05:46 -0600394 * @brief Returns true if an AC fault has occurred in the window of
395 * interest.
396 */
397 bool hasACFault() const
398 {
399 return acFault != 0;
400 }
401
402 /**
Brandon Wymanc9efe412020-10-09 15:42:50 -0500403 * @brief Returns the device path
404 *
405 * This can be used for error call outs.
406 * Example: /sys/bus/i2c/devices/3-0068
407 */
Brandon Wyman4176d6b2020-10-07 17:41:06 -0500408 const std::string getDevicePath() const
409 {
410 return pmbusIntf->path();
411 }
412
Brandon Wymanc9efe412020-10-09 15:42:50 -0500413 /**
Brandon Wyman321a6152022-03-19 00:11:44 +0000414 * @brief Returns this power supply's inventory path.
Brandon Wymanc9efe412020-10-09 15:42:50 -0500415 *
416 * This can be used for error call outs.
417 * Example:
418 * /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
419 */
Brandon Wyman7e495272020-09-26 19:57:46 -0500420 const std::string& getInventoryPath() const
421 {
422 return inventoryPath;
423 }
424
Brandon Wymanc9efe412020-10-09 15:42:50 -0500425 /**
Brandon Wyman321a6152022-03-19 00:11:44 +0000426 * @brief Returns the short name (last part of inventoryPath).
427 */
428 const std::string& getShortName() const
429 {
430 return shortName;
431 }
432
433 /**
Brandon Wymanc9efe412020-10-09 15:42:50 -0500434 * @brief Returns the firmware revision version read from the power supply
435 */
436 const std::string& getFWVersion() const
437 {
438 return fwVersion;
439 }
440
Adriana Kobylak572a9052021-03-30 15:58:07 +0000441 /**
442 * @brief Returns the model name of the power supply
443 */
444 const std::string& getModelName() const
445 {
446 return modelName;
447 }
448
Jim Wright15300242022-11-17 16:37:04 -0600449 /**
450 * @brief Returns true if the number of failed reads exceeds limit
Brandon Wymanf65c4062020-08-19 13:15:53 -0500451 * TODO: or CML bit on.
452 */
453 bool hasCommFault() const
454 {
Brandon Wymanc2906f42021-12-21 20:14:56 +0000455 return ((readFail >= LOG_LIMIT) || (cmlFault >= DEGLITCH_LIMIT));
Brandon Wymanf65c4062020-08-19 13:15:53 -0500456 }
457
Adriana Kobylak4175ffb2021-08-02 14:51:05 +0000458 /**
459 * @brief Reads the pmbus input voltage and returns that actual voltage
460 * reading and the calculated input voltage based on thresholds.
461 * @param[out] actualInputVoltage - The actual voltage reading, in Volts.
462 * @param[out] inputVoltage - A rounded up/down value of the actual input
463 * voltage based on thresholds, in Volts.
464 */
465 void getInputVoltage(double& actualInputVoltage, int& inputVoltage) const;
466
Matt Spinler0975eaf2022-02-14 15:38:30 -0600467 /**
468 * @brief Check if the PS is considered to be available or not
469 *
470 * It is unavailable if any of:
471 * - not present
472 * - input fault active
473 * - Vin UV fault active
474 * - PS KILL fault active
475 * - Iout OC fault active
476 *
477 * Other faults will, through creating error logs with callouts, already
478 * be setting the Functional property to false.
479 *
480 * On changes, the Available property is updated in the inventory.
481 */
482 void checkAvailability();
483
Brandon Wymanc3324422022-03-24 20:30:57 +0000484 /**
485 * @brief Setup for power supply input history.
486 *
487 * This will setup the variables and interfaces needed to get the power
488 * supply input history data over to D-Bus. The only known support for this
489 * at this time is the INPUT_HISTORY command implemented by the IBM Common
490 * Form Factor Power Suppplies (ibm-cffps). The INPUT_HISTORY command for
491 * ibm-cffps is implemented via a manufacturing specific PMBus command.
492 */
493 void setupInputHistory();
494
495 /**
496 * @brief Returns true if this power supply has input history (supported).
497 */
498 bool hasInputHistory() const
499 {
500 return inputHistorySupported;
501 }
502
503 /**
504 * @brief Returns the number of input history records
505 *
506 * PowerSupply wrapper to getNumRecords() from RecordManager.
507 */
508 size_t getNumInputHistoryRecords() const
509 {
510 if (recordManager)
511 {
512 return recordManager->getNumRecords();
513 }
514 else
515 {
516 return 0;
517 }
518 }
519
Brandon Wyman18a24d92022-04-19 22:48:34 +0000520 /**
521 * @brief Returns true when INPUT_HISTORY sync is required.
522 */
523 bool isSyncHistoryRequired() const
524 {
525 return syncHistoryRequired;
526 }
527
528 /**
529 * @brief Clears the indicator that sync required for INPUT_HISTORY.
530 *
531 * Sets variable to false to indicate that the sync is no longer required.
532 * This can be used after the PSUManager has reacted to the need for the
533 * INPUT_HISTORY data to be synchronized.
534 */
535 void clearSyncHistoryRequired()
536 {
537 syncHistoryRequired = false;
538 }
539
Matt Spinlera068f422023-03-10 13:06:49 -0600540 /**
541 * @brief Puts the input voltage rating on D-Bus.
542 *
543 * The rating is like 0, 110, 220.
544 */
545 void setInputVoltageRating();
546
Brandon Wymana0f33ce2019-10-17 18:32:29 -0500547 private:
Jim Wright15300242022-11-17 16:37:04 -0600548 /**
549 * @brief systemd bus member
550 */
Patrick Williams7354ce62022-07-22 19:26:56 -0500551 sdbusplus::bus_t& bus;
Brandon Wymanaed1f752019-11-25 18:10:52 -0600552
Jim Wright15300242022-11-17 16:37:04 -0600553 /**
554 * @brief Will be updated to the latest/lastvalue read from STATUS_WORD.
555 */
Brandon Wymanfed0ba22020-09-26 20:02:51 -0500556 uint64_t statusWord = 0;
557
Jim Wright15300242022-11-17 16:37:04 -0600558 /**
559 * @brief Will be set to the last read value of STATUS_WORD.
560 */
Brandon Wyman9e292ee2022-03-10 22:56:23 +0000561 uint64_t statusWordOld = 0;
562
Jim Wright15300242022-11-17 16:37:04 -0600563 /**
564 * @brief Will be updated to the latest/lastvalue read from STATUS_INPUT.
565 */
Brandon Wymanf07bc792021-10-12 19:00:35 +0000566 uint64_t statusInput = 0;
567
Jim Wright15300242022-11-17 16:37:04 -0600568 /**
569 * @brief Will be updated to the latest/lastvalue read from STATUS_MFR.
570 */
Jay Meyer10d94052020-11-30 14:41:21 -0600571 uint64_t statusMFR = 0;
572
Jim Wright15300242022-11-17 16:37:04 -0600573 /**
574 * @brief Will be updated to the latest/last value read from STATUS_CML.
575 */
Brandon Wyman85c7bf42021-10-19 22:28:48 +0000576 uint64_t statusCML = 0;
577
Jim Wright15300242022-11-17 16:37:04 -0600578 /**
579 * @brief Will be updated to the latest/last value read from STATUS_VOUT.
580 */
Brandon Wyman6710ba22021-10-27 17:39:31 +0000581 uint64_t statusVout = 0;
582
Jim Wright15300242022-11-17 16:37:04 -0600583 /**
584 * @brief Will be updated to the latest/last value read from STATUS_IOUT.
585 */
Brandon Wymanb10b3be2021-11-09 22:12:15 +0000586 uint64_t statusIout = 0;
587
Jim Wright15300242022-11-17 16:37:04 -0600588 /**
589 * @brief Will be updated to the latest/last value read from
590 * STATUS_FANS_1_2.
591 */
Brandon Wyman7ee4d7e2021-11-19 20:48:23 +0000592 uint64_t statusFans12 = 0;
593
Jim Wright15300242022-11-17 16:37:04 -0600594 /**
595 * @brief Will be updated to the latest/last value read from
596 * STATUS_TEMPERATURE.
597 */
Brandon Wyman96893a42021-11-05 19:56:57 +0000598 uint64_t statusTemperature = 0;
599
Jim Wright15300242022-11-17 16:37:04 -0600600 /**
601 * @brief Will be updated with latest converted value read from READ_VIN
602 */
Brandon Wyman82affd92021-11-24 19:12:49 +0000603 int inputVoltage = phosphor::pmbus::in_input::VIN_VOLTAGE_0;
604
Jim Wright15300242022-11-17 16:37:04 -0600605 /**
606 * @brief Will be updated with the actual voltage last read from READ_VIN
Brandon Wyman4fc191f2022-03-10 23:07:13 +0000607 */
608 double actualInputVoltage = 0;
609
Jim Wright15300242022-11-17 16:37:04 -0600610 /**
611 * @brief True if an error for a fault has already been logged.
612 */
Brandon Wymanb76ab242020-09-16 18:06:06 -0500613 bool faultLogged = false;
614
Jim Wright15300242022-11-17 16:37:04 -0600615 /**
616 * @brief Incremented if bit 1 of STATUS_WORD low byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000617 *
618 * Considered faulted if reaches DEGLITCH_LIMIT.
619 */
620 size_t cmlFault = 0;
Brandon Wyman85c7bf42021-10-19 22:28:48 +0000621
Jim Wright15300242022-11-17 16:37:04 -0600622 /**
623 * @brief Incremented if bit 5 of STATUS_WORD high byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000624 *
625 * Considered faulted if reaches DEGLITCH_LIMIT.
626 */
627 size_t inputFault = 0;
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600628
Jim Wright15300242022-11-17 16:37:04 -0600629 /**
630 * @brief Incremented if bit 4 of STATUS_WORD high byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000631 *
632 * Considered faulted if reaches DEGLITCH_LIMIT.
633 */
634 size_t mfrFault = 0;
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600635
Jim Wright15300242022-11-17 16:37:04 -0600636 /**
637 * @brief Incremented if bit 3 of STATUS_WORD low byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000638 *
639 * Considered faulted if reaches DEGLITCH_LIMIT.
640 */
641 size_t vinUVFault = 0;
Brandon Wyman3f1242f2020-01-28 13:11:25 -0600642
Jim Wright15300242022-11-17 16:37:04 -0600643 /**
644 * @brief Incremented if bit 5 of STATUS_WORD low byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000645 *
646 * Considered faulted if reaches DEGLITCH_LIMIT.
647 */
648 size_t voutOVFault = 0;
Brandon Wyman6710ba22021-10-27 17:39:31 +0000649
Jim Wright15300242022-11-17 16:37:04 -0600650 /**
651 * @brief Incremented if bit 4 of STATUS_WORD low byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000652 *
653 * Considered faulted if reaches DEGLITCH_LIMIT.
654 */
655 size_t ioutOCFault = 0;
Brandon Wymanb10b3be2021-11-09 22:12:15 +0000656
Jim Wright15300242022-11-17 16:37:04 -0600657 /**
658 * @brief Incremented if bit 7 of STATUS_WORD high byte is on and bit 5
Brandon Wymanc2906f42021-12-21 20:14:56 +0000659 * (VOUT_OV) of low byte is off.
660 *
661 * Considered faulted if reaches DEGLITCH_LIMIT.
662 */
663 size_t voutUVFault = 0;
Brandon Wyman2cf46942021-10-28 19:09:16 +0000664
Jim Wright15300242022-11-17 16:37:04 -0600665 /**
666 * @brief Incremented if FANS fault/warn bit on in STATUS_WORD.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000667 *
668 * Considered faulted if reaches DEGLITCH_LIMIT.
669 */
670 size_t fanFault = 0;
Brandon Wyman7ee4d7e2021-11-19 20:48:23 +0000671
Jim Wright15300242022-11-17 16:37:04 -0600672 /**
673 * @brief Incremented if bit 2 of STATUS_WORD low byte is on.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000674 *
Jim Wright15300242022-11-17 16:37:04 -0600675 * Considered faulted if reaches DEGLITCH_LIMIT.
676 */
Brandon Wymanc2906f42021-12-21 20:14:56 +0000677 size_t tempFault = 0;
Brandon Wyman96893a42021-11-05 19:56:57 +0000678
Brandon Wyman2cf46942021-10-28 19:09:16 +0000679 /**
Brandon Wyman06ca4592021-12-06 22:52:23 +0000680 * @brief Incremented if bit 11 or 6 of STATUS_WORD is on. PGOOD# is
681 * inactive, or the unit is off.
682 *
683 * Considered faulted if reaches DEGLITCH_LIMIT.
Brandon Wyman2916ea52021-11-06 03:31:18 +0000684 */
Brandon Wyman925c0262021-12-21 20:15:36 +0000685 size_t pgoodFault = 0;
Brandon Wyman2916ea52021-11-06 03:31:18 +0000686
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000687 /**
688 * @brief Power Supply Kill fault.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000689 *
690 * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
691 * bit 4 to indicate this fault. Considered faulted if it reaches
692 * DEGLITCH_LIMIT.
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000693 */
Brandon Wymanc2906f42021-12-21 20:14:56 +0000694 size_t psKillFault = 0;
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000695
696 /**
697 * @brief Power Supply 12Vcs fault (standby power).
Brandon Wymanc2906f42021-12-21 20:14:56 +0000698 *
699 * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
700 * bit 6 to indicate this fault. Considered faulted if it reaches
701 * DEGLITCH_LIMIT.
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000702 */
Brandon Wymanc2906f42021-12-21 20:14:56 +0000703 size_t ps12VcsFault = 0;
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000704
705 /**
706 * @brief Power Supply Current-Share fault in 12V domain.
Brandon Wymanc2906f42021-12-21 20:14:56 +0000707 *
708 * Incremented based on bits in STATUS_MFR_SPECIFIC. IBM power supplies use
709 * bit 7 to indicate this fault. Considered faulted if it reaches
710 * DEGLITCH_LIMIT.
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000711 */
Brandon Wymanc2906f42021-12-21 20:14:56 +0000712 size_t psCS12VFault = 0;
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000713
Jim Wright15300242022-11-17 16:37:04 -0600714 /**
Jim Wright4ab86562022-11-18 14:05:46 -0600715 * @brief Set to AC_FAULT_LIMIT when AC fault is detected, decremented when
716 * AC fault has cleared. Effectively forms a timer since last AC failure.
717 * Zero indicates being outside the window of concern.
718 */
719 size_t acFault = 0;
720
721 /**
Jim Wright15300242022-11-17 16:37:04 -0600722 * @brief Count of the number of read failures.
723 */
Brandon Wymanf65c4062020-08-19 13:15:53 -0500724 size_t readFail = 0;
725
Brandon Wymanaed1f752019-11-25 18:10:52 -0600726 /**
Brandon Wymanc2203432021-12-21 23:09:48 +0000727 * @brief Examine STATUS_WORD for CML (communication, memory, logic fault).
728 */
729 void analyzeCMLFault();
730
731 /**
Brandon Wymane3b0bb02021-12-21 23:16:48 +0000732 * @brief Examine STATUS_WORD for INPUT bit on.
733 *
734 * "An input voltage, input current, or input power fault or warning has
735 * occurred."
736 */
737 void analyzeInputFault();
738
739 /**
Brandon Wymanc2c87132021-12-21 23:22:18 +0000740 * @brief Examine STATUS_WORD for VOUT being set.
741 *
742 * If VOUT is on, "An output voltage fault or warning has occurred.", and
743 * VOUT_OV_FAULT is on, there is an output over-voltage fault.
744 */
745 void analyzeVoutOVFault();
746
Jim Wright15300242022-11-17 16:37:04 -0600747 /**
Brandon Wymana00e7302021-12-21 23:28:29 +0000748 * @brief Examine STATUS_WORD value read for IOUT_OC_FAULT.
749 *
750 * "An output overcurrent fault has occurred." If it is on, and fault not
751 * set, trace STATUS_WORD, STATUS_MFR_SPECIFIC, and STATUS_IOUT values.
752 */
753 void analyzeIoutOCFault();
754
Brandon Wymanc2c87132021-12-21 23:22:18 +0000755 /**
Brandon Wyman08378782021-12-21 23:48:15 +0000756 * @brief Examines STATUS_WORD value read to see if there is a UV fault.
757 *
758 * Checks if the VOUT bit is on, indicating "An output voltage fault or
759 * warning has occurred", if it is on, but VOUT_OV_FAULT is off, it is
760 * determined to be an indication of an output under-voltage fault.
761 */
762 void analyzeVoutUVFault();
763
764 /**
Brandon Wymand5d9a222021-12-21 23:59:05 +0000765 * @brief Examine STATUS_WORD for the fan fault/warning bit.
766 *
767 * If fanFault is not on, trace that the bit now came on, include
768 * STATUS_WORD, STATUS_MFR_SPECIFIC, and STATUS_FANS_1_2 values as well, to
769 * help with understanding what may have caused it to be set.
770 */
771 void analyzeFanFault();
772
773 /**
Brandon Wyman52cb3f22021-12-21 23:02:47 +0000774 * @brief Examine STATUS_WORD for temperature fault.
775 */
776 void analyzeTemperatureFault();
777
778 /**
Brandon Wyman993b5542021-12-21 22:55:16 +0000779 * @brief Examine STATUS_WORD for pgood or unit off faults.
780 */
781 void analyzePgoodFault();
782
783 /**
Brandon Wyman39ea02b2021-11-23 23:22:23 +0000784 * @brief Determine possible manufacturer-specific faults from bits in
785 * STATUS_MFR.
786 *
787 * The bits in the STATUS_MFR_SPECIFIC command response have "Manufacturer
788 * Defined" meanings. Determine which faults, if any, are present based on
789 * the power supply (device driver) type.
790 */
791 void determineMFRFault();
792
793 /**
Brandon Wyman6c2ac392021-12-21 22:23:06 +0000794 * @brief Examine STATUS_WORD value read for MFRSPECIFIC bit on.
795 *
796 * "A manufacturer specific fault or warning has occurred."
797 *
798 * If it is on, call the determineMFRFault() helper function to examine the
799 * value read from STATUS_MFR_SPECIFIC.
800 */
801 void analyzeMFRFault();
802
803 /**
Brandon Wymanf087f472021-12-22 00:04:27 +0000804 * @brief Analyzes the STATUS_WORD for a VIN_UV_FAULT indicator.
805 */
806 void analyzeVinUVFault();
807
808 /**
Brandon Wymanaed1f752019-11-25 18:10:52 -0600809 * @brief D-Bus path to use for this power supply's inventory status.
810 **/
811 std::string inventoryPath;
812
B. J. Wyman681b2a32021-04-20 22:31:22 +0000813 /**
Brandon Wyman321a6152022-03-19 00:11:44 +0000814 * @brief Store the short name to avoid string processing.
815 *
816 * The short name will be something like powersupply1, the last part of the
817 * inventoryPath.
818 */
819 std::string shortName;
820
821 /**
822 * @brief Given a full inventory path, returns the last node of the path as
823 * the "short name"
824 */
825 std::string findShortName(const std::string& invPath)
826 {
Patrick Williams48781ae2023-05-10 07:50:50 -0500827 const auto lastSlashPos = invPath.find_last_of('/');
Brandon Wyman321a6152022-03-19 00:11:44 +0000828
829 if ((lastSlashPos == std::string::npos) ||
830 ((lastSlashPos + 1) == invPath.size()))
831 {
832 return invPath;
833 }
834 else
835 {
836 return invPath.substr(lastSlashPos + 1);
837 }
838 }
839
840 /**
B. J. Wyman681b2a32021-04-20 22:31:22 +0000841 * @brief The libgpiod object for monitoring PSU presence
842 */
Adriana Kobylak3ca062a2021-10-20 15:27:23 +0000843 std::unique_ptr<GPIOInterfaceBase> presenceGPIO = nullptr;
B. J. Wyman681b2a32021-04-20 22:31:22 +0000844
Jim Wright15300242022-11-17 16:37:04 -0600845 /**
846 * @brief True if the power supply is present.
847 */
Brandon Wymanaed1f752019-11-25 18:10:52 -0600848 bool present = false;
849
Jim Wright15300242022-11-17 16:37:04 -0600850 /**
851 * @brief Power supply model name.
852 */
Adriana Kobylak572a9052021-03-30 15:58:07 +0000853 std::string modelName;
854
Jim Wright15300242022-11-17 16:37:04 -0600855 /**
856 * @brief D-Bus match variable used to subscribe to Present property
Brandon Wymanaed1f752019-11-25 18:10:52 -0600857 * changes.
858 **/
859 std::unique_ptr<sdbusplus::bus::match_t> presentMatch;
860
Jim Wright15300242022-11-17 16:37:04 -0600861 /**
862 * @brief D-Bus match variable used to subscribe for Present property
Brandon Wymanaed1f752019-11-25 18:10:52 -0600863 * interface added.
864 */
865 std::unique_ptr<sdbusplus::bus::match_t> presentAddedMatch;
866
867 /**
Brandon Wyman8d195772020-01-27 15:03:51 -0600868 * @brief Pointer to the PMBus interface
869 *
870 * Used to read or write to/from PMBus power supply devices.
871 */
Brandon Wyman9564e942020-11-10 14:01:42 -0600872 std::unique_ptr<phosphor::pmbus::PMBusBase> pmbusIntf = nullptr;
Brandon Wyman8d195772020-01-27 15:03:51 -0600873
Jim Wright15300242022-11-17 16:37:04 -0600874 /**
875 * @brief Stored copy of the firmware version/revision string
876 */
Brandon Wymanc9efe412020-10-09 15:42:50 -0500877 std::string fwVersion;
878
Brandon Wyman8d195772020-01-27 15:03:51 -0600879 /**
B. J. Wyman681b2a32021-04-20 22:31:22 +0000880 * @brief The file system path used for binding the device driver.
881 */
882 const std::filesystem::path bindPath;
883
Jim Wright15300242022-11-17 16:37:04 -0600884 /**
885 * @brief The string to pass in for binding the device driver.
886 */
B. J. Wyman681b2a32021-04-20 22:31:22 +0000887 std::string bindDevice;
888
889 /**
Matt Spinler0975eaf2022-02-14 15:38:30 -0600890 * @brief The result of the most recent availability check
891 *
892 * Saved on the object so changes can be detected.
893 */
894 bool available = false;
895
896 /**
B. J. Wyman681b2a32021-04-20 22:31:22 +0000897 * @brief Binds or unbinds the power supply device driver
898 *
899 * Called when a presence change is detected to either bind the device
900 * driver for the power supply when it is installed, or unbind the device
901 * driver when the power supply is removed.
902 *
903 * Writes <device> to <path>/bind (or unbind)
904 *
905 * @param present - when true, will bind the device driver
906 * when false, will unbind the device driver
907 */
908 void bindOrUnbindDriver(bool present);
909
910 /**
Brandon Wymanaed1f752019-11-25 18:10:52 -0600911 * @brief Updates the presence status by querying D-Bus
912 *
913 * The D-Bus inventory properties for this power supply will be read to
914 * determine if the power supply is present or not and update this
915 * object's present member variable to reflect current status.
916 **/
917 void updatePresence();
918
919 /**
B. J. Wyman681b2a32021-04-20 22:31:22 +0000920 * @brief Updates the power supply presence by reading the GPIO line.
921 */
922 void updatePresenceGPIO();
923
924 /**
Brandon Wymanaed1f752019-11-25 18:10:52 -0600925 * @brief Callback for inventory property changes
926 *
927 * Process change of Present property for power supply.
928 *
B. J. Wyman681b2a32021-04-20 22:31:22 +0000929 * This is used if we are watching the D-Bus properties instead of reading
930 * the GPIO presence line ourselves.
931 *
Brandon Wymanaed1f752019-11-25 18:10:52 -0600932 * @param[in] msg - Data associated with Present change signal
933 **/
Patrick Williams7354ce62022-07-22 19:26:56 -0500934 void inventoryChanged(sdbusplus::message_t& msg);
Brandon Wyman9a507db2021-02-25 16:15:22 -0600935
936 /**
937 * @brief Callback for inventory property added.
938 *
939 * Process add of the interface with the Present property for power supply.
940 *
B. J. Wyman681b2a32021-04-20 22:31:22 +0000941 * This is used if we are watching the D-Bus properties instead of reading
942 * the GPIO presence line ourselves.
943 *
Brandon Wyman9a507db2021-02-25 16:15:22 -0600944 * @param[in] msg - Data associated with Present add signal
945 **/
Patrick Williams7354ce62022-07-22 19:26:56 -0500946 void inventoryAdded(sdbusplus::message_t& msg);
Brandon Wymanc3324422022-03-24 20:30:57 +0000947
948 /**
Brandon Wymanae35ac52022-05-23 22:33:40 +0000949 * @brief Reads the pmbus MFR_POUT_MAX value.
950 *
951 * "The MFR_POUT_MAX command sets or retrieves the maximum rated output
952 * power, in watts, that the unit is rated to supply."
953 *
954 * @return max_power_out value converted from string.
955 */
956 auto getMaxPowerOut() const;
957
Jim Wright15300242022-11-17 16:37:04 -0600958 /**
959 * @brief Reads a VPD value from PMBus, correct size, and contents.
Brandon Wyman056935c2022-06-24 23:05:09 +0000960 *
961 * If the VPD data read is not the passed in size, resize and fill with
962 * spaces. If the data contains a non-alphanumeric value, replace any of
963 * those values with spaces.
Brandon Wyman8393f462022-06-28 16:06:46 +0000964 *
965 * @param[in] vpdName - The name of the sysfs "file" to read data from.
966 * @param[in] type - The HWMON file type to read from.
967 * @param[in] vpdSize - The expacted size of the data for this VPD/property
968 *
969 * @return A string containing the VPD data read, resized if necessary
970 */
971 auto readVPDValue(const std::string& vpdName,
972 const phosphor::pmbus::Type& type,
973 const std::size_t& vpdSize);
974
Brandon Wymanae35ac52022-05-23 22:33:40 +0000975 /**
Brandon Wymanc3324422022-03-24 20:30:57 +0000976 * @brief Reads the most recent input history record from the power supply
977 * and updates the average and maximum properties in D-Bus if there is a new
978 * reading available.
979 *
980 * This will still run every time analyze() is called so code can post new
981 * data as soon as possible and the timestamp will more accurately reflect
982 * the correct time.
983 *
984 * D-Bus is only updated if there is a change and the oldest record will be
985 * pruned if the property already contains the max number of records.
986 */
987 void updateHistory();
988
989 /**
George Liu9464c422023-02-27 14:30:27 +0800990 * @brief Get the power on status of the psu manager class.
991 *
992 * This is a callback method used to get the power on status of the psu
993 * manager class.
994 */
995 std::function<bool()> isPowerOn;
996
997 /**
Brandon Wymanc3324422022-03-24 20:30:57 +0000998 * @brief Set to true if INPUT_HISTORY command supported.
999 *
1000 * Not all power supplies will support the INPUT_HISTORY command. The IBM
1001 * Common Form Factor power supplies do support this command.
1002 */
1003 bool inputHistorySupported{false};
1004
1005 /**
Brandon Wyman18a24d92022-04-19 22:48:34 +00001006 * @brief Set to true when INPUT_HISTORY sync is required.
1007 *
1008 * A power supply will need to synchronize its INPUT_HISTORY data with the
1009 * other power supplies installed in the system when it goes from missing to
1010 * present.
1011 */
1012 bool syncHistoryRequired{false};
1013
1014 /**
Brandon Wymanc3324422022-03-24 20:30:57 +00001015 * @brief Class that manages the input power history records.
1016 **/
1017 std::unique_ptr<history::RecordManager> recordManager;
1018
1019 /**
1020 * @brief The D-Bus object for the average input power history
1021 **/
1022 std::unique_ptr<history::Average> average;
1023
1024 /**
1025 * @brief The D-Bus object for the maximum input power history
1026 **/
1027 std::unique_ptr<history::Maximum> maximum;
1028
1029 /**
1030 * @brief The base D-Bus object path to use for the average and maximum
1031 * objects.
1032 **/
1033 std::string historyObjectPath;
Matt Spinlera068f422023-03-10 13:06:49 -06001034
1035 /**
1036 * @brief The D-Bus object for the input voltage rating
1037 *
1038 * It is updated at startup and power on. If a power supply is
1039 * added or removed after that, it does not need to be updated
1040 * again (though that could be done as a future improvement).
1041 */
1042 std::unique_ptr<SensorObject> inputVoltageRatingIface;
Faisal Awadab66ae502023-04-01 18:30:32 -05001043
1044 /**
1045 * @brief The device driver name
1046 */
1047 std::string driverName;
faisaladed7a02023-05-10 14:59:01 -05001048
1049 /**
1050 * @brief Retrieve PSU VPD keyword from D-Bus
1051 *
1052 * It retrieves PSU VPD keyword from D-Bus and assign the associated
1053 * string to vpdStr.
1054 * @param[in] keyword - The VPD search keyword
1055 * @param[out] vpdStr - The VPD string associated with the keyword.
1056 */
1057 void getPsuVpdFromDbus(const std::string& keyword, std::string& vpdStr);
Brandon Wymana0f33ce2019-10-17 18:32:29 -05001058};
1059
1060} // namespace phosphor::power::psu