1*c538727dSKevin Tung #include "tpm_software_manager.hpp"
2*c538727dSKevin Tung
3*c538727dSKevin Tung #include "common/include/dbus_helper.hpp"
4*c538727dSKevin Tung #include "tpm_device.hpp"
5*c538727dSKevin Tung
6*c538727dSKevin Tung #include <phosphor-logging/lg2.hpp>
7*c538727dSKevin Tung
8*c538727dSKevin Tung PHOSPHOR_LOG2_USING;
9*c538727dSKevin Tung
10*c538727dSKevin Tung namespace SoftwareInf = phosphor::software;
11*c538727dSKevin Tung
start()12*c538727dSKevin Tung void TPMSoftwareManager::start()
13*c538727dSKevin Tung {
14*c538727dSKevin Tung std::vector<std::string> configIntfs = {
15*c538727dSKevin Tung "xyz.openbmc_project.Configuration.TPM2Firmware",
16*c538727dSKevin Tung };
17*c538727dSKevin Tung
18*c538727dSKevin Tung ctx.spawn(initDevices(configIntfs));
19*c538727dSKevin Tung ctx.run();
20*c538727dSKevin Tung }
21*c538727dSKevin Tung
initDevice(const std::string & service,const std::string & path,SoftwareConfig & config)22*c538727dSKevin Tung sdbusplus::async::task<bool> TPMSoftwareManager::initDevice(
23*c538727dSKevin Tung const std::string& service, const std::string& path, SoftwareConfig& config)
24*c538727dSKevin Tung {
25*c538727dSKevin Tung const std::string configIface =
26*c538727dSKevin Tung "xyz.openbmc_project.Configuration." + config.configType;
27*c538727dSKevin Tung
28*c538727dSKevin Tung std::optional<uint8_t> tpmIndex = co_await dbusGetRequiredProperty<uint8_t>(
29*c538727dSKevin Tung ctx, service, path, configIface, "TPMIndex");
30*c538727dSKevin Tung
31*c538727dSKevin Tung if (!tpmIndex.has_value())
32*c538727dSKevin Tung {
33*c538727dSKevin Tung error("Missing property: TPMIndex");
34*c538727dSKevin Tung co_return false;
35*c538727dSKevin Tung }
36*c538727dSKevin Tung
37*c538727dSKevin Tung std::optional<std::string> type =
38*c538727dSKevin Tung co_await dbusGetRequiredProperty<std::string>(ctx, service, path,
39*c538727dSKevin Tung configIface, "Type");
40*c538727dSKevin Tung if (!type.has_value())
41*c538727dSKevin Tung {
42*c538727dSKevin Tung error("Missing property: Type");
43*c538727dSKevin Tung co_return false;
44*c538727dSKevin Tung }
45*c538727dSKevin Tung
46*c538727dSKevin Tung TPMType tpmType;
47*c538727dSKevin Tung if (!stringToTPMType(type.value(), tpmType))
48*c538727dSKevin Tung {
49*c538727dSKevin Tung error("Invalid TPM type: {TYPE}", "TYPE", type.value());
50*c538727dSKevin Tung co_return false;
51*c538727dSKevin Tung }
52*c538727dSKevin Tung
53*c538727dSKevin Tung debug("TPM device: TPM Index={INDEX}, Type={TYPE}", "INDEX",
54*c538727dSKevin Tung tpmIndex.value(), "TYPE", type.value());
55*c538727dSKevin Tung
56*c538727dSKevin Tung auto tpmDevice = std::make_unique<TPMDevice>(ctx, tpmType, tpmIndex.value(),
57*c538727dSKevin Tung config, this);
58*c538727dSKevin Tung
59*c538727dSKevin Tung std::unique_ptr<SoftwareInf::Software> software =
60*c538727dSKevin Tung std::make_unique<SoftwareInf::Software>(ctx, *tpmDevice);
61*c538727dSKevin Tung
62*c538727dSKevin Tung software->setVersion(co_await tpmDevice->getVersion());
63*c538727dSKevin Tung
64*c538727dSKevin Tung if (tpmDevice->isUpdateSupported())
65*c538727dSKevin Tung {
66*c538727dSKevin Tung std::set<RequestedApplyTimes> allowedApplyTimes = {
67*c538727dSKevin Tung RequestedApplyTimes::OnReset};
68*c538727dSKevin Tung
69*c538727dSKevin Tung software->enableUpdate(allowedApplyTimes);
70*c538727dSKevin Tung }
71*c538727dSKevin Tung
72*c538727dSKevin Tung tpmDevice->softwareCurrent = std::move(software);
73*c538727dSKevin Tung
74*c538727dSKevin Tung devices.insert({config.objectPath, std::move(tpmDevice)});
75*c538727dSKevin Tung
76*c538727dSKevin Tung co_return true;
77*c538727dSKevin Tung }
78*c538727dSKevin Tung
main()79*c538727dSKevin Tung int main()
80*c538727dSKevin Tung {
81*c538727dSKevin Tung sdbusplus::async::context ctx;
82*c538727dSKevin Tung
83*c538727dSKevin Tung TPMSoftwareManager tpmSoftwareManager(ctx);
84*c538727dSKevin Tung
85*c538727dSKevin Tung tpmSoftwareManager.start();
86*c538727dSKevin Tung return 0;
87*c538727dSKevin Tung }
88