blob: 53fdcf19cbd04f7e99a8d41dfcfbfdb3f4e3f097 [file] [log] [blame]
Christopher Meis7e446a42024-10-22 09:36:41 +02001#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
10namespace phosphor::software::VR
11{
12
13class 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 uint8_t Id;
63 struct xdpe1x2xxConfig configuration;
64};
65
66} // namespace phosphor::software::VR