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