xref: /openbmc/phosphor-bmc-code-mgmt/tpm/tpm_software_manager.cpp (revision c538727d70f3673771f18e559d7ecab203abf6d3)
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