blob: 0a819178cc9ee74e4674207d0205b62e460b9af6 [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}}},
Ken Chend9825682025-07-09 13:49:48 +080021 {"LatticeLCMXO3D_4300Firmware", {"LCMXO3D-4300", {0x01, 0x2e, 0x20, 0x43}}},
22 {"LatticeLCMXO3D_9400Firmware", {"LCMXO3D-9400", {0x21, 0x2e, 0x30, 0x43}}},
Daniel Hsu61e12672025-06-12 19:20:46 +080023};
24
Daniel Hsuf6470b52025-02-26 15:03:47 +080025struct cpldI2cInfo
26{
Ken Chen9c05c3c2025-07-24 20:56:34 +080027 unsigned long int fuseQuantity;
28 unsigned int* userFlashMemory;
Daniel Hsuf6470b52025-02-26 15:03:47 +080029 unsigned int version;
30 unsigned int checksum;
31 std::vector<uint8_t> cfgData;
32 std::vector<uint8_t> ufmData;
33};
34
35class CpldLatticeManager
36{
37 public:
38 CpldLatticeManager(sdbusplus::async::context& ctx, const uint16_t bus,
39 const uint8_t address, const uint8_t* image,
40 size_t imageSize, const std::string& chip,
41 const std::string& target, const bool debugMode) :
42 ctx(ctx), image(image), imageSize(imageSize), chip(chip),
43 target(target), debugMode(debugMode),
44 i2cInterface(phosphor::i2c::I2C(bus, address))
45 {}
46 sdbusplus::async::task<bool> updateFirmware(
47 std::function<bool(int)> progressCallBack);
48 sdbusplus::async::task<bool> getVersion(std::string& version);
49
50 private:
51 sdbusplus::async::context& ctx;
52 cpldI2cInfo fwInfo{};
53 const uint8_t* image;
54 size_t imageSize;
55 std::string chip;
56 std::string target;
Ken Chend9825682025-07-09 13:49:48 +080057 std::vector<uint8_t> sumOnly;
Daniel Hsuf6470b52025-02-26 15:03:47 +080058 bool isLCMXO3D = false;
59 bool debugMode = false;
60 phosphor::i2c::I2C i2cInterface;
61
62 sdbusplus::async::task<bool> XO2XO3FamilyUpdate(
63 std::function<bool(int)> progressCallBack);
64
65 int indexof(const char* str, const char* ptn);
66 bool jedFileParser();
67 bool verifyChecksum();
68 sdbusplus::async::task<bool> readDeviceId();
69 sdbusplus::async::task<bool> enableProgramMode();
70 sdbusplus::async::task<bool> eraseFlash();
71 sdbusplus::async::task<bool> resetConfigFlash();
72 sdbusplus::async::task<bool> writeProgramPage();
73 sdbusplus::async::task<bool> programUserCode();
74 sdbusplus::async::task<bool> programDone();
75 sdbusplus::async::task<bool> disableConfigInterface();
76 sdbusplus::async::task<bool> readBusyFlag(uint8_t& busyFlag);
77 sdbusplus::async::task<bool> readStatusReg(uint8_t& statusReg);
78 sdbusplus::async::task<bool> waitBusyAndVerify();
79 sdbusplus::async::task<bool> readUserCode(uint32_t& userCode);
80};