xref: /openbmc/phosphor-bmc-code-mgmt/cpld/lattice/lattice_cpld_factory.cpp (revision a3902c83e3b65c3612e419cc1e616c56be65ff41)
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