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