blob: 63031353bb183fcafa78bad55896ddcc7be2bc55 [file] [log] [blame]
Daniel Hsuf6470b52025-02-26 15:03:47 +08001#include "cpld_software_manager.hpp"
2
3#include "common/include/dbus_helper.hpp"
4#include "cpld.hpp"
5
6#include <phosphor-logging/lg2.hpp>
7#include <sdbusplus/async.hpp>
8
9PHOSPHOR_LOG2_USING;
10
11using namespace phosphor::software::cpld;
12
13sdbusplus::async::task<bool> CPLDSoftwareManager::initDevice(
14 const std::string& service, const std::string& path, SoftwareConfig& config)
15{
16 std::string configIface =
17 "xyz.openbmc_project.Configuration." + config.configType;
18
Daniel Hsu37a30142025-06-12 17:57:24 +080019 auto busNo = co_await dbusGetRequiredProperty<uint64_t>(
Daniel Hsuf6470b52025-02-26 15:03:47 +080020 ctx, service, path, configIface, "Bus");
Daniel Hsu37a30142025-06-12 17:57:24 +080021 auto address = co_await dbusGetRequiredProperty<uint64_t>(
22 ctx, service, path, configIface, "Address");
23 auto chipType = co_await dbusGetRequiredProperty<std::string>(
24 ctx, service, path, configIface, "Type");
25 auto chipName = co_await dbusGetRequiredProperty<std::string>(
26 ctx, service, path, configIface, "Name");
Daniel Hsuf6470b52025-02-26 15:03:47 +080027
28 if (!busNo.has_value() || !address.has_value() || !chipType.has_value() ||
29 !chipName.has_value())
30 {
31 error("missing config property");
32 co_return false;
33 }
34
35 lg2::debug(
36 "CPLD device type: {TYPE} - {NAME} on Bus: {BUS} at Address: {ADDR}",
37 "TYPE", chipType.value(), "NAME", chipName.value(), "BUS",
38 busNo.value(), "ADDR", address.value());
39
40 auto cpld = std::make_unique<CPLDDevice>(
41 ctx, chipType.value(), chipName.value(), busNo.value(), address.value(),
42 config, this);
43
44 std::string version = "unknown";
45 if (!(co_await cpld->getVersion(version)))
46 {
47 lg2::error("Failed to get CPLD version for {NAME}", "NAME",
48 chipName.value());
49 }
50
51 std::unique_ptr<Software> software = std::make_unique<Software>(ctx, *cpld);
52
53 software->setVersion(version);
54
55 std::set<RequestedApplyTimes> allowedApplyTimes = {
56 RequestedApplyTimes::Immediate, RequestedApplyTimes::OnReset};
57
58 software->enableUpdate(allowedApplyTimes);
59
60 cpld->softwareCurrent = std::move(software);
61
62 devices.insert({config.objectPath, std::move(cpld)});
63
64 co_return true;
65}
66
67void CPLDSoftwareManager::start()
68{
69 std::vector<std::string> configIntfs;
70 auto configs = CPLDFactory::instance().getConfigs();
71 configIntfs.reserve(configs.size());
72 for (const auto& config : configs)
73 {
74 configIntfs.push_back("xyz.openbmc_project.Configuration." + config);
75 }
76
77 ctx.spawn(initDevices(configIntfs));
78 ctx.run();
79}
80
81int main()
82{
83 sdbusplus::async::context ctx;
84
85 CPLDSoftwareManager cpldSoftwareManager(ctx);
86
87 cpldSoftwareManager.start();
88
89 return 0;
90}