blob: 5f5fb5895beffc317f68502fbaef82ab494b8004 [file] [log] [blame]
#include "lattice_cpld_factory.hpp"
#include "lattice_xo3_cpld.hpp"
#include "lattice_xo5_cpld.hpp"
#include <phosphor-logging/lg2.hpp>
namespace phosphor::software::cpld
{
std::unique_ptr<LatticeBaseCPLD> LatticeCPLDFactory::getLatticeCPLD()
{
if (supportedDeviceMap.find(chipEnum) == supportedDeviceMap.end())
{
// invalid
lg2::error("Unsupported Lattice CPLD chip enum: {CHIPENUM}", "CHIPENUM",
chipEnum);
return nullptr;
}
auto chipFamily = supportedDeviceMap.at(chipEnum).chipFamily;
auto chipModelStr =
getLatticeChipStr(chipEnum, latticeStringType::modelString);
switch (chipFamily)
{
case latticeChipFamily::XO2:
case latticeChipFamily::XO3:
return std::make_unique<LatticeXO3CPLD>(
CPLDInterface::ctx, CPLDInterface::bus, CPLDInterface::address,
chipModelStr, "CFG0", false);
case latticeChipFamily::XO5:
return std::make_unique<LatticeXO5CPLD>(
CPLDInterface::ctx, CPLDInterface::bus, CPLDInterface::address,
chipModelStr, "CFG0", false);
default:
lg2::error("Unsupported Lattice CPLD chip family: {CHIPMODEL}",
"CHIPMODEL", chipModelStr);
return nullptr;
}
}
sdbusplus::async::task<bool> LatticeCPLDFactory::updateFirmware(
bool /*force*/, const uint8_t* image, size_t imageSize,
std::function<bool(int)> progressCallBack)
{
lg2::info("Updating Lattice CPLD firmware");
auto cpldManager = getLatticeCPLD();
if (cpldManager == nullptr)
{
lg2::error("CPLD manager is not initialized.");
co_return false;
}
co_return co_await cpldManager->updateFirmware(image, imageSize,
progressCallBack);
}
sdbusplus::async::task<bool> LatticeCPLDFactory::getVersion(
std::string& version)
{
lg2::info("Getting Lattice CPLD version");
auto cpldManager = getLatticeCPLD();
if (cpldManager == nullptr)
{
lg2::error("CPLD manager is not initialized.");
co_return false;
}
co_return co_await cpldManager->getVersion(version);
}
} // namespace phosphor::software::cpld
// Factory function to create lattice CPLD device
namespace
{
using namespace phosphor::software::cpld;
// Register all the CPLD type with the CPLD factory
const bool vendorRegistered = [] {
for (const auto& [chipEnum, info] : supportedDeviceMap)
{
auto typeStr =
getLatticeChipStr(chipEnum, latticeStringType::typeString);
CPLDFactory::instance().registerCPLD(
typeStr, [chipEnum](sdbusplus::async::context& ctx,
const std::string& chipName, uint16_t bus,
uint8_t address) {
// Create and return a LatticeCPLD instance
// Pass the parameters to the constructor
return std::make_unique<LatticeCPLDFactory>(
ctx, chipName, chipEnum, bus, address);
});
}
return true;
}();
} // namespace