xref: /openbmc/phosphor-bmc-code-mgmt/cpld/cpld.cpp (revision f6470b5e95618fa0eeb8b03b37c53a311dfc1ef3)
1*f6470b5eSDaniel Hsu #include "cpld.hpp"
2*f6470b5eSDaniel Hsu 
3*f6470b5eSDaniel Hsu namespace phosphor::software::cpld
4*f6470b5eSDaniel Hsu {
5*f6470b5eSDaniel Hsu 
updateDevice(const uint8_t * image,size_t image_size)6*f6470b5eSDaniel Hsu sdbusplus::async::task<bool> CPLDDevice::updateDevice(const uint8_t* image,
7*f6470b5eSDaniel Hsu                                                       size_t image_size)
8*f6470b5eSDaniel Hsu {
9*f6470b5eSDaniel Hsu     if (cpldInterface == nullptr)
10*f6470b5eSDaniel Hsu     {
11*f6470b5eSDaniel Hsu         lg2::error("CPLD interface is not initialized");
12*f6470b5eSDaniel Hsu         co_return false;
13*f6470b5eSDaniel Hsu     }
14*f6470b5eSDaniel Hsu     else
15*f6470b5eSDaniel Hsu     {
16*f6470b5eSDaniel Hsu         setUpdateProgress(1);
17*f6470b5eSDaniel Hsu         if (!(co_await cpldInterface->updateFirmware(
18*f6470b5eSDaniel Hsu                 false, image, image_size, [this](int percent) -> bool {
19*f6470b5eSDaniel Hsu                     return this->setUpdateProgress(percent);
20*f6470b5eSDaniel Hsu                 })))
21*f6470b5eSDaniel Hsu         {
22*f6470b5eSDaniel Hsu             lg2::error("Failed to update CPLD firmware");
23*f6470b5eSDaniel Hsu             co_return false;
24*f6470b5eSDaniel Hsu         }
25*f6470b5eSDaniel Hsu 
26*f6470b5eSDaniel Hsu         setUpdateProgress(100);
27*f6470b5eSDaniel Hsu         lg2::info("Successfully updated CPLD");
28*f6470b5eSDaniel Hsu         co_return true;
29*f6470b5eSDaniel Hsu     }
30*f6470b5eSDaniel Hsu }
31*f6470b5eSDaniel Hsu 
getVersion(std::string & version)32*f6470b5eSDaniel Hsu sdbusplus::async::task<bool> CPLDDevice::getVersion(std::string& version)
33*f6470b5eSDaniel Hsu {
34*f6470b5eSDaniel Hsu     if (cpldInterface == nullptr)
35*f6470b5eSDaniel Hsu     {
36*f6470b5eSDaniel Hsu         lg2::error("CPLD interface is not initialized");
37*f6470b5eSDaniel Hsu         co_return false;
38*f6470b5eSDaniel Hsu     }
39*f6470b5eSDaniel Hsu     else
40*f6470b5eSDaniel Hsu     {
41*f6470b5eSDaniel Hsu         if (!(co_await cpldInterface->getVersion(version)))
42*f6470b5eSDaniel Hsu         {
43*f6470b5eSDaniel Hsu             lg2::error("Failed to get CPLD version");
44*f6470b5eSDaniel Hsu             co_return false;
45*f6470b5eSDaniel Hsu         }
46*f6470b5eSDaniel Hsu 
47*f6470b5eSDaniel Hsu         lg2::info("CPLD version: {VERSION}", "VERSION", version);
48*f6470b5eSDaniel Hsu         co_return true;
49*f6470b5eSDaniel Hsu     }
50*f6470b5eSDaniel Hsu }
51*f6470b5eSDaniel Hsu 
52*f6470b5eSDaniel Hsu } // namespace phosphor::software::cpld
53