xref: /openbmc/smbios-mdr/include/tpm.hpp (revision 6a84b4c81021742b79f5219a8925dfd98a29b9eb)
1 #pragma once
2 #include "smbios_mdrv2.hpp"
3 
4 #include <sdbusplus/asio/connection.hpp>
5 #include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
6 #include <xyz/openbmc_project/Inventory/Item/TrustedComponent/server.hpp>
7 #include <xyz/openbmc_project/Inventory/Item/server.hpp>
8 #include <xyz/openbmc_project/Software/Version/server.hpp>
9 
10 namespace phosphor
11 {
12 
13 namespace smbios
14 {
15 
16 using trustedComponent =
17     sdbusplus::server::xyz::openbmc_project::inventory::item::TrustedComponent;
18 using asset =
19     sdbusplus::server::xyz::openbmc_project::inventory::decorator::Asset;
20 using Item = sdbusplus::server::xyz::openbmc_project::inventory::Item;
21 using softwareversion =
22     sdbusplus::server::xyz::openbmc_project::software::Version;
23 
24 constexpr uint8_t tpmMajorVerion1 = 0x01;
25 constexpr uint8_t tpmMajorVerion2 = 0x02;
26 
27 class Tpm :
28     sdbusplus::server::object_t<trustedComponent, asset, Item, softwareversion>
29 {
30   public:
31     Tpm() = delete;
32     ~Tpm() = default;
33     Tpm(const Tpm&) = delete;
34     Tpm& operator=(const Tpm&) = delete;
35     Tpm(Tpm&&) = default;
36     Tpm& operator=(Tpm&&) = default;
37 
Tpm(sdbusplus::bus_t & bus,const std::string & objPath,const uint8_t tpmID,uint8_t * smbiosTableStorage,const std::string & motherboard)38     Tpm(sdbusplus::bus_t& bus, const std::string& objPath, const uint8_t tpmID,
39         uint8_t* smbiosTableStorage, const std::string& motherboard) :
40         sdbusplus::server::object_t<trustedComponent, asset, Item,
41                                     softwareversion>(bus, objPath.c_str()),
42         tpmId(tpmID), storage(smbiosTableStorage), motherboardPath(motherboard)
43     {
44         tpmInfoUpdate(smbiosTableStorage, motherboard);
45     }
46 
47     void tpmInfoUpdate(uint8_t* smbiosTableStorage,
48                        const std::string& motherboard);
49 
50   private:
51     uint8_t tpmId;
52 
53     uint8_t* storage;
54 
55     std::string motherboardPath;
56     struct TPMInfo
57     {
58         uint8_t type;
59         uint8_t length;
60         uint16_t handle;
61         char vendor[4];
62         uint8_t specMajor;
63         uint8_t specMinor;
64         uint32_t firmwareVersion1;
65         uint32_t firmwareVersion2;
66         uint8_t description;
67         uint64_t characteristics;
68         uint32_t oem;
69     } __attribute__((packed));
70 
71     struct TPMVersionSpec1
72     {
73         uint8_t specMajor;
74         uint8_t specMinor;
75         uint8_t revMajor;
76         uint8_t revMinor;
77     } __attribute__((packed));
78 
79     struct TPMVersionSpec2
80     {
81         uint16_t revMinor;
82         uint16_t revMajor;
83     } __attribute__((packed));
84 
85     void tpmVendor(const struct TPMInfo* tpmInfo);
86     void tpmFirmwareVersion(const struct TPMInfo* tpmInfo);
87     void tpmDescription(const uint8_t positionNum, const uint8_t structLen,
88                         uint8_t* dataIn);
89 };
90 
91 } // namespace smbios
92 
93 } // namespace phosphor
94