xref: /openbmc/phosphor-bmc-code-mgmt/i2c-vr/xdpe1x2xx/xdpe1x2xx.hpp (revision 01ba956256e45b953c78591319a5f25ff4ba618d)
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 
10 namespace phosphor::software::VR
11 {
12 
13 class XDPE1X2XX : public VoltageRegulator
14 {
15   public:
16     XDPE1X2XX(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address);
17 
18     sdbusplus::async::task<bool> verifyImage(const uint8_t* image,
19                                              size_t imageSize) final;
20 
21     sdbusplus::async::task<bool> updateFirmware(bool force) final;
22     sdbusplus::async::task<bool> reset() final;
23 
24     sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final;
25     bool forcedUpdateAllowed() final;
26 
27   private:
28     static const int MaxSectCnt = 16;
29     static const int MaxSectDataCnt = 200;
30 
31     struct configSect
32     {
33         uint8_t type;
34         uint16_t dataCnt;
35         uint32_t data[MaxSectDataCnt];
36     };
37 
38     struct xdpe1x2xxConfig
39     {
40         uint8_t addr;
41         uint16_t totalCnt;
42         uint32_t sumExp;
43         uint8_t sectCnt;
44         struct configSect section[MaxSectCnt];
45     };
46 
47     sdbusplus::async::task<bool> getDeviceId(uint8_t* deviceId);
48     sdbusplus::async::task<bool> mfrFWcmd(uint8_t cmd, uint8_t* data,
49                                           uint8_t* resp);
50     sdbusplus::async::task<bool> getRemainingWrites(uint8_t* remain);
51     sdbusplus::async::task<bool> program(bool force);
52 
53     int parseImage(const uint8_t* image, size_t imageSize);
54     int checkImage();
55 
56     static uint32_t calcCRC32(const uint32_t* data, int len);
57     static int getConfigSize(uint8_t deviceId, uint8_t revision);
58     static int lineSplit(char** dst, char* src, char* delim);
59 
60     phosphor::i2c::I2C i2cInterface;
61 
62     struct xdpe1x2xxConfig configuration;
63 };
64 
65 } // namespace phosphor::software::VR
66