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