blob: 6c38667af0264eeae6e983617e3ec9240e7f7864 [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;
Christopher Meis7e446a42024-10-22 09:36:41 +020022
23 sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final;
24 bool forcedUpdateAllowed() final;
25
26 private:
27 static const int MaxSectCnt = 16;
28 static const int MaxSectDataCnt = 200;
29
Christopher Meisfd341442025-06-16 14:34:51 +020030 struct deviceInfo
31 {
32 uint8_t deviceId;
33 uint8_t deviceRev;
34 uint8_t remainingWrites;
35 uint32_t scratchPadAddress;
36 uint32_t actualCRC;
37 uint32_t configSize;
38 };
39
Christopher Meis7e446a42024-10-22 09:36:41 +020040 struct configSect
41 {
42 uint8_t type;
43 uint16_t dataCnt;
44 uint32_t data[MaxSectDataCnt];
45 };
46
47 struct xdpe1x2xxConfig
48 {
49 uint8_t addr;
50 uint16_t totalCnt;
51 uint32_t sumExp;
52 uint8_t sectCnt;
53 struct configSect section[MaxSectCnt];
54 };
55
56 sdbusplus::async::task<bool> getDeviceId(uint8_t* deviceId);
Christopher Meisfd341442025-06-16 14:34:51 +020057 sdbusplus::async::task<bool> mfrFWcmd(uint8_t cmd, uint16_t processTime,
58 uint8_t* data, uint8_t* resp);
Christopher Meis7e446a42024-10-22 09:36:41 +020059 sdbusplus::async::task<bool> getRemainingWrites(uint8_t* remain);
60 sdbusplus::async::task<bool> program(bool force);
Christopher Meisfd341442025-06-16 14:34:51 +020061 sdbusplus::async::task<bool> getScratchPadAddress();
Christopher Meis7e446a42024-10-22 09:36:41 +020062
Christopher Meisfd341442025-06-16 14:34:51 +020063 bool parseImage(const uint8_t* image, size_t imageSize);
64 bool checkImage();
Christopher Meis7e446a42024-10-22 09:36:41 +020065
66 static uint32_t calcCRC32(const uint32_t* data, int len);
67 static int getConfigSize(uint8_t deviceId, uint8_t revision);
68 static int lineSplit(char** dst, char* src, char* delim);
69
70 phosphor::i2c::I2C i2cInterface;
71
Christopher Meisfd341442025-06-16 14:34:51 +020072 struct deviceInfo info;
Christopher Meis7e446a42024-10-22 09:36:41 +020073 struct xdpe1x2xxConfig configuration;
74};
75
76} // namespace phosphor::software::VR