1 #pragma once
2 
3 #include "device.hpp"
4 #include "pmbus.hpp"
5 #include "tools/i2c/i2c_interface.hpp"
6 
7 #include <sdbusplus/bus.hpp>
8 
9 #include <algorithm>
10 #include <filesystem>
11 
12 namespace phosphor
13 {
14 namespace power
15 {
16 
17 /**
18  * @class MihawkCPLD
19  *
20  * This class implements fault analysis for Mihawk's CPLD
21  * power sequencer device.
22  *
23  */
24 class MihawkCPLD : public Device
25 {
26   public:
27     MihawkCPLD() = delete;
28     ~MihawkCPLD() = default;
29     MihawkCPLD(const MihawkCPLD&) = delete;
30     MihawkCPLD& operator=(const MihawkCPLD&) = delete;
31     MihawkCPLD(MihawkCPLD&&) = default;
32     MihawkCPLD& operator=(MihawkCPLD&&) = default;
33 
34     /**
35      * Constructor
36      *
37      * @param[in] instance - the device instance number
38      * @param[in] bus - D-Bus bus object
39      */
40     MihawkCPLD(size_t instance, sdbusplus::bus::bus& bus);
41 
42     /**
43      * Analyzes the device for errors when the device is
44      * known to be in an error state.  A log will be created.
45      */
46     void onFailure() override;
47 
48     /**
49      * Checks the device for errors and only creates a log
50      * if one is found.
51      */
52     void analyze() override;
53 
54     /**
55      * Clears faults in the device
56      */
57     void clearFaults() override
58     {
59     }
60 
61   private:
62     /**
63      * If checkPoweronFault() or checkPowerreadyFault()
64      * returns "true", use readFromCPLDErrorCode()
65      * to read CPLD-error-code-register
66      * to analyze the fail reason.
67      *
68      * @param[in] statusReg - I2C's statusReg, slaveAddr
69      * offset.
70      * ex.Mihawk's CPLD-register is on slaveAddr ox40 of
71      * i2c-11, but poweron_errcode-register is on slaveAddr
72      * offset 0x21, power_ready-errorcode-register is on
73      * slaveAddr offset 0x22.
74      *
75      * @return int - the error-code value which is read on
76      * CPLD-error-code-register.
77      */
78     int readFromCPLDErrorCode(int statusReg);
79 
80     /**
81      * Checks for PoweronFault on Mihawk's
82      * CPLD-power_on-error-interrupt-bit-register
83      * whether is transfered to "1".
84      *
85      * @return bool - true if power_on fail.
86      */
87     bool checkPoweronFault();
88 
89     /**
90      * Clear CPLD intrupt record after reading CPLD_register.
91      */
92     void clearCPLDregister();
93 
94     /**
95      * Check for PowerreadyFault on Mihawk's
96      * CPLD-power_ready-error-interrupt-bit-register
97      * whether is transfered to "1".
98      *
99      * @return bool - true if power_ready fail.
100      */
101     bool checkPowerreadyFault();
102 
103     /**
104      * Use I2CInterface to read & write CPLD_register.
105      */
106     std::unique_ptr<i2c::I2CInterface> i2c;
107 
108     /**
109      * The D-Bus bus object
110      */
111     sdbusplus::bus::bus& bus;
112 
113     /**
114      * Open CPLD_register via i2c.
115      */
116     void openCPLDDevice();
117 
118     /**
119      * The parameter which is checked CPLD's the same error
120      * whether is created again.
121      */
122     bool errorcodeMask;
123 
124     enum class ErrorCode : int
125     {
126         /**
127          * All of powerOnErrorcode are the definition of error-code
128          * which are read on CPLD-error-code-register.
129          */
130         /**
131          * The definition of error-code:
132          * Read CPLD-error-code-register fail.
133          */
134         _0 = 0,
135 
136         /**
137          * The definition of error-code:
138          * PSU0_PGOOD fail.
139          */
140         _1 = 1,
141 
142         /**
143          * The definition of error-code:
144          * PSU1_PGOOD fail.
145          */
146         _2 = 2,
147 
148         /**
149          * The definition of error-code:
150          * 240Va_Fault_A fail.
151          */
152         _3 = 3,
153 
154         /**
155          * The definition of error-code:
156          * 240Va_Fault_B fail.
157          */
158         _4 = 4,
159 
160         /**
161          * The definition of error-code:
162          * 240Va_Fault_C fail.
163          */
164         _5 = 5,
165 
166         /**
167          * The definition of error-code:
168          * 240Va_Fault_D fail.
169          */
170         _6 = 6,
171 
172         /**
173          * The definition of error-code:
174          * 240Va_Fault_E fail.
175          */
176         _7 = 7,
177 
178         /**
179          * The definition of error-code:
180          * 240Va_Fault_F fail.
181          */
182         _8 = 8,
183 
184         /**
185          * The definition of error-code:
186          * 240Va_Fault_G fail.
187          */
188         _9 = 9,
189 
190         /**
191          * The definition of error-code:
192          * 240Va_Fault_H fail.
193          */
194         _10 = 10,
195 
196         /**
197          * The definition of error-code:
198          * 240Va_Fault_J fail.
199          */
200         _11 = 11,
201 
202         /**
203          * The definition of error-code:
204          * 240Va_Fault_K fail.
205          */
206         _12 = 12,
207 
208         /**
209          * The definition of error-code:
210          * 240Va_Fault_L fail.
211          */
212         _13 = 13,
213 
214         /**
215          * The definition of error-code:
216          * P5V_PGOOD fail.
217          */
218         _14 = 14,
219 
220         /**
221          * The definition of error-code:
222          * P3V3_PGOOD fail.
223          */
224         _15 = 15,
225 
226         /**
227          * The definition of error-code:
228          * P1V8_PGOOD fail.
229          */
230         _16 = 16,
231 
232         /**
233          * The definition of error-code:
234          * P1V1_PGOOD fail.
235          */
236         _17 = 17,
237 
238         /**
239          * The definition of error-code:
240          * P0V9_PGOOD fail.
241          */
242         _18 = 18,
243 
244         /**
245          * The definition of error-code:
246          * P2V5A_PGOOD fail.
247          */
248         _19 = 19,
249 
250         /**
251          * The definition of error-code:
252          * P2V5B_PGOOD fail.
253          */
254         _20 = 20,
255 
256         /**
257          * The definition of error-code:
258          * Vdn0_PGOOD fail.
259          */
260         _21 = 21,
261 
262         /**
263          * The definition of error-code:
264          * Vdn1_PGOOD fail.
265          */
266         _22 = 22,
267 
268         /**
269          * The definition of error-code:
270          * P1V5_PGOOD fail.
271          */
272         _23 = 23,
273 
274         /**
275          * The definition of error-code:
276          * Vio0_PGOOD fail.
277          */
278         _24 = 24,
279 
280         /**
281          * The definition of error-code:
282          * Vio1_PGOOD fail.
283          */
284         _25 = 25,
285 
286         /**
287          * The definition of error-code:
288          * Vdd0_PGOOD fail.
289          */
290         _26 = 26,
291 
292         /**
293          * The definition of error-code:
294          * Vcs0_PGOOD fail.
295          */
296         _27 = 27,
297 
298         /**
299          * The definition of error-code:
300          * Vdd1_PGOOD fail.
301          */
302         _28 = 28,
303 
304         /**
305          * The definition of error-code:
306          * Vcs1_PGOOD fail.
307          */
308         _29 = 29,
309 
310         /**
311          * The definition of error-code:
312          * Vddr0_PGOOD fail.
313          */
314         _30 = 30,
315 
316         /**
317          * The definition of error-code:
318          * Vtt0_PGOOD fail.
319          */
320         _31 = 31,
321 
322         /**
323          * The definition of error-code:
324          * Vddr1_PGOOD fail.
325          */
326         _32 = 32,
327 
328         /**
329          * The definition of error-code:
330          * Vtt1_PGOOD fail.
331          */
332         _33 = 33,
333 
334         /**
335          * The definition of error-code:
336          * GPU0_PGOOD fail.
337          */
338         _34 = 34,
339 
340         /**
341          * The definition of error-code:
342          * GPU1_PGOOD fail.
343          */
344         _35 = 35,
345 
346         /**
347          * The definition of error-code:
348          * PSU0PSU1_PGOOD fail.
349          */
350         _36 = 170
351     };
352 };
353 
354 } // namespace power
355 } // namespace phosphor
356