xref: /openbmc/phosphor-bmc-code-mgmt/tpm/tpm_device.hpp (revision c538727d70f3673771f18e559d7ecab203abf6d3)
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