1*c538727dSKevin Tung #pragma once
2*c538727dSKevin Tung
3*c538727dSKevin Tung #include "common/include/device.hpp"
4*c538727dSKevin Tung #include "common/include/software_manager.hpp"
5*c538727dSKevin Tung
6*c538727dSKevin Tung #include <sdbusplus/async.hpp>
7*c538727dSKevin Tung
8*c538727dSKevin Tung #include <unordered_map>
9*c538727dSKevin Tung
10*c538727dSKevin Tung namespace SoftwareInf = phosphor::software;
11*c538727dSKevin Tung namespace ManagerInf = SoftwareInf::manager;
12*c538727dSKevin Tung
13*c538727dSKevin Tung enum class TPMType
14*c538727dSKevin Tung {
15*c538727dSKevin Tung TPM2,
16*c538727dSKevin Tung };
17*c538727dSKevin Tung
18*c538727dSKevin Tung class TPMInterface
19*c538727dSKevin Tung {
20*c538727dSKevin Tung public:
TPMInterface(sdbusplus::async::context & ctx,uint8_t tpmIndex)21*c538727dSKevin Tung TPMInterface(sdbusplus::async::context& ctx, uint8_t tpmIndex) :
22*c538727dSKevin Tung ctx(ctx), tpmIndex(tpmIndex)
23*c538727dSKevin Tung {}
24*c538727dSKevin Tung virtual ~TPMInterface() = default;
25*c538727dSKevin Tung TPMInterface(const TPMInterface&) = delete;
26*c538727dSKevin Tung TPMInterface& operator=(const TPMInterface&) = delete;
27*c538727dSKevin Tung TPMInterface(TPMInterface&&) = delete;
28*c538727dSKevin Tung TPMInterface& operator=(TPMInterface&&) = delete;
29*c538727dSKevin Tung
30*c538727dSKevin Tung virtual bool isUpdateSupported() const = 0;
31*c538727dSKevin Tung virtual sdbusplus::async::task<bool> getVersion(std::string& version) = 0;
32*c538727dSKevin Tung virtual sdbusplus::async::task<bool> updateFirmware(const uint8_t* image,
33*c538727dSKevin Tung size_t imageSize) = 0;
34*c538727dSKevin Tung
35*c538727dSKevin Tung protected:
36*c538727dSKevin Tung sdbusplus::async::context& ctx;
37*c538727dSKevin Tung uint8_t tpmIndex;
38*c538727dSKevin Tung };
39*c538727dSKevin Tung
40*c538727dSKevin Tung class TPMDevice : public Device
41*c538727dSKevin Tung {
42*c538727dSKevin Tung public:
43*c538727dSKevin Tung using Device::softwareCurrent;
44*c538727dSKevin Tung
45*c538727dSKevin Tung TPMDevice(sdbusplus::async::context& ctx, enum TPMType tpmType,
46*c538727dSKevin Tung uint8_t tpmIndex, SoftwareConfig& config,
47*c538727dSKevin Tung ManagerInf::SoftwareManager* parent);
48*c538727dSKevin Tung
49*c538727dSKevin Tung sdbusplus::async::task<bool> updateDevice(const uint8_t* image,
50*c538727dSKevin Tung size_t image_size) final;
51*c538727dSKevin Tung
52*c538727dSKevin Tung sdbusplus::async::task<std::string> getVersion();
53*c538727dSKevin Tung
isUpdateSupported() const54*c538727dSKevin Tung bool isUpdateSupported() const
55*c538727dSKevin Tung {
56*c538727dSKevin Tung return tpmInterface ? tpmInterface->isUpdateSupported() : false;
57*c538727dSKevin Tung }
58*c538727dSKevin Tung
59*c538727dSKevin Tung private:
60*c538727dSKevin Tung std::unique_ptr<TPMInterface> tpmInterface;
61*c538727dSKevin Tung };
62*c538727dSKevin Tung
stringToTPMType(const std::string & type,TPMType & tpmType)63*c538727dSKevin Tung inline bool stringToTPMType(const std::string& type, TPMType& tpmType)
64*c538727dSKevin Tung {
65*c538727dSKevin Tung static const std::unordered_map<std::string, TPMType> tpmTypeMap = {
66*c538727dSKevin Tung {"TPM2Firmware", TPMType::TPM2},
67*c538727dSKevin Tung };
68*c538727dSKevin Tung
69*c538727dSKevin Tung auto it = tpmTypeMap.find(type);
70*c538727dSKevin Tung if (it != tpmTypeMap.end())
71*c538727dSKevin Tung {
72*c538727dSKevin Tung tpmType = it->second;
73*c538727dSKevin Tung return true;
74*c538727dSKevin Tung }
75*c538727dSKevin Tung return false;
76*c538727dSKevin Tung }
77