blob: 2488eda2800e8fae4acb02987ae463a41223fe64 [file] [log] [blame]
#pragma once
#include "common/include/i2c/i2c.hpp"
#include "i2c-vr/vr.hpp"
#include <sdbusplus/async.hpp>
#include <cstdint>
#include <unordered_set>
namespace phosphor::software::VR
{
class TDA38640A : public VoltageRegulator
{
public:
TDA38640A(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address);
sdbusplus::async::task<bool> verifyImage(const uint8_t* image,
size_t imageSize) final;
sdbusplus::async::task<bool> updateFirmware(bool force) final;
sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final;
bool forcedUpdateAllowed() final;
private:
struct Configuration
{
uint32_t rev;
uint32_t checksum;
std::vector<uint16_t> offsets;
std::vector<std::vector<uint8_t>> data;
void clear()
{
rev = 0;
checksum = 0;
offsets.clear();
data.clear();
}
};
sdbusplus::async::task<bool> getUserRemainingWrites(uint8_t* remain);
sdbusplus::async::task<bool> getDeviceId(uint32_t* deviceId);
sdbusplus::async::task<bool> program();
sdbusplus::async::task<bool> getProgStatus(uint8_t* status);
sdbusplus::async::task<bool> unlockDevice();
sdbusplus::async::task<bool> programmingCmd();
sdbusplus::async::task<bool> setPage(uint8_t page);
sdbusplus::async::task<bool> getDeviceRevision(uint8_t* revision);
bool parseImage(const uint8_t* image, size_t imageSize);
phosphor::i2c::I2C i2cInterface;
struct Configuration configuration;
};
} // namespace phosphor::software::VR