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