| #include "tpm_software_manager.hpp" | 
 |  | 
 | #include "common/include/dbus_helper.hpp" | 
 | #include "tpm_device.hpp" | 
 |  | 
 | #include <phosphor-logging/lg2.hpp> | 
 |  | 
 | PHOSPHOR_LOG2_USING; | 
 |  | 
 | namespace SoftwareInf = phosphor::software; | 
 |  | 
 | void TPMSoftwareManager::start() | 
 | { | 
 |     std::vector<std::string> configIntfs = { | 
 |         "xyz.openbmc_project.Configuration.TPM2Firmware", | 
 |     }; | 
 |  | 
 |     ctx.spawn(initDevices(configIntfs)); | 
 |     ctx.run(); | 
 | } | 
 |  | 
 | sdbusplus::async::task<bool> TPMSoftwareManager::initDevice( | 
 |     const std::string& service, const std::string& path, SoftwareConfig& config) | 
 | { | 
 |     const std::string configIface = | 
 |         "xyz.openbmc_project.Configuration." + config.configType; | 
 |  | 
 |     std::optional<uint8_t> tpmIndex = co_await dbusGetRequiredProperty<uint8_t>( | 
 |         ctx, service, path, configIface, "TPMIndex"); | 
 |  | 
 |     if (!tpmIndex.has_value()) | 
 |     { | 
 |         error("Missing property: TPMIndex"); | 
 |         co_return false; | 
 |     } | 
 |  | 
 |     std::optional<std::string> type = | 
 |         co_await dbusGetRequiredProperty<std::string>(ctx, service, path, | 
 |                                                       configIface, "Type"); | 
 |     if (!type.has_value()) | 
 |     { | 
 |         error("Missing property: Type"); | 
 |         co_return false; | 
 |     } | 
 |  | 
 |     TPMType tpmType; | 
 |     if (!stringToTPMType(type.value(), tpmType)) | 
 |     { | 
 |         error("Invalid TPM type: {TYPE}", "TYPE", type.value()); | 
 |         co_return false; | 
 |     } | 
 |  | 
 |     debug("TPM device: TPM Index={INDEX}, Type={TYPE}", "INDEX", | 
 |           tpmIndex.value(), "TYPE", type.value()); | 
 |  | 
 |     auto tpmDevice = std::make_unique<TPMDevice>(ctx, tpmType, tpmIndex.value(), | 
 |                                                  config, this); | 
 |  | 
 |     std::unique_ptr<SoftwareInf::Software> software = | 
 |         std::make_unique<SoftwareInf::Software>(ctx, *tpmDevice); | 
 |  | 
 |     software->setVersion(co_await tpmDevice->getVersion()); | 
 |  | 
 |     if (tpmDevice->isUpdateSupported()) | 
 |     { | 
 |         std::set<RequestedApplyTimes> allowedApplyTimes = { | 
 |             RequestedApplyTimes::OnReset}; | 
 |  | 
 |         software->enableUpdate(allowedApplyTimes); | 
 |     } | 
 |  | 
 |     tpmDevice->softwareCurrent = std::move(software); | 
 |  | 
 |     devices.insert({config.objectPath, std::move(tpmDevice)}); | 
 |  | 
 |     co_return true; | 
 | } | 
 |  | 
 | int main() | 
 | { | 
 |     sdbusplus::async::context ctx; | 
 |  | 
 |     TPMSoftwareManager tpmSoftwareManager(ctx); | 
 |  | 
 |     tpmSoftwareManager.start(); | 
 |     return 0; | 
 | } |