xref: /openbmc/phosphor-bmc-code-mgmt/i2c-vr/tda38640a/tda38640a.hpp (revision c1b36628298d7799677680e70d455f85acf83650)
1*c1b36628SLeo Yang #pragma once
2*c1b36628SLeo Yang 
3*c1b36628SLeo Yang #include "common/include/i2c/i2c.hpp"
4*c1b36628SLeo Yang #include "i2c-vr/vr.hpp"
5*c1b36628SLeo Yang 
6*c1b36628SLeo Yang #include <sdbusplus/async.hpp>
7*c1b36628SLeo Yang 
8*c1b36628SLeo Yang #include <cstdint>
9*c1b36628SLeo Yang #include <unordered_set>
10*c1b36628SLeo Yang 
11*c1b36628SLeo Yang namespace phosphor::software::VR
12*c1b36628SLeo Yang {
13*c1b36628SLeo Yang 
14*c1b36628SLeo Yang class TDA38640A : public VoltageRegulator
15*c1b36628SLeo Yang {
16*c1b36628SLeo Yang   public:
17*c1b36628SLeo Yang     TDA38640A(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address);
18*c1b36628SLeo Yang 
19*c1b36628SLeo Yang     sdbusplus::async::task<bool> verifyImage(const uint8_t* image,
20*c1b36628SLeo Yang                                              size_t imageSize) final;
21*c1b36628SLeo Yang 
22*c1b36628SLeo Yang     sdbusplus::async::task<bool> updateFirmware(bool force) final;
23*c1b36628SLeo Yang     sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final;
24*c1b36628SLeo Yang 
25*c1b36628SLeo Yang     bool forcedUpdateAllowed() final;
26*c1b36628SLeo Yang 
27*c1b36628SLeo Yang   private:
28*c1b36628SLeo Yang     struct Configuration
29*c1b36628SLeo Yang     {
30*c1b36628SLeo Yang         uint32_t rev;
31*c1b36628SLeo Yang         uint32_t checksum;
32*c1b36628SLeo Yang         std::vector<uint16_t> offsets;
33*c1b36628SLeo Yang         std::vector<std::vector<uint8_t>> data;
34*c1b36628SLeo Yang 
35*c1b36628SLeo Yang         void clear()
36*c1b36628SLeo Yang         {
37*c1b36628SLeo Yang             rev = 0;
38*c1b36628SLeo Yang             checksum = 0;
39*c1b36628SLeo Yang             offsets.clear();
40*c1b36628SLeo Yang             data.clear();
41*c1b36628SLeo Yang         }
42*c1b36628SLeo Yang     };
43*c1b36628SLeo Yang 
44*c1b36628SLeo Yang     sdbusplus::async::task<bool> getUserRemainingWrites(uint8_t* remain);
45*c1b36628SLeo Yang     sdbusplus::async::task<bool> getDeviceId(uint32_t* deviceId);
46*c1b36628SLeo Yang     sdbusplus::async::task<bool> program();
47*c1b36628SLeo Yang     sdbusplus::async::task<bool> getProgStatus(uint8_t* status);
48*c1b36628SLeo Yang     sdbusplus::async::task<bool> unlockDevice();
49*c1b36628SLeo Yang     sdbusplus::async::task<bool> programmingCmd();
50*c1b36628SLeo Yang     sdbusplus::async::task<bool> setPage(uint8_t page);
51*c1b36628SLeo Yang     sdbusplus::async::task<bool> getDeviceRevision(uint8_t* revision);
52*c1b36628SLeo Yang 
53*c1b36628SLeo Yang     bool parseImage(const uint8_t* image, size_t imageSize);
54*c1b36628SLeo Yang 
55*c1b36628SLeo Yang     phosphor::i2c::I2C i2cInterface;
56*c1b36628SLeo Yang 
57*c1b36628SLeo Yang     struct Configuration configuration;
58*c1b36628SLeo Yang };
59*c1b36628SLeo Yang } // namespace phosphor::software::VR
60