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