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 ISL69269 : public VoltageRegulator 14 { 15 public: 16 enum class Gen 17 { 18 Gen2, 19 Gen3, 20 Gen3p5 21 }; 22 23 ISL69269(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address, 24 Gen gen = Gen::Gen3); 25 26 sdbusplus::async::task<bool> verifyImage(const uint8_t* image, 27 size_t imageSize) final; 28 29 sdbusplus::async::task<bool> updateFirmware(bool force) final; 30 sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final; 31 32 bool forcedUpdateAllowed() final; 33 34 private: 35 struct Data 36 { 37 uint8_t len; 38 uint8_t pec; 39 uint8_t addr; 40 uint8_t cmd; 41 uint8_t data[30]; 42 }; 43 44 struct Configuration 45 { 46 uint8_t addr; 47 uint8_t mode; 48 uint8_t cfgId; 49 uint16_t wrCnt; 50 uint32_t devIdExp; 51 uint32_t devRevExp; 52 uint32_t crcExp; 53 struct Data pData[1024]; 54 }; 55 sdbusplus::async::task<bool> dmaReadWrite(uint8_t* reg, uint8_t* resp); 56 sdbusplus::async::task<bool> getRemainingWrites(uint8_t* remain); 57 sdbusplus::async::task<bool> getHexMode(uint8_t* mode); 58 sdbusplus::async::task<bool> getDeviceId(uint32_t* deviceId); 59 sdbusplus::async::task<bool> getDeviceRevision(uint32_t* revision); 60 sdbusplus::async::task<bool> program(); 61 sdbusplus::async::task<bool> getProgStatus(); 62 sdbusplus::async::task<bool> restoreCfg(); 63 64 bool parseImage(const uint8_t* image, size_t imageSize); 65 bool checkImage(); 66 67 phosphor::i2c::I2C i2cInterface; 68 Gen generation; 69 uint8_t mode; 70 71 struct Configuration configuration; 72 }; 73 } // namespace phosphor::software::VR 74