xref: /openbmc/phosphor-bmc-code-mgmt/tpm/tpm_device.cpp (revision c538727d70f3673771f18e559d7ecab203abf6d3)
1*c538727dSKevin Tung #include "tpm_device.hpp"
2*c538727dSKevin Tung 
3*c538727dSKevin Tung #include "tpm2/tpm2.hpp"
4*c538727dSKevin Tung 
5*c538727dSKevin Tung #include <phosphor-logging/lg2.hpp>
6*c538727dSKevin Tung #include <sdbusplus/async.hpp>
7*c538727dSKevin Tung 
8*c538727dSKevin Tung PHOSPHOR_LOG2_USING;
9*c538727dSKevin Tung 
TPMDevice(sdbusplus::async::context & ctx,enum TPMType tpmType,uint8_t tpmIndex,SoftwareConfig & config,ManagerInf::SoftwareManager * parent)10*c538727dSKevin Tung TPMDevice::TPMDevice(sdbusplus::async::context& ctx, enum TPMType tpmType,
11*c538727dSKevin Tung                      uint8_t tpmIndex, SoftwareConfig& config,
12*c538727dSKevin Tung                      ManagerInf::SoftwareManager* parent) :
13*c538727dSKevin Tung     Device(ctx, config, parent, {RequestedApplyTimes::OnReset})
14*c538727dSKevin Tung {
15*c538727dSKevin Tung     switch (tpmType)
16*c538727dSKevin Tung     {
17*c538727dSKevin Tung         case TPMType::TPM2:
18*c538727dSKevin Tung             tpmInterface = std::make_unique<TPM2Interface>(ctx, tpmIndex);
19*c538727dSKevin Tung             break;
20*c538727dSKevin Tung         default:
21*c538727dSKevin Tung             tpmInterface = nullptr;
22*c538727dSKevin Tung             error("Unsupported TPM type: {TYPE}", "TYPE",
23*c538727dSKevin Tung                   static_cast<int>(tpmType));
24*c538727dSKevin Tung             break;
25*c538727dSKevin Tung     }
26*c538727dSKevin Tung }
27*c538727dSKevin Tung 
updateDevice(const uint8_t * image,size_t imageSize)28*c538727dSKevin Tung sdbusplus::async::task<bool> TPMDevice::updateDevice(const uint8_t* image,
29*c538727dSKevin Tung                                                      size_t imageSize)
30*c538727dSKevin Tung {
31*c538727dSKevin Tung     if (tpmInterface == nullptr)
32*c538727dSKevin Tung     {
33*c538727dSKevin Tung         error("TPM interface is not initialized");
34*c538727dSKevin Tung         co_return false;
35*c538727dSKevin Tung     }
36*c538727dSKevin Tung 
37*c538727dSKevin Tung     setUpdateProgress(10);
38*c538727dSKevin Tung 
39*c538727dSKevin Tung     if (!co_await tpmInterface->updateFirmware(image, imageSize))
40*c538727dSKevin Tung     {
41*c538727dSKevin Tung         error("Failed to update TPM firmware");
42*c538727dSKevin Tung         co_return false;
43*c538727dSKevin Tung     }
44*c538727dSKevin Tung 
45*c538727dSKevin Tung     setUpdateProgress(100);
46*c538727dSKevin Tung     debug("Successfully updated TPM");
47*c538727dSKevin Tung     co_return true;
48*c538727dSKevin Tung }
49*c538727dSKevin Tung 
getVersion()50*c538727dSKevin Tung sdbusplus::async::task<std::string> TPMDevice::getVersion()
51*c538727dSKevin Tung {
52*c538727dSKevin Tung     std::string version = "Unknown";
53*c538727dSKevin Tung 
54*c538727dSKevin Tung     if (tpmInterface == nullptr)
55*c538727dSKevin Tung     {
56*c538727dSKevin Tung         error("TPM interface is not initialized");
57*c538727dSKevin Tung         co_return version;
58*c538727dSKevin Tung     }
59*c538727dSKevin Tung 
60*c538727dSKevin Tung     if (!co_await tpmInterface->getVersion(version))
61*c538727dSKevin Tung     {
62*c538727dSKevin Tung         error("Failed to get TPM version");
63*c538727dSKevin Tung     }
64*c538727dSKevin Tung 
65*c538727dSKevin Tung     co_return version;
66*c538727dSKevin Tung }
67