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