blob: 56944f5bfa4df40b833e2f84df8786df8c48ccd4 [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
Christopher Meisfd341442025-06-16 14:34:51 +020031 struct deviceInfo
32 {
33 uint8_t deviceId;
34 uint8_t deviceRev;
35 uint8_t remainingWrites;
36 uint32_t scratchPadAddress;
37 uint32_t actualCRC;
38 uint32_t configSize;
39 };
40
Christopher Meis7e446a42024-10-22 09:36:41 +020041 struct configSect
42 {
43 uint8_t type;
44 uint16_t dataCnt;
45 uint32_t data[MaxSectDataCnt];
46 };
47
48 struct xdpe1x2xxConfig
49 {
50 uint8_t addr;
51 uint16_t totalCnt;
52 uint32_t sumExp;
53 uint8_t sectCnt;
54 struct configSect section[MaxSectCnt];
55 };
56
57 sdbusplus::async::task<bool> getDeviceId(uint8_t* deviceId);
Christopher Meisfd341442025-06-16 14:34:51 +020058 sdbusplus::async::task<bool> mfrFWcmd(uint8_t cmd, uint16_t processTime,
59 uint8_t* data, uint8_t* resp);
Christopher Meis7e446a42024-10-22 09:36:41 +020060 sdbusplus::async::task<bool> getRemainingWrites(uint8_t* remain);
61 sdbusplus::async::task<bool> program(bool force);
Christopher Meisfd341442025-06-16 14:34:51 +020062 sdbusplus::async::task<bool> getScratchPadAddress();
Christopher Meis7e446a42024-10-22 09:36:41 +020063
Christopher Meisfd341442025-06-16 14:34:51 +020064 bool parseImage(const uint8_t* image, size_t imageSize);
65 bool checkImage();
Christopher Meis7e446a42024-10-22 09:36:41 +020066
67 static uint32_t calcCRC32(const uint32_t* data, int len);
68 static int getConfigSize(uint8_t deviceId, uint8_t revision);
69 static int lineSplit(char** dst, char* src, char* delim);
70
71 phosphor::i2c::I2C i2cInterface;
72
Christopher Meisfd341442025-06-16 14:34:51 +020073 struct deviceInfo info;
Christopher Meis7e446a42024-10-22 09:36:41 +020074 struct xdpe1x2xxConfig configuration;
75};
76
77} // namespace phosphor::software::VR