1 #include "power_supply.hpp"
2 
3 #include "types.hpp"
4 #include "util.hpp"
5 
6 #include <xyz/openbmc_project/Common/Device/error.hpp>
7 
8 namespace phosphor::power::psu
9 {
10 
11 using namespace phosphor::logging;
12 using namespace sdbusplus::xyz::openbmc_project::Common::Device::Error;
13 
14 void PowerSupply::updatePresence()
15 {
16     try
17     {
18         present = getPresence(bus, inventoryPath);
19     }
20     catch (const sdbusplus::exception::SdBusError& e)
21     {
22         // Relying on property change or interface added to retry.
23         // Log an informational trace to the journal.
24         log<level::INFO>("D-Bus property access failure exception");
25     }
26 }
27 
28 void PowerSupply::analyze()
29 {
30     using namespace phosphor::pmbus;
31 
32     if (present)
33     {
34         try
35         {
36             auto statusWord{pmbusIntf->read(STATUS_WORD, Type::Debug)};
37 
38             if (statusWord)
39             {
40                 if (statusWord & status_word::INPUT_FAULT_WARN)
41                 {
42                     if (!inputFault)
43                     {
44                         log<level::INFO>(
45                             "INPUT fault",
46                             entry("STATUS_WORD=0x%04X",
47                                   static_cast<uint16_t>(statusWord)));
48                     }
49 
50                     faultFound = true;
51                     inputFault = true;
52                 }
53 
54                 if (statusWord & status_word::MFR_SPECIFIC_FAULT)
55                 {
56                     if (!mfrFault)
57                     {
58                         log<level::INFO>(
59                             "MFRSPECIFIC fault",
60                             entry("STATUS_WORD=0x%04X",
61                                   static_cast<uint16_t>(statusWord)));
62                     }
63                     faultFound = true;
64                     mfrFault = true;
65                 }
66 
67                 if (statusWord & status_word::VIN_UV_FAULT)
68                 {
69                     if (!vinUVFault)
70                     {
71                         log<level::INFO>(
72                             "VIN_UV fault",
73                             entry("STATUS_WORD=0x%04X",
74                                   static_cast<uint16_t>(statusWord)));
75                     }
76 
77                     faultFound = true;
78                     vinUVFault = true;
79                 }
80             }
81             else
82             {
83                 faultFound = false;
84                 inputFault = false;
85                 mfrFault = false;
86                 vinUVFault = false;
87             }
88         }
89         catch (ReadFailure& e)
90         {
91             phosphor::logging::commit<ReadFailure>();
92         }
93     }
94 }
95 
96 void PowerSupply::inventoryChanged(sdbusplus::message::message& msg)
97 {
98     std::string msgSensor;
99     std::map<std::string, sdbusplus::message::variant<uint32_t, bool>> msgData;
100     msg.read(msgSensor, msgData);
101 
102     // Check if it was the Present property that changed.
103     auto valPropMap = msgData.find(PRESENT_PROP);
104     if (valPropMap != msgData.end())
105     {
106         if (std::get<bool>(valPropMap->second))
107         {
108             present = true;
109             clearFaults();
110         }
111         else
112         {
113             present = false;
114 
115             // Clear out the now outdated inventory properties
116             updateInventory();
117         }
118     }
119 }
120 
121 } // namespace phosphor::power::psu
122