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