blob: acb13f8b7654157fc0beb6b947ebf9e7e945c225 [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 = {
cchoux6474c752025-08-19 21:33:22 +080016 {"LatticeLCMXO2_4000HCFirmware",
17 {"LCMXO2-4000HC", {0x01, 0x2b, 0xc0, 0x43}}},
Daniel Hsu61e12672025-06-12 19:20:46 +080018 {"LatticeLCMXO3LF_2100CFirmware",
19 {"LCMXO3LF-2100C", {0x61, 0x2b, 0xb0, 0x43}}},
20 {"LatticeLCMXO3LF_4300CFirmware",
21 {"LCMXO3LF-4300C", {0x61, 0x2b, 0xc0, 0x43}}},
Ken Chend9825682025-07-09 13:49:48 +080022 {"LatticeLCMXO3D_4300Firmware", {"LCMXO3D-4300", {0x01, 0x2e, 0x20, 0x43}}},
23 {"LatticeLCMXO3D_9400Firmware", {"LCMXO3D-9400", {0x21, 0x2e, 0x30, 0x43}}},
Daniel Hsu61e12672025-06-12 19:20:46 +080024};
25
Daniel Hsuf6470b52025-02-26 15:03:47 +080026struct cpldI2cInfo
27{
Ken Chen9c05c3c2025-07-24 20:56:34 +080028 unsigned long int fuseQuantity;
29 unsigned int* userFlashMemory;
Daniel Hsuf6470b52025-02-26 15:03:47 +080030 unsigned int version;
31 unsigned int checksum;
32 std::vector<uint8_t> cfgData;
33 std::vector<uint8_t> ufmData;
34};
35
36class CpldLatticeManager
37{
38 public:
39 CpldLatticeManager(sdbusplus::async::context& ctx, const uint16_t bus,
40 const uint8_t address, const uint8_t* image,
41 size_t imageSize, const std::string& chip,
42 const std::string& target, const bool debugMode) :
43 ctx(ctx), image(image), imageSize(imageSize), chip(chip),
44 target(target), debugMode(debugMode),
45 i2cInterface(phosphor::i2c::I2C(bus, address))
46 {}
47 sdbusplus::async::task<bool> updateFirmware(
48 std::function<bool(int)> progressCallBack);
49 sdbusplus::async::task<bool> getVersion(std::string& version);
50
51 private:
52 sdbusplus::async::context& ctx;
53 cpldI2cInfo fwInfo{};
54 const uint8_t* image;
55 size_t imageSize;
56 std::string chip;
57 std::string target;
Ken Chend9825682025-07-09 13:49:48 +080058 std::vector<uint8_t> sumOnly;
Daniel Hsuf6470b52025-02-26 15:03:47 +080059 bool isLCMXO3D = false;
60 bool debugMode = false;
61 phosphor::i2c::I2C i2cInterface;
62
63 sdbusplus::async::task<bool> XO2XO3FamilyUpdate(
64 std::function<bool(int)> progressCallBack);
65
66 int indexof(const char* str, const char* ptn);
67 bool jedFileParser();
68 bool verifyChecksum();
69 sdbusplus::async::task<bool> readDeviceId();
70 sdbusplus::async::task<bool> enableProgramMode();
71 sdbusplus::async::task<bool> eraseFlash();
72 sdbusplus::async::task<bool> resetConfigFlash();
73 sdbusplus::async::task<bool> writeProgramPage();
74 sdbusplus::async::task<bool> programUserCode();
75 sdbusplus::async::task<bool> programDone();
76 sdbusplus::async::task<bool> disableConfigInterface();
77 sdbusplus::async::task<bool> readBusyFlag(uint8_t& busyFlag);
78 sdbusplus::async::task<bool> readStatusReg(uint8_t& statusReg);
79 sdbusplus::async::task<bool> waitBusyAndVerify();
80 sdbusplus::async::task<bool> readUserCode(uint32_t& userCode);
Potin Lai7b925762025-08-18 16:20:29 +080081 sdbusplus::async::task<bool> programSinglePage(
82 uint16_t pageOffset, std::span<const uint8_t> pageData);
83 sdbusplus::async::task<bool> verifySinglePage(
84 uint16_t pageOffset, std::span<const uint8_t> pageData);
Daniel Hsuf6470b52025-02-26 15:03:47 +080085};