1b602aad5SDaniel Hsu #include "lattice_cpld_factory.hpp"
2b602aad5SDaniel Hsu
3b602aad5SDaniel Hsu #include "lattice_xo3_cpld.hpp"
4*a3902c83SDaniel Hsu #include "lattice_xo5_cpld.hpp"
5b602aad5SDaniel Hsu
6b602aad5SDaniel Hsu #include <phosphor-logging/lg2.hpp>
7b602aad5SDaniel Hsu
8b602aad5SDaniel Hsu namespace phosphor::software::cpld
9b602aad5SDaniel Hsu {
10b602aad5SDaniel Hsu
getLatticeCPLD()11b602aad5SDaniel Hsu std::unique_ptr<LatticeBaseCPLD> LatticeCPLDFactory::getLatticeCPLD()
12b602aad5SDaniel Hsu {
13b602aad5SDaniel Hsu if (supportedDeviceMap.find(chipEnum) == supportedDeviceMap.end())
14b602aad5SDaniel Hsu {
15b602aad5SDaniel Hsu // invalid
16b602aad5SDaniel Hsu lg2::error("Unsupported Lattice CPLD chip enum: {CHIPENUM}", "CHIPENUM",
17b602aad5SDaniel Hsu chipEnum);
18b602aad5SDaniel Hsu return nullptr;
19b602aad5SDaniel Hsu }
20b602aad5SDaniel Hsu
21b602aad5SDaniel Hsu auto chipFamily = supportedDeviceMap.at(chipEnum).chipFamily;
22b602aad5SDaniel Hsu auto chipModelStr =
23b602aad5SDaniel Hsu getLatticeChipStr(chipEnum, latticeStringType::modelString);
24b602aad5SDaniel Hsu switch (chipFamily)
25b602aad5SDaniel Hsu {
26b602aad5SDaniel Hsu case latticeChipFamily::XO2:
27b602aad5SDaniel Hsu case latticeChipFamily::XO3:
28b602aad5SDaniel Hsu return std::make_unique<LatticeXO3CPLD>(
29b602aad5SDaniel Hsu CPLDInterface::ctx, CPLDInterface::bus, CPLDInterface::address,
30b602aad5SDaniel Hsu chipModelStr, "CFG0", false);
31*a3902c83SDaniel Hsu case latticeChipFamily::XO5:
32*a3902c83SDaniel Hsu return std::make_unique<LatticeXO5CPLD>(
33*a3902c83SDaniel Hsu CPLDInterface::ctx, CPLDInterface::bus, CPLDInterface::address,
34*a3902c83SDaniel Hsu chipModelStr, "CFG0", false);
35b602aad5SDaniel Hsu default:
36b602aad5SDaniel Hsu lg2::error("Unsupported Lattice CPLD chip family: {CHIPMODEL}",
37b602aad5SDaniel Hsu "CHIPMODEL", chipModelStr);
38b602aad5SDaniel Hsu return nullptr;
39b602aad5SDaniel Hsu }
40b602aad5SDaniel Hsu }
41b602aad5SDaniel Hsu
updateFirmware(bool,const uint8_t * image,size_t imageSize,std::function<bool (int)> progressCallBack)42b602aad5SDaniel Hsu sdbusplus::async::task<bool> LatticeCPLDFactory::updateFirmware(
43b602aad5SDaniel Hsu bool /*force*/, const uint8_t* image, size_t imageSize,
44b602aad5SDaniel Hsu std::function<bool(int)> progressCallBack)
45b602aad5SDaniel Hsu {
46b602aad5SDaniel Hsu lg2::info("Updating Lattice CPLD firmware");
47b602aad5SDaniel Hsu auto cpldManager = getLatticeCPLD();
48b602aad5SDaniel Hsu if (cpldManager == nullptr)
49b602aad5SDaniel Hsu {
50b602aad5SDaniel Hsu lg2::error("CPLD manager is not initialized.");
51b602aad5SDaniel Hsu co_return false;
52b602aad5SDaniel Hsu }
53b602aad5SDaniel Hsu co_return co_await cpldManager->updateFirmware(image, imageSize,
54b602aad5SDaniel Hsu progressCallBack);
55b602aad5SDaniel Hsu }
56b602aad5SDaniel Hsu
getVersion(std::string & version)57b602aad5SDaniel Hsu sdbusplus::async::task<bool> LatticeCPLDFactory::getVersion(
58b602aad5SDaniel Hsu std::string& version)
59b602aad5SDaniel Hsu {
60b602aad5SDaniel Hsu lg2::info("Getting Lattice CPLD version");
61b602aad5SDaniel Hsu auto cpldManager = getLatticeCPLD();
62b602aad5SDaniel Hsu if (cpldManager == nullptr)
63b602aad5SDaniel Hsu {
64b602aad5SDaniel Hsu lg2::error("CPLD manager is not initialized.");
65b602aad5SDaniel Hsu co_return false;
66b602aad5SDaniel Hsu }
67b602aad5SDaniel Hsu co_return co_await cpldManager->getVersion(version);
68b602aad5SDaniel Hsu }
69b602aad5SDaniel Hsu
70b602aad5SDaniel Hsu } // namespace phosphor::software::cpld
71b602aad5SDaniel Hsu
72b602aad5SDaniel Hsu // Factory function to create lattice CPLD device
73b602aad5SDaniel Hsu namespace
74b602aad5SDaniel Hsu {
75b602aad5SDaniel Hsu using namespace phosphor::software::cpld;
76b602aad5SDaniel Hsu
77b602aad5SDaniel Hsu // Register all the CPLD type with the CPLD factory
__anonccff76d40202null78b602aad5SDaniel Hsu const bool vendorRegistered = [] {
79b602aad5SDaniel Hsu for (const auto& [chipEnum, info] : supportedDeviceMap)
80b602aad5SDaniel Hsu {
81b602aad5SDaniel Hsu auto typeStr =
82b602aad5SDaniel Hsu getLatticeChipStr(chipEnum, latticeStringType::typeString);
83b602aad5SDaniel Hsu CPLDFactory::instance().registerCPLD(
84b602aad5SDaniel Hsu typeStr, [chipEnum](sdbusplus::async::context& ctx,
85b602aad5SDaniel Hsu const std::string& chipName, uint16_t bus,
86b602aad5SDaniel Hsu uint8_t address) {
87b602aad5SDaniel Hsu // Create and return a LatticeCPLD instance
88b602aad5SDaniel Hsu // Pass the parameters to the constructor
89b602aad5SDaniel Hsu return std::make_unique<LatticeCPLDFactory>(
90b602aad5SDaniel Hsu ctx, chipName, chipEnum, bus, address);
91b602aad5SDaniel Hsu });
92b602aad5SDaniel Hsu }
93b602aad5SDaniel Hsu return true;
94b602aad5SDaniel Hsu }();
95b602aad5SDaniel Hsu
96b602aad5SDaniel Hsu } // namespace
97