140247cceSAndy YF Wang #pragma once
240247cceSAndy YF Wang 
340247cceSAndy YF Wang #include "device.hpp"
440247cceSAndy YF Wang #include "pmbus.hpp"
540247cceSAndy YF Wang #include "tools/i2c/i2c_interface.hpp"
640247cceSAndy YF Wang 
740247cceSAndy YF Wang #include <sdbusplus/bus.hpp>
840247cceSAndy YF Wang 
940247cceSAndy YF Wang #include <algorithm>
1040247cceSAndy YF Wang #include <filesystem>
1140247cceSAndy YF Wang 
1240247cceSAndy YF Wang namespace phosphor
1340247cceSAndy YF Wang {
1440247cceSAndy YF Wang namespace power
1540247cceSAndy YF Wang {
1640247cceSAndy YF Wang 
1740247cceSAndy YF Wang /**
1840247cceSAndy YF Wang  * @class MihawkCPLD
1940247cceSAndy YF Wang  *
2040247cceSAndy YF Wang  * This class implements fault analysis for Mihawk's CPLD
2140247cceSAndy YF Wang  * power sequencer device.
2240247cceSAndy YF Wang  *
2340247cceSAndy YF Wang  */
2440247cceSAndy YF Wang class MihawkCPLD : public Device
2540247cceSAndy YF Wang {
2640247cceSAndy YF Wang   public:
2740247cceSAndy YF Wang     MihawkCPLD() = delete;
2840247cceSAndy YF Wang     ~MihawkCPLD() = default;
2940247cceSAndy YF Wang     MihawkCPLD(const MihawkCPLD&) = delete;
3040247cceSAndy YF Wang     MihawkCPLD& operator=(const MihawkCPLD&) = delete;
3140247cceSAndy YF Wang     MihawkCPLD(MihawkCPLD&&) = default;
3240247cceSAndy YF Wang     MihawkCPLD& operator=(MihawkCPLD&&) = default;
3340247cceSAndy YF Wang 
3440247cceSAndy YF Wang     /**
3540247cceSAndy YF Wang      * Constructor
3640247cceSAndy YF Wang      *
3740247cceSAndy YF Wang      * @param[in] instance - the device instance number
3840247cceSAndy YF Wang      * @param[in] bus - D-Bus bus object
3940247cceSAndy YF Wang      */
407354ce62SPatrick Williams     MihawkCPLD(size_t instance, sdbusplus::bus_t& bus);
4140247cceSAndy YF Wang 
4240247cceSAndy YF Wang     /**
4340247cceSAndy YF Wang      * Analyzes the device for errors when the device is
4440247cceSAndy YF Wang      * known to be in an error state.  A log will be created.
4540247cceSAndy YF Wang      */
4640247cceSAndy YF Wang     void onFailure() override;
4740247cceSAndy YF Wang 
4840247cceSAndy YF Wang     /**
4940247cceSAndy YF Wang      * Checks the device for errors and only creates a log
5040247cceSAndy YF Wang      * if one is found.
5140247cceSAndy YF Wang      */
5240247cceSAndy YF Wang     void analyze() override;
5340247cceSAndy YF Wang 
5440247cceSAndy YF Wang     /**
5540247cceSAndy YF Wang      * Clears faults in the device
5640247cceSAndy YF Wang      */
clearFaults()57*48781aefSPatrick Williams     void clearFaults() override {}
5840247cceSAndy YF Wang 
5940247cceSAndy YF Wang   private:
6040247cceSAndy YF Wang     /**
6140247cceSAndy YF Wang      * If checkPoweronFault() or checkPowerreadyFault()
6240247cceSAndy YF Wang      * returns "true", use readFromCPLDErrorCode()
6340247cceSAndy YF Wang      * to read CPLD-error-code-register
6440247cceSAndy YF Wang      * to analyze the fail reason.
6540247cceSAndy YF Wang      *
6640247cceSAndy YF Wang      * @param[in] statusReg - I2C's statusReg, slaveAddr
6740247cceSAndy YF Wang      * offset.
6840247cceSAndy YF Wang      * ex.Mihawk's CPLD-register is on slaveAddr ox40 of
6940247cceSAndy YF Wang      * i2c-11, but poweron_errcode-register is on slaveAddr
7040247cceSAndy YF Wang      * offset 0x21, power_ready-errorcode-register is on
7140247cceSAndy YF Wang      * slaveAddr offset 0x22.
7240247cceSAndy YF Wang      *
7340247cceSAndy YF Wang      * @return int - the error-code value which is read on
7440247cceSAndy YF Wang      * CPLD-error-code-register.
7540247cceSAndy YF Wang      */
7640247cceSAndy YF Wang     int readFromCPLDErrorCode(int statusReg);
7740247cceSAndy YF Wang 
7840247cceSAndy YF Wang     /**
7940247cceSAndy YF Wang      * Checks for PoweronFault on Mihawk's
8040247cceSAndy YF Wang      * CPLD-power_on-error-interrupt-bit-register
8140247cceSAndy YF Wang      * whether is transfered to "1".
8240247cceSAndy YF Wang      *
8340247cceSAndy YF Wang      * @return bool - true if power_on fail.
8440247cceSAndy YF Wang      */
8540247cceSAndy YF Wang     bool checkPoweronFault();
8640247cceSAndy YF Wang 
8740247cceSAndy YF Wang     /**
8840247cceSAndy YF Wang      * Clear CPLD intrupt record after reading CPLD_register.
8940247cceSAndy YF Wang      */
9040247cceSAndy YF Wang     void clearCPLDregister();
9140247cceSAndy YF Wang 
9240247cceSAndy YF Wang     /**
9340247cceSAndy YF Wang      * Check for PowerreadyFault on Mihawk's
9440247cceSAndy YF Wang      * CPLD-power_ready-error-interrupt-bit-register
9540247cceSAndy YF Wang      * whether is transfered to "1".
9640247cceSAndy YF Wang      *
9740247cceSAndy YF Wang      * @return bool - true if power_ready fail.
9840247cceSAndy YF Wang      */
9940247cceSAndy YF Wang     bool checkPowerreadyFault();
10040247cceSAndy YF Wang 
10140247cceSAndy YF Wang     /**
10240247cceSAndy YF Wang      * Use I2CInterface to read & write CPLD_register.
10340247cceSAndy YF Wang      */
10440247cceSAndy YF Wang     std::unique_ptr<i2c::I2CInterface> i2c;
10540247cceSAndy YF Wang 
10640247cceSAndy YF Wang     /**
10740247cceSAndy YF Wang      * The D-Bus bus object
10840247cceSAndy YF Wang      */
1097354ce62SPatrick Williams     sdbusplus::bus_t& bus;
11040247cceSAndy YF Wang 
11140247cceSAndy YF Wang     /**
11240247cceSAndy YF Wang      * Open CPLD_register via i2c.
11340247cceSAndy YF Wang      */
11440247cceSAndy YF Wang     void openCPLDDevice();
11540247cceSAndy YF Wang 
11640247cceSAndy YF Wang     /**
11740247cceSAndy YF Wang      * The parameter which is checked CPLD's the same error
11840247cceSAndy YF Wang      * whether is created again.
11940247cceSAndy YF Wang      */
12040247cceSAndy YF Wang     bool errorcodeMask;
12140247cceSAndy YF Wang 
12240247cceSAndy YF Wang     enum class ErrorCode : int
12340247cceSAndy YF Wang     {
12440247cceSAndy YF Wang         /**
12540247cceSAndy YF Wang          * All of powerOnErrorcode are the definition of error-code
12640247cceSAndy YF Wang          * which are read on CPLD-error-code-register.
12740247cceSAndy YF Wang          */
12840247cceSAndy YF Wang         /**
12940247cceSAndy YF Wang          * The definition of error-code:
13040247cceSAndy YF Wang          * Read CPLD-error-code-register fail.
13140247cceSAndy YF Wang          */
13240247cceSAndy YF Wang         _0 = 0,
13340247cceSAndy YF Wang 
13440247cceSAndy YF Wang         /**
13540247cceSAndy YF Wang          * The definition of error-code:
13640247cceSAndy YF Wang          * PSU0_PGOOD fail.
13740247cceSAndy YF Wang          */
13840247cceSAndy YF Wang         _1 = 1,
13940247cceSAndy YF Wang 
14040247cceSAndy YF Wang         /**
14140247cceSAndy YF Wang          * The definition of error-code:
14240247cceSAndy YF Wang          * PSU1_PGOOD fail.
14340247cceSAndy YF Wang          */
14440247cceSAndy YF Wang         _2 = 2,
14540247cceSAndy YF Wang 
14640247cceSAndy YF Wang         /**
14740247cceSAndy YF Wang          * The definition of error-code:
14840247cceSAndy YF Wang          * 240Va_Fault_A fail.
14940247cceSAndy YF Wang          */
15040247cceSAndy YF Wang         _3 = 3,
15140247cceSAndy YF Wang 
15240247cceSAndy YF Wang         /**
15340247cceSAndy YF Wang          * The definition of error-code:
15440247cceSAndy YF Wang          * 240Va_Fault_B fail.
15540247cceSAndy YF Wang          */
15640247cceSAndy YF Wang         _4 = 4,
15740247cceSAndy YF Wang 
15840247cceSAndy YF Wang         /**
15940247cceSAndy YF Wang          * The definition of error-code:
16040247cceSAndy YF Wang          * 240Va_Fault_C fail.
16140247cceSAndy YF Wang          */
16240247cceSAndy YF Wang         _5 = 5,
16340247cceSAndy YF Wang 
16440247cceSAndy YF Wang         /**
16540247cceSAndy YF Wang          * The definition of error-code:
16640247cceSAndy YF Wang          * 240Va_Fault_D fail.
16740247cceSAndy YF Wang          */
16840247cceSAndy YF Wang         _6 = 6,
16940247cceSAndy YF Wang 
17040247cceSAndy YF Wang         /**
17140247cceSAndy YF Wang          * The definition of error-code:
17240247cceSAndy YF Wang          * 240Va_Fault_E fail.
17340247cceSAndy YF Wang          */
17440247cceSAndy YF Wang         _7 = 7,
17540247cceSAndy YF Wang 
17640247cceSAndy YF Wang         /**
17740247cceSAndy YF Wang          * The definition of error-code:
17840247cceSAndy YF Wang          * 240Va_Fault_F fail.
17940247cceSAndy YF Wang          */
18040247cceSAndy YF Wang         _8 = 8,
18140247cceSAndy YF Wang 
18240247cceSAndy YF Wang         /**
18340247cceSAndy YF Wang          * The definition of error-code:
18440247cceSAndy YF Wang          * 240Va_Fault_G fail.
18540247cceSAndy YF Wang          */
18640247cceSAndy YF Wang         _9 = 9,
18740247cceSAndy YF Wang 
18840247cceSAndy YF Wang         /**
18940247cceSAndy YF Wang          * The definition of error-code:
19040247cceSAndy YF Wang          * 240Va_Fault_H fail.
19140247cceSAndy YF Wang          */
19240247cceSAndy YF Wang         _10 = 10,
19340247cceSAndy YF Wang 
19440247cceSAndy YF Wang         /**
19540247cceSAndy YF Wang          * The definition of error-code:
19640247cceSAndy YF Wang          * 240Va_Fault_J fail.
19740247cceSAndy YF Wang          */
19840247cceSAndy YF Wang         _11 = 11,
19940247cceSAndy YF Wang 
20040247cceSAndy YF Wang         /**
20140247cceSAndy YF Wang          * The definition of error-code:
20240247cceSAndy YF Wang          * 240Va_Fault_K fail.
20340247cceSAndy YF Wang          */
20440247cceSAndy YF Wang         _12 = 12,
20540247cceSAndy YF Wang 
20640247cceSAndy YF Wang         /**
20740247cceSAndy YF Wang          * The definition of error-code:
20840247cceSAndy YF Wang          * 240Va_Fault_L fail.
20940247cceSAndy YF Wang          */
21040247cceSAndy YF Wang         _13 = 13,
21140247cceSAndy YF Wang 
21240247cceSAndy YF Wang         /**
21340247cceSAndy YF Wang          * The definition of error-code:
21440247cceSAndy YF Wang          * P5V_PGOOD fail.
21540247cceSAndy YF Wang          */
21640247cceSAndy YF Wang         _14 = 14,
21740247cceSAndy YF Wang 
21840247cceSAndy YF Wang         /**
21940247cceSAndy YF Wang          * The definition of error-code:
22040247cceSAndy YF Wang          * P3V3_PGOOD fail.
22140247cceSAndy YF Wang          */
22240247cceSAndy YF Wang         _15 = 15,
22340247cceSAndy YF Wang 
22440247cceSAndy YF Wang         /**
22540247cceSAndy YF Wang          * The definition of error-code:
22640247cceSAndy YF Wang          * P1V8_PGOOD fail.
22740247cceSAndy YF Wang          */
22840247cceSAndy YF Wang         _16 = 16,
22940247cceSAndy YF Wang 
23040247cceSAndy YF Wang         /**
23140247cceSAndy YF Wang          * The definition of error-code:
23240247cceSAndy YF Wang          * P1V1_PGOOD fail.
23340247cceSAndy YF Wang          */
23440247cceSAndy YF Wang         _17 = 17,
23540247cceSAndy YF Wang 
23640247cceSAndy YF Wang         /**
23740247cceSAndy YF Wang          * The definition of error-code:
23840247cceSAndy YF Wang          * P0V9_PGOOD fail.
23940247cceSAndy YF Wang          */
24040247cceSAndy YF Wang         _18 = 18,
24140247cceSAndy YF Wang 
24240247cceSAndy YF Wang         /**
24340247cceSAndy YF Wang          * The definition of error-code:
24440247cceSAndy YF Wang          * P2V5A_PGOOD fail.
24540247cceSAndy YF Wang          */
24640247cceSAndy YF Wang         _19 = 19,
24740247cceSAndy YF Wang 
24840247cceSAndy YF Wang         /**
24940247cceSAndy YF Wang          * The definition of error-code:
25040247cceSAndy YF Wang          * P2V5B_PGOOD fail.
25140247cceSAndy YF Wang          */
25240247cceSAndy YF Wang         _20 = 20,
25340247cceSAndy YF Wang 
25440247cceSAndy YF Wang         /**
25540247cceSAndy YF Wang          * The definition of error-code:
25640247cceSAndy YF Wang          * Vdn0_PGOOD fail.
25740247cceSAndy YF Wang          */
25840247cceSAndy YF Wang         _21 = 21,
25940247cceSAndy YF Wang 
26040247cceSAndy YF Wang         /**
26140247cceSAndy YF Wang          * The definition of error-code:
26240247cceSAndy YF Wang          * Vdn1_PGOOD fail.
26340247cceSAndy YF Wang          */
26440247cceSAndy YF Wang         _22 = 22,
26540247cceSAndy YF Wang 
26640247cceSAndy YF Wang         /**
26740247cceSAndy YF Wang          * The definition of error-code:
26840247cceSAndy YF Wang          * P1V5_PGOOD fail.
26940247cceSAndy YF Wang          */
27040247cceSAndy YF Wang         _23 = 23,
27140247cceSAndy YF Wang 
27240247cceSAndy YF Wang         /**
27340247cceSAndy YF Wang          * The definition of error-code:
27440247cceSAndy YF Wang          * Vio0_PGOOD fail.
27540247cceSAndy YF Wang          */
27640247cceSAndy YF Wang         _24 = 24,
27740247cceSAndy YF Wang 
27840247cceSAndy YF Wang         /**
27940247cceSAndy YF Wang          * The definition of error-code:
28040247cceSAndy YF Wang          * Vio1_PGOOD fail.
28140247cceSAndy YF Wang          */
28240247cceSAndy YF Wang         _25 = 25,
28340247cceSAndy YF Wang 
28440247cceSAndy YF Wang         /**
28540247cceSAndy YF Wang          * The definition of error-code:
28640247cceSAndy YF Wang          * Vdd0_PGOOD fail.
28740247cceSAndy YF Wang          */
28840247cceSAndy YF Wang         _26 = 26,
28940247cceSAndy YF Wang 
29040247cceSAndy YF Wang         /**
29140247cceSAndy YF Wang          * The definition of error-code:
29240247cceSAndy YF Wang          * Vcs0_PGOOD fail.
29340247cceSAndy YF Wang          */
29440247cceSAndy YF Wang         _27 = 27,
29540247cceSAndy YF Wang 
29640247cceSAndy YF Wang         /**
29740247cceSAndy YF Wang          * The definition of error-code:
29840247cceSAndy YF Wang          * Vdd1_PGOOD fail.
29940247cceSAndy YF Wang          */
30040247cceSAndy YF Wang         _28 = 28,
30140247cceSAndy YF Wang 
30240247cceSAndy YF Wang         /**
30340247cceSAndy YF Wang          * The definition of error-code:
30440247cceSAndy YF Wang          * Vcs1_PGOOD fail.
30540247cceSAndy YF Wang          */
30640247cceSAndy YF Wang         _29 = 29,
30740247cceSAndy YF Wang 
30840247cceSAndy YF Wang         /**
30940247cceSAndy YF Wang          * The definition of error-code:
31040247cceSAndy YF Wang          * Vddr0_PGOOD fail.
31140247cceSAndy YF Wang          */
31240247cceSAndy YF Wang         _30 = 30,
31340247cceSAndy YF Wang 
31440247cceSAndy YF Wang         /**
31540247cceSAndy YF Wang          * The definition of error-code:
31640247cceSAndy YF Wang          * Vtt0_PGOOD fail.
31740247cceSAndy YF Wang          */
31840247cceSAndy YF Wang         _31 = 31,
31940247cceSAndy YF Wang 
32040247cceSAndy YF Wang         /**
32140247cceSAndy YF Wang          * The definition of error-code:
32240247cceSAndy YF Wang          * Vddr1_PGOOD fail.
32340247cceSAndy YF Wang          */
32440247cceSAndy YF Wang         _32 = 32,
32540247cceSAndy YF Wang 
32640247cceSAndy YF Wang         /**
32740247cceSAndy YF Wang          * The definition of error-code:
32840247cceSAndy YF Wang          * Vtt1_PGOOD fail.
32940247cceSAndy YF Wang          */
33040247cceSAndy YF Wang         _33 = 33,
33140247cceSAndy YF Wang 
33240247cceSAndy YF Wang         /**
33340247cceSAndy YF Wang          * The definition of error-code:
33440247cceSAndy YF Wang          * GPU0_PGOOD fail.
33540247cceSAndy YF Wang          */
33640247cceSAndy YF Wang         _34 = 34,
33740247cceSAndy YF Wang 
33840247cceSAndy YF Wang         /**
33940247cceSAndy YF Wang          * The definition of error-code:
34040247cceSAndy YF Wang          * GPU1_PGOOD fail.
34140247cceSAndy YF Wang          */
34240247cceSAndy YF Wang         _35 = 35,
34340247cceSAndy YF Wang 
34440247cceSAndy YF Wang         /**
34540247cceSAndy YF Wang          * The definition of error-code:
34640247cceSAndy YF Wang          * PSU0PSU1_PGOOD fail.
34740247cceSAndy YF Wang          */
34840247cceSAndy YF Wang         _36 = 170
34940247cceSAndy YF Wang     };
35040247cceSAndy YF Wang };
35140247cceSAndy YF Wang 
35240247cceSAndy YF Wang } // namespace power
35340247cceSAndy YF Wang } // namespace phosphor
354