blob: a6e220eaf7d7837ae0f0fcc31b922b34960547b3 [file] [log] [blame]
#pragma once
#include "common/include/device.hpp"
#include "common/include/software_manager.hpp"
#include <sdbusplus/async.hpp>
#include <unordered_map>
namespace SoftwareInf = phosphor::software;
namespace ManagerInf = SoftwareInf::manager;
enum class TPMType
{
TPM2,
};
class TPMInterface
{
public:
TPMInterface(sdbusplus::async::context& ctx, uint8_t tpmIndex) :
ctx(ctx), tpmIndex(tpmIndex)
{}
virtual ~TPMInterface() = default;
TPMInterface(const TPMInterface&) = delete;
TPMInterface& operator=(const TPMInterface&) = delete;
TPMInterface(TPMInterface&&) = delete;
TPMInterface& operator=(TPMInterface&&) = delete;
virtual bool isUpdateSupported() const = 0;
virtual sdbusplus::async::task<bool> getVersion(std::string& version) = 0;
virtual sdbusplus::async::task<bool> updateFirmware(const uint8_t* image,
size_t imageSize) = 0;
protected:
sdbusplus::async::context& ctx;
uint8_t tpmIndex;
};
class TPMDevice : public Device
{
public:
using Device::softwareCurrent;
TPMDevice(sdbusplus::async::context& ctx, enum TPMType tpmType,
uint8_t tpmIndex, SoftwareConfig& config,
ManagerInf::SoftwareManager* parent);
sdbusplus::async::task<bool> updateDevice(const uint8_t* image,
size_t image_size) final;
sdbusplus::async::task<std::string> getVersion();
bool isUpdateSupported() const
{
return tpmInterface ? tpmInterface->isUpdateSupported() : false;
}
private:
std::unique_ptr<TPMInterface> tpmInterface;
};
inline bool stringToTPMType(const std::string& type, TPMType& tpmType)
{
static const std::unordered_map<std::string, TPMType> tpmTypeMap = {
{"TPM2Firmware", TPMType::TPM2},
};
auto it = tpmTypeMap.find(type);
if (it != tpmTypeMap.end())
{
tpmType = it->second;
return true;
}
return false;
}