blob: 7adf09e341f2d58830dc85a36cdfc2ef0e93dece [file] [log] [blame]
#pragma once
#include "device.hpp"
#include "pmbus.hpp"
#include "tools/i2c/i2c_interface.hpp"
#include <sdbusplus/bus.hpp>
#include <algorithm>
#include <filesystem>
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::I2CInterface> 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