#pragma once #include "device.hpp" #include "pmbus.hpp" #include "tools/i2c/i2c_interface.hpp" #include #include #include namespace phosphor { namespace power { /** * @class MihawkCPLD * * This class implements fault analysis for Mihawk's CPLD * power sequencer device. * */ class MihawkCPLD : public Device { public: MihawkCPLD() = delete; ~MihawkCPLD() = default; MihawkCPLD(const MihawkCPLD&) = delete; MihawkCPLD& operator=(const MihawkCPLD&) = delete; MihawkCPLD(MihawkCPLD&&) = default; MihawkCPLD& operator=(MihawkCPLD&&) = default; /** * Constructor * * @param[in] instance - the device instance number * @param[in] bus - D-Bus bus object */ MihawkCPLD(size_t instance, sdbusplus::bus_t& bus); /** * Analyzes the device for errors when the device is * known to be in an error state. A log will be created. */ void onFailure() override; /** * Checks the device for errors and only creates a log * if one is found. */ void analyze() override; /** * Clears faults in the device */ void clearFaults() override {} private: /** * If checkPoweronFault() or checkPowerreadyFault() * returns "true", use readFromCPLDErrorCode() * to read CPLD-error-code-register * to analyze the fail reason. * * @param[in] statusReg - I2C's statusReg, slaveAddr * offset. * ex.Mihawk's CPLD-register is on slaveAddr ox40 of * i2c-11, but poweron_errcode-register is on slaveAddr * offset 0x21, power_ready-errorcode-register is on * slaveAddr offset 0x22. * * @return int - the error-code value which is read on * CPLD-error-code-register. */ int readFromCPLDErrorCode(int statusReg); /** * Checks for PoweronFault on Mihawk's * CPLD-power_on-error-interrupt-bit-register * whether is transfered to "1". * * @return bool - true if power_on fail. */ bool checkPoweronFault(); /** * Clear CPLD intrupt record after reading CPLD_register. */ void clearCPLDregister(); /** * Check for PowerreadyFault on Mihawk's * CPLD-power_ready-error-interrupt-bit-register * whether is transfered to "1". * * @return bool - true if power_ready fail. */ bool checkPowerreadyFault(); /** * Use I2CInterface to read & write CPLD_register. */ std::unique_ptr i2c; /** * The D-Bus bus object */ sdbusplus::bus_t& bus; /** * Open CPLD_register via i2c. */ void openCPLDDevice(); /** * The parameter which is checked CPLD's the same error * whether is created again. */ bool errorcodeMask; enum class ErrorCode : int { /** * All of powerOnErrorcode are the definition of error-code * which are read on CPLD-error-code-register. */ /** * The definition of error-code: * Read CPLD-error-code-register fail. */ _0 = 0, /** * The definition of error-code: * PSU0_PGOOD fail. */ _1 = 1, /** * The definition of error-code: * PSU1_PGOOD fail. */ _2 = 2, /** * The definition of error-code: * 240Va_Fault_A fail. */ _3 = 3, /** * The definition of error-code: * 240Va_Fault_B fail. */ _4 = 4, /** * The definition of error-code: * 240Va_Fault_C fail. */ _5 = 5, /** * The definition of error-code: * 240Va_Fault_D fail. */ _6 = 6, /** * The definition of error-code: * 240Va_Fault_E fail. */ _7 = 7, /** * The definition of error-code: * 240Va_Fault_F fail. */ _8 = 8, /** * The definition of error-code: * 240Va_Fault_G fail. */ _9 = 9, /** * The definition of error-code: * 240Va_Fault_H fail. */ _10 = 10, /** * The definition of error-code: * 240Va_Fault_J fail. */ _11 = 11, /** * The definition of error-code: * 240Va_Fault_K fail. */ _12 = 12, /** * The definition of error-code: * 240Va_Fault_L fail. */ _13 = 13, /** * The definition of error-code: * P5V_PGOOD fail. */ _14 = 14, /** * The definition of error-code: * P3V3_PGOOD fail. */ _15 = 15, /** * The definition of error-code: * P1V8_PGOOD fail. */ _16 = 16, /** * The definition of error-code: * P1V1_PGOOD fail. */ _17 = 17, /** * The definition of error-code: * P0V9_PGOOD fail. */ _18 = 18, /** * The definition of error-code: * P2V5A_PGOOD fail. */ _19 = 19, /** * The definition of error-code: * P2V5B_PGOOD fail. */ _20 = 20, /** * The definition of error-code: * Vdn0_PGOOD fail. */ _21 = 21, /** * The definition of error-code: * Vdn1_PGOOD fail. */ _22 = 22, /** * The definition of error-code: * P1V5_PGOOD fail. */ _23 = 23, /** * The definition of error-code: * Vio0_PGOOD fail. */ _24 = 24, /** * The definition of error-code: * Vio1_PGOOD fail. */ _25 = 25, /** * The definition of error-code: * Vdd0_PGOOD fail. */ _26 = 26, /** * The definition of error-code: * Vcs0_PGOOD fail. */ _27 = 27, /** * The definition of error-code: * Vdd1_PGOOD fail. */ _28 = 28, /** * The definition of error-code: * Vcs1_PGOOD fail. */ _29 = 29, /** * The definition of error-code: * Vddr0_PGOOD fail. */ _30 = 30, /** * The definition of error-code: * Vtt0_PGOOD fail. */ _31 = 31, /** * The definition of error-code: * Vddr1_PGOOD fail. */ _32 = 32, /** * The definition of error-code: * Vtt1_PGOOD fail. */ _33 = 33, /** * The definition of error-code: * GPU0_PGOOD fail. */ _34 = 34, /** * The definition of error-code: * GPU1_PGOOD fail. */ _35 = 35, /** * The definition of error-code: * PSU0PSU1_PGOOD fail. */ _36 = 170 }; }; } // namespace power } // namespace phosphor