blob: 3c0646170afc4697b3bb4dade438ffbec4ed9fdc [file] [log] [blame]
Daniel Hsuf6470b52025-02-26 15:03:47 +08001#pragma once
2#include "common/include/i2c/i2c.hpp"
3
4#include <chrono>
5#include <iostream>
6#include <string_view>
7#include <utility>
8
Daniel Hsu61e12672025-06-12 19:20:46 +08009struct cpldInfo
10{
11 std::string chipName;
12 std::vector<uint8_t> deviceId;
13};
14
15const std::map<std::string, cpldInfo> supportedDeviceMap = {
Fred Chenf30ca2c2025-06-27 14:29:41 +080016 {"LatticeLCMXO3D_9400Firmware", {"LCMXO3D-9400", {0x21, 0x2e, 0x30, 0x43}}},
Daniel Hsu61e12672025-06-12 19:20:46 +080017 {"LatticeLCMXO3LF_2100CFirmware",
18 {"LCMXO3LF-2100C", {0x61, 0x2b, 0xb0, 0x43}}},
19 {"LatticeLCMXO3LF_4300CFirmware",
20 {"LCMXO3LF-4300C", {0x61, 0x2b, 0xc0, 0x43}}},
21};
22
Daniel Hsuf6470b52025-02-26 15:03:47 +080023struct cpldI2cInfo
24{
25 unsigned long int QF; // Quantity of Fuses
26 unsigned int* UFM; // User Flash Memory
27 unsigned int version;
28 unsigned int checksum;
29 std::vector<uint8_t> cfgData;
30 std::vector<uint8_t> ufmData;
31};
32
33class CpldLatticeManager
34{
35 public:
36 CpldLatticeManager(sdbusplus::async::context& ctx, const uint16_t bus,
37 const uint8_t address, const uint8_t* image,
38 size_t imageSize, const std::string& chip,
39 const std::string& target, const bool debugMode) :
40 ctx(ctx), image(image), imageSize(imageSize), chip(chip),
41 target(target), debugMode(debugMode),
42 i2cInterface(phosphor::i2c::I2C(bus, address))
43 {}
44 sdbusplus::async::task<bool> updateFirmware(
45 std::function<bool(int)> progressCallBack);
46 sdbusplus::async::task<bool> getVersion(std::string& version);
47
48 private:
49 sdbusplus::async::context& ctx;
50 cpldI2cInfo fwInfo{};
51 const uint8_t* image;
52 size_t imageSize;
53 std::string chip;
54 std::string target;
55 bool isLCMXO3D = false;
56 bool debugMode = false;
57 phosphor::i2c::I2C i2cInterface;
58
59 sdbusplus::async::task<bool> XO2XO3FamilyUpdate(
60 std::function<bool(int)> progressCallBack);
61
62 int indexof(const char* str, const char* ptn);
63 bool jedFileParser();
64 bool verifyChecksum();
65 sdbusplus::async::task<bool> readDeviceId();
66 sdbusplus::async::task<bool> enableProgramMode();
67 sdbusplus::async::task<bool> eraseFlash();
68 sdbusplus::async::task<bool> resetConfigFlash();
69 sdbusplus::async::task<bool> writeProgramPage();
70 sdbusplus::async::task<bool> programUserCode();
71 sdbusplus::async::task<bool> programDone();
72 sdbusplus::async::task<bool> disableConfigInterface();
73 sdbusplus::async::task<bool> readBusyFlag(uint8_t& busyFlag);
74 sdbusplus::async::task<bool> readStatusReg(uint8_t& statusReg);
75 sdbusplus::async::task<bool> waitBusyAndVerify();
76 sdbusplus::async::task<bool> readUserCode(uint32_t& userCode);
77};