xref: /openbmc/phosphor-bmc-code-mgmt/cpld/cpld.cpp (revision e634411ba7c22d18ae01a0b03ce4f7b881c38fcc)
1f6470b5eSDaniel Hsu #include "cpld.hpp"
2f6470b5eSDaniel Hsu 
3*e634411bSHenry Wu #include <gpio_controller.hpp>
4*e634411bSHenry Wu 
5f6470b5eSDaniel Hsu namespace phosphor::software::cpld
6f6470b5eSDaniel Hsu {
7f6470b5eSDaniel Hsu 
updateDevice(const uint8_t * image,size_t image_size)8f6470b5eSDaniel Hsu sdbusplus::async::task<bool> CPLDDevice::updateDevice(const uint8_t* image,
9f6470b5eSDaniel Hsu                                                       size_t image_size)
10f6470b5eSDaniel Hsu {
11f6470b5eSDaniel Hsu     if (cpldInterface == nullptr)
12f6470b5eSDaniel Hsu     {
13f6470b5eSDaniel Hsu         lg2::error("CPLD interface is not initialized");
14f6470b5eSDaniel Hsu         co_return false;
15f6470b5eSDaniel Hsu     }
16f6470b5eSDaniel Hsu     else
17f6470b5eSDaniel Hsu     {
18*e634411bSHenry Wu         GPIOGroup muxGPIO(gpioLines, gpioPolarities);
19*e634411bSHenry Wu         std::optional<ScopedBmcMux> guard;
20*e634411bSHenry Wu         if (!gpioLines.empty())
21*e634411bSHenry Wu         {
22*e634411bSHenry Wu             try
23*e634411bSHenry Wu             {
24*e634411bSHenry Wu                 guard.emplace(muxGPIO);
25*e634411bSHenry Wu             }
26*e634411bSHenry Wu             catch (const std::exception& e)
27*e634411bSHenry Wu             {
28*e634411bSHenry Wu                 lg2::error("Failed to mux GPIOs to BMC: {ERROR}", "ERROR",
29*e634411bSHenry Wu                            e.what());
30*e634411bSHenry Wu                 co_return false;
31*e634411bSHenry Wu             }
32*e634411bSHenry Wu         }
33*e634411bSHenry Wu 
34f6470b5eSDaniel Hsu         setUpdateProgress(1);
35f6470b5eSDaniel Hsu         if (!(co_await cpldInterface->updateFirmware(
36f6470b5eSDaniel Hsu                 false, image, image_size, [this](int percent) -> bool {
37f6470b5eSDaniel Hsu                     return this->setUpdateProgress(percent);
38f6470b5eSDaniel Hsu                 })))
39f6470b5eSDaniel Hsu         {
40f6470b5eSDaniel Hsu             lg2::error("Failed to update CPLD firmware");
41f6470b5eSDaniel Hsu             co_return false;
42f6470b5eSDaniel Hsu         }
43f6470b5eSDaniel Hsu 
44f6470b5eSDaniel Hsu         setUpdateProgress(100);
45f6470b5eSDaniel Hsu         lg2::info("Successfully updated CPLD");
46f6470b5eSDaniel Hsu         co_return true;
47f6470b5eSDaniel Hsu     }
48f6470b5eSDaniel Hsu }
49f6470b5eSDaniel Hsu 
getVersion(std::string & version)50f6470b5eSDaniel Hsu sdbusplus::async::task<bool> CPLDDevice::getVersion(std::string& version)
51f6470b5eSDaniel Hsu {
52f6470b5eSDaniel Hsu     if (cpldInterface == nullptr)
53f6470b5eSDaniel Hsu     {
54f6470b5eSDaniel Hsu         lg2::error("CPLD interface is not initialized");
55f6470b5eSDaniel Hsu         co_return false;
56f6470b5eSDaniel Hsu     }
57f6470b5eSDaniel Hsu     else
58f6470b5eSDaniel Hsu     {
59f6470b5eSDaniel Hsu         if (!(co_await cpldInterface->getVersion(version)))
60f6470b5eSDaniel Hsu         {
61f6470b5eSDaniel Hsu             lg2::error("Failed to get CPLD version");
62f6470b5eSDaniel Hsu             co_return false;
63f6470b5eSDaniel Hsu         }
64f6470b5eSDaniel Hsu 
65f6470b5eSDaniel Hsu         lg2::info("CPLD version: {VERSION}", "VERSION", version);
66f6470b5eSDaniel Hsu         co_return true;
67f6470b5eSDaniel Hsu     }
68f6470b5eSDaniel Hsu }
69f6470b5eSDaniel Hsu 
70f6470b5eSDaniel Hsu } // namespace phosphor::software::cpld
71