xref: /openbmc/smbios-mdr/include/mdrv2.hpp (revision a3f5b385)
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::xyz::openbmc_project::Smbios::server::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::xyz::openbmc_project::Smbios::server::MDRV2>(bus, path),
78         bus(bus), timer(io), smbiosInterface(getObjectServer().add_interface(
79                                  smbiosPath, smbiosInterfaceName))
80     {
81 
82         smbiosDir.agentVersion = smbiosAgentVersion;
83         smbiosDir.dirVersion = 1;
84         smbiosDir.dirEntries = 1;
85         directoryEntries(smbiosDir.dirEntries);
86         smbiosDir.status = 1;
87         smbiosDir.remoteDirVersion = 0;
88 
89         std::copy(smbiosTableId.begin(), smbiosTableId.end(),
90                   smbiosDir.dir[smbiosDirIndex].common.id.dataInfo);
91 
92         smbiosDir.dir[smbiosDirIndex].dataStorage = smbiosTableStorage;
93 
94         agentSynchronizeData();
95 
96         smbiosInterface->register_method("GetRecordType", [this](size_t type) {
97             return getRecordType(type);
98         });
99         smbiosInterface->initialize();
100     }
101 
102     std::vector<uint8_t> getDirectoryInformation(uint8_t dirIndex) override;
103 
104     std::vector<uint8_t> getDataInformation(uint8_t idIndex) override;
105 
106     bool sendDirectoryInformation(uint8_t dirVersion, uint8_t dirIndex,
107                                   uint8_t returnedEntries,
108                                   uint8_t remainingEntries,
109                                   std::vector<uint8_t> dirEntry) override;
110 
111     std::vector<uint8_t> getDataOffer() override;
112 
113     bool sendDataInformation(uint8_t idIndex, uint8_t flag, uint32_t dataLen,
114                              uint32_t dataVer, uint32_t timeStamp) override;
115 
116     int findIdIndex(std::vector<uint8_t> dataInfo) override;
117 
118     bool agentSynchronizeData() override;
119 
120     std::vector<uint32_t>
121         synchronizeDirectoryCommonData(uint8_t idIndex, uint32_t size) override;
122 
123     uint8_t directoryEntries(uint8_t value) override;
124 
125     std::vector<boost::container::flat_map<std::string, RecordVariant>>
126         getRecordType(size_t type);
127 
128   private:
129     boost::asio::steady_timer timer;
130 
131     sdbusplus::bus_t& bus;
132 
133     Mdr2DirStruct smbiosDir;
134 
135     bool readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data);
136     bool checkSMBIOSVersion(uint8_t* dataIn);
137 
138     const std::array<uint8_t, 16> smbiosTableId{
139         40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0x42};
140     uint8_t smbiosTableStorage[smbiosTableStorageSize];
141 
142     bool smbiosIsUpdating(uint8_t index);
143     bool smbiosIsAvailForUpdate(uint8_t index);
144     inline uint8_t smbiosValidFlag(uint8_t index);
145     void systemInfoUpdate(void);
146 
147     int getTotalCpuSlot(void);
148     int getTotalDimmSlot(void);
149     int getTotalPcieSlot(void);
150     std::vector<std::unique_ptr<Cpu>> cpus;
151     std::vector<std::unique_ptr<Dimm>> dimms;
152     std::vector<std::unique_ptr<Pcie>> pcies;
153     std::unique_ptr<System> system;
154     std::shared_ptr<sdbusplus::asio::dbus_interface> smbiosInterface;
155 };
156 
157 } // namespace smbios
158 } // namespace phosphor
159