blob: 227cd849e5d4ffcb8c096004af4f10868f363d58 [file] [log] [blame]
#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;
}