blob: 65890eda8d61ae8a2e7e6d58b7c2d3191a84c3e8 [file] [log] [blame]
Cheng C Yang3e3269a2019-12-02 15:11:30 +08001/*
Zhikui Ren18a5ab92020-09-01 21:35:20 -07002// Copyright (c) 2018 Intel Corporation
Cheng C Yang3e3269a2019-12-02 15:11:30 +08003//
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
Cheng C Yang43c6a1d2019-12-19 00:48:34 +080018#include "cpu.hpp"
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +080019#include "dimm.hpp"
Jie Yang08e4a6d2021-08-23 13:07:41 -070020#include "pcieslot.hpp"
Zhikui Ren18a5ab92020-09-01 21:35:20 -070021#include "smbios_mdrv2.hpp"
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +080022#include "system.hpp"
Cheng C Yang3e3269a2019-12-02 15:11:30 +080023
24#include <sys/stat.h>
25#include <sys/types.h>
26#include <unistd.h>
27
Zhikui Ren18a5ab92020-09-01 21:35:20 -070028#include <boost/asio/io_context.hpp>
29#include <boost/asio/steady_timer.hpp>
30#include <boost/container/flat_map.hpp>
Cheng C Yang3e3269a2019-12-02 15:11:30 +080031#include <phosphor-logging/elog-errors.hpp>
Alex Schendel5f2d6272021-09-22 10:35:40 -070032#include <phosphor-logging/lg2.hpp>
Cheng C Yang3e3269a2019-12-02 15:11:30 +080033#include <phosphor-logging/log.hpp>
Zhikui Ren18a5ab92020-09-01 21:35:20 -070034#include <sdbusplus/asio/object_server.hpp>
Cheng C Yang3e3269a2019-12-02 15:11:30 +080035#include <sdbusplus/server.hpp>
36#include <sdbusplus/timer.hpp>
Cheng C Yangeecaf822019-12-19 00:34:23 +080037#include <xyz/openbmc_project/Smbios/MDR_V2/server.hpp>
Cheng C Yang3e3269a2019-12-02 15:11:30 +080038
Zhikui Ren18a5ab92020-09-01 21:35:20 -070039sdbusplus::asio::object_server& getObjectServer(void);
Cheng C Yang3e3269a2019-12-02 15:11:30 +080040
Zhikui Ren18a5ab92020-09-01 21:35:20 -070041using RecordVariant =
42 std::variant<std::string, uint64_t, uint32_t, uint16_t, uint8_t>;
Cheng C Yang3e3269a2019-12-02 15:11:30 +080043namespace phosphor
44{
45namespace smbios
46{
47
Zhikui Ren18a5ab92020-09-01 21:35:20 -070048static constexpr const char* mdrV2Path = "/xyz/openbmc_project/Smbios/MDR_V2";
49static constexpr const char* smbiosPath = "/xyz/openbmc_project/Smbios";
50static constexpr const char* smbiosInterfaceName =
51 "xyz.openbmc_project.Smbios.GetRecordType";
Gobinath Krishnamoorthybb9c6222022-11-03 20:08:01 +000052static constexpr const char* mapperBusName = "xyz.openbmc_project.ObjectMapper";
53static constexpr const char* mapperPath = "/xyz/openbmc_project/object_mapper";
54static constexpr const char* mapperInterface =
55 "xyz.openbmc_project.ObjectMapper";
56static constexpr const char* systemInterfacePath =
57 "/xyz/openbmc_project/inventory/system";
58static constexpr const char* systemInterface =
59 "xyz.openbmc_project.Inventory.Item.System";
Zhikui Ren18a5ab92020-09-01 21:35:20 -070060constexpr const int limitEntryLen = 0xff;
61
Jason M. Billsa3f5b382023-04-26 08:17:28 -070062class MDRV2 :
Patrick Williams77b9c472022-07-22 19:26:57 -050063 sdbusplus::server::object_t<
Jason M. Bills33ae81f2023-04-26 09:06:08 -070064 sdbusplus::server::xyz::openbmc_project::smbios::MDRV2>
Cheng C Yang3e3269a2019-12-02 15:11:30 +080065{
66 public:
Jason M. Billsa3f5b382023-04-26 08:17:28 -070067 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;
Cheng C Yang3e3269a2019-12-02 15:11:30 +080073
Jason M. Billsa3f5b382023-04-26 08:17:28 -070074 MDRV2(sdbusplus::bus_t& bus, const char* path,
75 boost::asio::io_context& io) :
Patrick Williams77b9c472022-07-22 19:26:57 -050076 sdbusplus::server::object_t<
Jason M. Bills33ae81f2023-04-26 09:06:08 -070077 sdbusplus::server::xyz::openbmc_project::smbios::MDRV2>(bus, path),
Jonathan Domanf2d8bb42023-07-26 10:13:34 -070078 timer(io), bus(bus), smbiosInterface(getObjectServer().add_interface(
Zhikui Ren18a5ab92020-09-01 21:35:20 -070079 smbiosPath, smbiosInterfaceName))
Cheng C Yang3e3269a2019-12-02 15:11:30 +080080 {
Cheng C Yang3e3269a2019-12-02 15:11:30 +080081 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();
Zhikui Ren18a5ab92020-09-01 21:35:20 -070094
95 smbiosInterface->register_method("GetRecordType", [this](size_t type) {
96 return getRecordType(type);
97 });
98 smbiosInterface->initialize();
Cheng C Yang3e3269a2019-12-02 15:11:30 +080099 }
100
Cheng C Yangeecaf822019-12-19 00:34:23 +0800101 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
Zhikui Ren18a5ab92020-09-01 21:35:20 -0700124 std::vector<boost::container::flat_map<std::string, RecordVariant>>
125 getRecordType(size_t type);
126
Cheng C Yang3e3269a2019-12-02 15:11:30 +0800127 private:
Zhikui Ren18a5ab92020-09-01 21:35:20 -0700128 boost::asio::steady_timer timer;
Cheng C Yang3e3269a2019-12-02 15:11:30 +0800129
Patrick Williams77b9c472022-07-22 19:26:57 -0500130 sdbusplus::bus_t& bus;
Cheng C Yang3e3269a2019-12-02 15:11:30 +0800131
132 Mdr2DirStruct smbiosDir;
133
Cheng C Yangec634252019-12-19 00:42:36 +0800134 bool readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data);
Arun P. Mohanan0435a482022-02-01 21:45:55 +0530135 bool checkSMBIOSVersion(uint8_t* dataIn);
Cheng C Yangec634252019-12-19 00:42:36 +0800136
Cheng C Yang3e3269a2019-12-02 15:11:30 +0800137 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);
Cheng C Yang43c6a1d2019-12-19 00:48:34 +0800145
Jonathan Domanf2d8bb42023-07-26 10:13:34 -0700146 std::optional<size_t> getTotalCpuSlot(void);
147 std::optional<size_t> getTotalDimmSlot(void);
148 std::optional<size_t> getTotalPcieSlot(void);
Cheng C Yang43c6a1d2019-12-19 00:48:34 +0800149 std::vector<std::unique_ptr<Cpu>> cpus;
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800150 std::vector<std::unique_ptr<Dimm>> dimms;
Jie Yang08e4a6d2021-08-23 13:07:41 -0700151 std::vector<std::unique_ptr<Pcie>> pcies;
Cheng C Yangb4651b92019-12-19 00:59:01 +0800152 std::unique_ptr<System> system;
Zhikui Ren18a5ab92020-09-01 21:35:20 -0700153 std::shared_ptr<sdbusplus::asio::dbus_interface> smbiosInterface;
Cheng C Yang3e3269a2019-12-02 15:11:30 +0800154};
155
156} // namespace smbios
157} // namespace phosphor