#include "config.h"

#include "mihawk-cpld.hpp"

#include "gpio.hpp"
#include "utility.hpp"

#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include <elog-errors.hpp>
#include <org/open_power/Witherspoon/Fault/error.hpp>
#include <phosphor-logging/elog.hpp>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/Common/Device/error.hpp>

#include <chrono>
#include <iostream>
#include <map>
#include <memory>
#include <string>

// i2c bus & i2c slave address of Mihawk's CPLD_register
static constexpr uint8_t busId = 11;
static constexpr uint8_t slaveAddr = 0x40;

// SMLink Status Register(PSU status Register)
static constexpr size_t StatusReg_0 = 0x05;

// SMLink Status Register(Interrupt-control-bit Register)
static constexpr size_t StatusReg_1 = 0x20;

// SMLink Status Register(Power-on error code Register)
static constexpr size_t StatusReg_2 = 0x21;

// SMLink Status Register(Power-ready error code Register)
static constexpr size_t StatusReg_3 = 0x22;

using namespace std;

namespace phosphor
{
namespace power
{
const auto DEVICE_NAME = "MihawkCPLD"s;

namespace fs = std::filesystem;
using namespace phosphor::logging;

using namespace sdbusplus::org::open_power::Witherspoon::Fault::Error;

MihawkCPLD::MihawkCPLD(size_t instance, sdbusplus::bus::bus& bus) :
    Device(DEVICE_NAME, instance), bus(bus)
{}

void MihawkCPLD::onFailure()
{
    bool poweronError = checkPoweronFault();

    // If the interrupt of power_on_error is switch on,
    // read CPLD_register error code to analyze
    // and report the error log event.
    if (poweronError)
    {
        ErrorCode code;
        code = static_cast<ErrorCode>(readFromCPLDErrorCode(StatusReg_2));

        switch (code)
        {
            case ErrorCode::_1:
                report<ErrorCode1>();
                break;
            case ErrorCode::_2:
                report<ErrorCode2>();
                break;
            case ErrorCode::_3:
                report<ErrorCode3>();
                break;
            case ErrorCode::_4:
                report<ErrorCode4>();
                break;
            case ErrorCode::_5:
                report<ErrorCode5>();
                break;
            case ErrorCode::_6:
                report<ErrorCode6>();
                break;
            case ErrorCode::_7:
                report<ErrorCode7>();
                break;
            case ErrorCode::_8:
                report<ErrorCode8>();
                break;
            case ErrorCode::_9:
                report<ErrorCode9>();
                break;
            case ErrorCode::_10:
                report<ErrorCode10>();
                break;
            case ErrorCode::_11:
                report<ErrorCode11>();
                break;
            case ErrorCode::_12:
                report<ErrorCode12>();
                break;
            case ErrorCode::_13:
                report<ErrorCode13>();
                break;
            case ErrorCode::_14:
                report<ErrorCode14>();
                break;
            case ErrorCode::_15:
                report<ErrorCode15>();
                break;
            case ErrorCode::_16:
                report<ErrorCode16>();
                break;
            case ErrorCode::_17:
                report<ErrorCode17>();
                break;
            case ErrorCode::_18:
                report<ErrorCode18>();
                break;
            case ErrorCode::_19:
                report<ErrorCode19>();
                break;
            case ErrorCode::_20:
                report<ErrorCode20>();
                break;
            case ErrorCode::_21:
                report<ErrorCode21>();
                break;
            case ErrorCode::_22:
                report<ErrorCode22>();
                break;
            case ErrorCode::_23:
                report<ErrorCode23>();
                break;
            case ErrorCode::_24:
                report<ErrorCode24>();
                break;
            case ErrorCode::_25:
                report<ErrorCode25>();
                break;
            case ErrorCode::_26:
                report<ErrorCode26>();
                break;
            case ErrorCode::_27:
                report<ErrorCode27>();
                break;
            case ErrorCode::_28:
                report<ErrorCode28>();
                break;
            case ErrorCode::_29:
                report<ErrorCode29>();
                break;
            case ErrorCode::_30:
                report<ErrorCode30>();
                break;
            case ErrorCode::_31:
                report<ErrorCode31>();
                break;
            case ErrorCode::_32:
                report<ErrorCode32>();
                break;
            case ErrorCode::_33:
                report<ErrorCode33>();
                break;
            case ErrorCode::_34:
                report<ErrorCode34>();
                break;
            case ErrorCode::_35:
                report<ErrorCode35>();
                break;
            case ErrorCode::_36:
                report<ErrorCode36>();
                break;
            default:
                // If the errorcode isn't 1~36,
                // it indicates that the CPLD register
                // has a reading issue,
                // so the errorcode0 error is reported.
                report<ErrorCode0>();
                break;
        }
        clearCPLDregister();
    }
}

void MihawkCPLD::analyze()
{
    bool powerreadyError = checkPowerreadyFault();

    // Use the function of GPIO class to check
    // GPIOF0(CPLD uses).
    using namespace phosphor::gpio;
    GPIO gpio{"/dev/gpiochip0", static_cast<gpioNum_t>(40), Direction::input};

    // Check GPIOFO pin whether is switched off.
    // if GPIOF0 has been switched off,
    // check CPLD's errorcode & report error.
    if (gpio.read() == Value::low)
    {
        // If the interrupt of power_ready_error is switch on,
        // read CPLD_register error code to analyze and
        // report the error event.
        if (powerreadyError)
        {
            ErrorCode code;
            code = static_cast<ErrorCode>(readFromCPLDErrorCode(StatusReg_3));

            if (!errorcodeMask)
            {
                // Check the errorcodeMask & errorcode whether
                // are the same value to avoid to report the
                // same error again.
                switch (code)
                {
                    case ErrorCode::_1:
                        report<ErrorCode1>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_2:
                        report<ErrorCode2>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_3:
                        report<ErrorCode3>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_4:
                        report<ErrorCode4>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_5:
                        report<ErrorCode5>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_6:
                        report<ErrorCode6>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_7:
                        report<ErrorCode7>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_8:
                        report<ErrorCode8>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_9:
                        report<ErrorCode9>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_10:
                        report<ErrorCode10>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_11:
                        report<ErrorCode11>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_12:
                        report<ErrorCode12>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_13:
                        report<ErrorCode13>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_14:
                        report<ErrorCode14>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_15:
                        report<ErrorCode15>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_16:
                        report<ErrorCode16>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_17:
                        report<ErrorCode17>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_18:
                        report<ErrorCode18>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_19:
                        report<ErrorCode19>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_20:
                        report<ErrorCode20>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_21:
                        report<ErrorCode21>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_22:
                        report<ErrorCode22>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_23:
                        report<ErrorCode23>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_24:
                        report<ErrorCode24>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_25:
                        report<ErrorCode25>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_26:
                        report<ErrorCode26>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_27:
                        report<ErrorCode27>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_28:
                        report<ErrorCode28>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_29:
                        report<ErrorCode29>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_30:
                        report<ErrorCode30>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_31:
                        report<ErrorCode31>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_32:
                        report<ErrorCode32>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_33:
                        report<ErrorCode33>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_34:
                        report<ErrorCode34>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_35:
                        report<ErrorCode35>();
                        errorcodeMask = 1;
                        break;
                    case ErrorCode::_36:
                        report<ErrorCode36>();
                        errorcodeMask = 1;
                        break;
                    default:
                        // If the errorcode is not 1~36,
                        // it indicates that the CPLD register
                        // has a reading issue, so the
                        // errorcode0 error is reported.
                        report<ErrorCode0>();
                        errorcodeMask = 1;
                        break;
                }
            }
            clearCPLDregister();
        }
    }

    if (gpio.read() == Value::high)
    {
        // If there isn't an error(GPIOF0
        // which CPLD uses is switched on),
        // we clear errorcodeMask.
        errorcodeMask = 0;
    }
}

// Check for PoweronFault
bool MihawkCPLD::checkPoweronFault()
{
    uint16_t statusValue_1;
    bool result;

    if (!i2c)
    {
        openCPLDDevice();
    }
    i2c->read(StatusReg_1, statusValue_1);

    if (statusValue_1 < 0)
    {
        std::cerr << "i2c->read() reads data failed \n";
        result = 0;
    }

    if ((statusValue_1 >> 5) & 1)
    {
        // If power_on-interrupt-bit is read as 1,
        // switch on the flag.
        result = 1;
    }
    else
    {
        result = 0;
    }

    // Return the flag.
    return result;
}

// Read CPLD_register error code and return the result to analyze.
int MihawkCPLD::readFromCPLDErrorCode(int statusReg)
{
    uint16_t statusValue_2;

    if (!i2c)
    {
        openCPLDDevice();
    }
    i2c->read(statusReg, statusValue_2);

    if (statusValue_2 < 0 ||
        ((statusValue_2 > static_cast<int>(ErrorCode::_35)) &&
         (statusValue_2 != static_cast<int>(ErrorCode::_36))))
    {
        statusValue_2 = 0;
    }

    // Return the data via i2c->read().
    return statusValue_2;
}

// Check for PowerreadyFault
bool MihawkCPLD::checkPowerreadyFault()
{
    uint16_t statusValue_3;
    bool result;

    if (!i2c)
    {
        openCPLDDevice();
    }
    i2c->read(StatusReg_1, statusValue_3);

    if (statusValue_3 < 0)
    {
        std::cerr << "i2c->read() reads data failed \n";
        result = 0;
    }

    if ((statusValue_3 >> 6) & 1)
    {
        // If power_ready-interrupt-bit is read as 1,
        // switch on the flag.
        result = 1;
    }
    else
    {
        result = 0;
    }

    // Return the flag.
    return result;
}

// Clear CPLD_register after reading.
void MihawkCPLD::clearCPLDregister()
{
    uint16_t data = 0x01;
    uint16_t checkpsu;

    if (!i2c)
    {
        openCPLDDevice();
    }

    // check psu pgood status.
    i2c->read(StatusReg_0, checkpsu);

    // check one of both psus pgood status before
    // clear CPLD_register.
    if (((checkpsu >> 1) & 1) || ((checkpsu >> 2) & 1))
    {
        // Write 0x01 to StatusReg_1 for clearing
        // CPLD_register.
        i2c->write(StatusReg_1, data);
    }
}

// Open i2c device(CPLD_register)
void MihawkCPLD::openCPLDDevice()
{
    i2c = i2c::create(busId, slaveAddr);
}

} // namespace power
} // namespace phosphor
