blob: 2488eda2800e8fae4acb02987ae463a41223fe64 [file] [log] [blame]
Leo Yangc1b36622025-10-28 10:39:55 +08001#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
11namespace phosphor::software::VR
12{
13
14class 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
35 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