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