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