xref: /openbmc/smbios-mdr/include/mdrv2.hpp (revision eecaf8205f1dd31203a562353b1ed3a00f1eff5b)
1 /*
2 // Copyright (c) 2019 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 
17 #pragma once
18 
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #include <unistd.h>
22 
23 #include <phosphor-logging/elog-errors.hpp>
24 #include <phosphor-logging/log.hpp>
25 #include <sdbusplus/server.hpp>
26 #include <sdbusplus/timer.hpp>
27 #include <smbios.hpp>
28 #include <xyz/openbmc_project/Smbios/MDR_V2/server.hpp>
29 
30 static constexpr uint8_t mdr2Version = 2;
31 static constexpr uint32_t mdr2SMSize = 0x00100000;
32 static constexpr uint32_t mdr2SMBaseAddress = 0x9FF00000;
33 static constexpr const char* mdrType2File = "/var/lib/smbios/smbios2";
34 static constexpr const char* mdrV2Path = "/xyz/openbmc_project/Smbios/MDR_V2";
35 
36 enum class MDR2SMBIOSStatusEnum
37 {
38     mdr2Init = 0,
39     mdr2Loaded = 1,
40     mdr2Updated = 2,
41     mdr2Updating = 3
42 };
43 
44 enum class MDR2DirLockEnum
45 {
46     mdr2DirUnlock = 0,
47     mdr2DirLock = 1
48 };
49 
50 typedef struct
51 {
52     uint8_t dataInfo[16];
53 } DataIdStruct;
54 
55 typedef struct
56 {
57     DataIdStruct id;
58     uint32_t size;
59     uint32_t dataSetSize;
60     uint32_t dataVersion;
61     uint32_t timestamp;
62 } Mdr2DirEntry;
63 
64 typedef struct
65 {
66     Mdr2DirEntry common;
67     MDR2SMBIOSStatusEnum stage;
68     MDR2DirLockEnum lock;
69     uint16_t lockHandle;
70     uint32_t xferBuff;
71     uint32_t xferSize;
72     uint32_t maxDataSize;
73     uint8_t* dataStorage;
74 } Mdr2DirLocalStruct;
75 
76 typedef struct
77 {
78     uint8_t agentVersion;
79     uint8_t dirVersion;
80     uint8_t dirEntries;
81     uint8_t status; // valid / locked / etc
82     uint8_t remoteDirVersion;
83     uint16_t sessionHandle;
84     Mdr2DirLocalStruct dir[maxDirEntries];
85 } Mdr2DirStruct;
86 
87 struct MDRSMBIOSHeader
88 {
89     uint8_t dirVer;
90     uint8_t mdrType;
91     uint32_t timestamp;
92     uint32_t dataSize;
93 } __attribute__((packed));
94 
95 namespace phosphor
96 {
97 namespace smbios
98 {
99 
100 class MDR_V2 : sdbusplus::server::object::object<
101                    sdbusplus::xyz::openbmc_project::Smbios::server::MDR_V2>
102 {
103   public:
104     MDR_V2() = delete;
105     MDR_V2(const MDR_V2&) = delete;
106     MDR_V2& operator=(const MDR_V2&) = delete;
107     MDR_V2(MDR_V2&&) = delete;
108     MDR_V2& operator=(MDR_V2&&) = delete;
109     ~MDR_V2() = default;
110 
111     MDR_V2(sdbusplus::bus::bus& bus, const char* path, sd_event* event) :
112         sdbusplus::server::object::object<
113             sdbusplus::xyz::openbmc_project::Smbios::server::MDR_V2>(bus, path),
114         bus(bus), timer(event, [&](void) { agentSynchronizeData(); })
115     {
116 
117         smbiosDir.agentVersion = smbiosAgentVersion;
118         smbiosDir.dirVersion = 1;
119         smbiosDir.dirEntries = 1;
120         directoryEntries(smbiosDir.dirEntries);
121         smbiosDir.status = 1;
122         smbiosDir.remoteDirVersion = 0;
123 
124         std::copy(smbiosTableId.begin(), smbiosTableId.end(),
125                   smbiosDir.dir[smbiosDirIndex].common.id.dataInfo);
126 
127         smbiosDir.dir[smbiosDirIndex].dataStorage = smbiosTableStorage;
128 
129         agentSynchronizeData();
130     }
131 
132     std::vector<uint8_t> getDirectoryInformation(uint8_t dirIndex) override;
133 
134     std::vector<uint8_t> getDataInformation(uint8_t idIndex) override;
135 
136     bool sendDirectoryInformation(uint8_t dirVersion, uint8_t dirIndex,
137                                   uint8_t returnedEntries,
138                                   uint8_t remainingEntries,
139                                   std::vector<uint8_t> dirEntry) override;
140 
141     std::vector<uint8_t> getDataOffer() override;
142 
143     bool sendDataInformation(uint8_t idIndex, uint8_t flag, uint32_t dataLen,
144                              uint32_t dataVer, uint32_t timeStamp) override;
145 
146     int findIdIndex(std::vector<uint8_t> dataInfo) override;
147 
148     bool agentSynchronizeData() override;
149 
150     std::vector<uint32_t>
151         synchronizeDirectoryCommonData(uint8_t idIndex, uint32_t size) override;
152 
153     uint8_t directoryEntries(uint8_t value) override;
154 
155   private:
156     Timer timer;
157 
158     sdbusplus::bus::bus& bus;
159 
160     Mdr2DirStruct smbiosDir;
161 
162     const std::array<uint8_t, 16> smbiosTableId{
163         40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0x42};
164     uint8_t smbiosTableStorage[smbiosTableStorageSize];
165 
166     bool smbiosIsUpdating(uint8_t index);
167     bool smbiosIsAvailForUpdate(uint8_t index);
168     inline uint8_t smbiosValidFlag(uint8_t index);
169     void systemInfoUpdate(void);
170 };
171 
172 } // namespace smbios
173 } // namespace phosphor
174