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