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