xref: /openbmc/smbios-mdr/include/mdrv2.hpp (revision c39d3dfc)
1 /*
2 // Copyright (c) 2018 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 #include "cpu.hpp"
19 #include "dimm.hpp"
20 #include "pcieslot.hpp"
21 #include "smbios_mdrv2.hpp"
22 #include "system.hpp"
23 
24 #include <sys/stat.h>
25 #include <sys/types.h>
26 #include <unistd.h>
27 
28 #include <boost/asio/io_context.hpp>
29 #include <boost/asio/steady_timer.hpp>
30 #include <boost/container/flat_map.hpp>
31 #include <phosphor-logging/elog-errors.hpp>
32 #include <phosphor-logging/lg2.hpp>
33 #include <phosphor-logging/log.hpp>
34 #include <sdbusplus/asio/object_server.hpp>
35 #include <sdbusplus/server.hpp>
36 #include <sdbusplus/timer.hpp>
37 #include <xyz/openbmc_project/Smbios/MDR_V2/server.hpp>
38 
39 sdbusplus::asio::object_server& getObjectServer(void);
40 
41 using RecordVariant =
42     std::variant<std::string, uint64_t, uint32_t, uint16_t, uint8_t>;
43 namespace phosphor
44 {
45 namespace smbios
46 {
47 
48 static constexpr const char* mdrV2Path = "/xyz/openbmc_project/Smbios/MDR_V2";
49 static constexpr const char* smbiosPath = "/xyz/openbmc_project/Smbios";
50 static constexpr const char* smbiosInterfaceName =
51     "xyz.openbmc_project.Smbios.GetRecordType";
52 static constexpr const char* mapperBusName = "xyz.openbmc_project.ObjectMapper";
53 static constexpr const char* mapperPath = "/xyz/openbmc_project/object_mapper";
54 static constexpr const char* mapperInterface =
55     "xyz.openbmc_project.ObjectMapper";
56 static constexpr const char* systemInterfacePath =
57     "/xyz/openbmc_project/inventory/system";
58 static constexpr const char* systemInterface =
59     "xyz.openbmc_project.Inventory.Item.System";
60 constexpr const int limitEntryLen = 0xff;
61 
62 class MDRV2 :
63     sdbusplus::server::object_t<
64         sdbusplus::server::xyz::openbmc_project::smbios::MDRV2>
65 {
66   public:
67     MDRV2() = delete;
68     MDRV2(const MDRV2&) = delete;
69     MDRV2& operator=(const MDRV2&) = delete;
70     MDRV2(MDRV2&&) = delete;
71     MDRV2& operator=(MDRV2&&) = delete;
72     ~MDRV2() = default;
73 
74     MDRV2(sdbusplus::bus_t& bus, const char* path,
75           boost::asio::io_context& io) :
76         sdbusplus::server::object_t<
77             sdbusplus::server::xyz::openbmc_project::smbios::MDRV2>(bus, path),
78         bus(bus), timer(io), smbiosInterface(getObjectServer().add_interface(
79                                  smbiosPath, smbiosInterfaceName))
80     {
81         smbiosDir.agentVersion = smbiosAgentVersion;
82         smbiosDir.dirVersion = 1;
83         smbiosDir.dirEntries = 1;
84         directoryEntries(smbiosDir.dirEntries);
85         smbiosDir.status = 1;
86         smbiosDir.remoteDirVersion = 0;
87 
88         std::copy(smbiosTableId.begin(), smbiosTableId.end(),
89                   smbiosDir.dir[smbiosDirIndex].common.id.dataInfo);
90 
91         smbiosDir.dir[smbiosDirIndex].dataStorage = smbiosTableStorage;
92 
93         agentSynchronizeData();
94 
95         smbiosInterface->register_method("GetRecordType", [this](size_t type) {
96             return getRecordType(type);
97         });
98         smbiosInterface->initialize();
99     }
100 
101     std::vector<uint8_t> getDirectoryInformation(uint8_t dirIndex) override;
102 
103     std::vector<uint8_t> getDataInformation(uint8_t idIndex) override;
104 
105     bool sendDirectoryInformation(uint8_t dirVersion, uint8_t dirIndex,
106                                   uint8_t returnedEntries,
107                                   uint8_t remainingEntries,
108                                   std::vector<uint8_t> dirEntry) override;
109 
110     std::vector<uint8_t> getDataOffer() override;
111 
112     bool sendDataInformation(uint8_t idIndex, uint8_t flag, uint32_t dataLen,
113                              uint32_t dataVer, uint32_t timeStamp) override;
114 
115     int findIdIndex(std::vector<uint8_t> dataInfo) override;
116 
117     bool agentSynchronizeData() override;
118 
119     std::vector<uint32_t>
120         synchronizeDirectoryCommonData(uint8_t idIndex, uint32_t size) override;
121 
122     uint8_t directoryEntries(uint8_t value) override;
123 
124     std::vector<boost::container::flat_map<std::string, RecordVariant>>
125         getRecordType(size_t type);
126 
127   private:
128     boost::asio::steady_timer timer;
129 
130     sdbusplus::bus_t& bus;
131 
132     Mdr2DirStruct smbiosDir;
133 
134     bool readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data);
135     bool checkSMBIOSVersion(uint8_t* dataIn);
136 
137     const std::array<uint8_t, 16> smbiosTableId{
138         40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0x42};
139     uint8_t smbiosTableStorage[smbiosTableStorageSize];
140 
141     bool smbiosIsUpdating(uint8_t index);
142     bool smbiosIsAvailForUpdate(uint8_t index);
143     inline uint8_t smbiosValidFlag(uint8_t index);
144     void systemInfoUpdate(void);
145 
146     int getTotalCpuSlot(void);
147     int getTotalDimmSlot(void);
148     int getTotalPcieSlot(void);
149     std::vector<std::unique_ptr<Cpu>> cpus;
150     std::vector<std::unique_ptr<Dimm>> dimms;
151     std::vector<std::unique_ptr<Pcie>> pcies;
152     std::unique_ptr<System> system;
153     std::shared_ptr<sdbusplus::asio::dbus_interface> smbiosInterface;
154 };
155 
156 } // namespace smbios
157 } // namespace phosphor
158