blob: ce63f4f8c0c4c0afc37f186a5bd1e312297d47b6 [file] [log] [blame]
Cheng C Yang8c3fab62019-12-19 00:51:06 +08001/*
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#include "dimm.hpp"
18
19#include "mdrv2.hpp"
20
kasunath634ec6a2022-07-25 15:34:17 -070021#include <boost/algorithm/string.hpp>
kasunath2eca4fe2022-08-17 17:30:07 -070022#include <phosphor-logging/elog-errors.hpp>
Prithvi Pai6981b7f2025-04-02 10:33:29 +053023#include <phosphor-logging/lg2.hpp>
kasunath634ec6a2022-07-25 15:34:17 -070024
Tony Lee8f789c32024-07-10 20:01:43 +080025#include <fstream>
26#include <iostream>
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +000027#include <regex>
28
Cheng C Yang8c3fab62019-12-19 00:51:06 +080029namespace phosphor
30{
31namespace smbios
32{
33
John Edward Broadbentefd41542022-12-13 16:39:18 -080034#ifdef DIMM_ONLY_LOCATOR
35bool onlyDimmLocationCode = true;
36#else
37bool onlyDimmLocationCode = false;
38#endif
39
Cheng C Yang8c3fab62019-12-19 00:51:06 +080040using DeviceType =
Jason M. Bills33ae81f2023-04-26 09:06:08 -070041 sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::DeviceType;
Cheng C Yang8c3fab62019-12-19 00:51:06 +080042
kasunath2eca4fe2022-08-17 17:30:07 -070043using EccType =
Jason M. Bills33ae81f2023-04-26 09:06:08 -070044 sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::Ecc;
kasunath2eca4fe2022-08-17 17:30:07 -070045
Cheng C Yang8c3fab62019-12-19 00:51:06 +080046static constexpr uint16_t maxOldDimmSize = 0x7fff;
Tony Lee8f789c32024-07-10 20:01:43 +080047
48static constexpr const char* filename =
49 "/usr/share/smbios-mdr/memoryLocationTable.json";
50
Brandon Kim5a122a62023-05-04 04:25:03 +000051void Dimm::memoryInfoUpdate(uint8_t* smbiosTableStorage,
52 const std::string& motherboard)
Cheng C Yang8c3fab62019-12-19 00:51:06 +080053{
Brandon Kim5a122a62023-05-04 04:25:03 +000054 storage = smbiosTableStorage;
55 motherboardPath = motherboard;
56
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +080057 uint8_t* dataIn = storage;
Cheng C Yang8c3fab62019-12-19 00:51:06 +080058
59 dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType);
60
61 if (dataIn == nullptr)
62 {
63 return;
64 }
65 for (uint8_t index = 0; index < dimmNum; index++)
66 {
67 dataIn = smbiosNextPtr(dataIn);
68 if (dataIn == nullptr)
69 {
70 return;
71 }
72 dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType);
73 if (dataIn == nullptr)
74 {
75 return;
76 }
77 }
78
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +080079 auto memoryInfo = reinterpret_cast<struct MemoryInfo*>(dataIn);
Cheng C Yang8c3fab62019-12-19 00:51:06 +080080
81 memoryDataWidth(memoryInfo->dataWidth);
Joseph Fu410bbc22023-07-12 19:01:04 +080082 memoryTotalWidth(memoryInfo->totalWidth);
Cheng C Yang8c3fab62019-12-19 00:51:06 +080083
84 if (memoryInfo->size == maxOldDimmSize)
85 {
86 dimmSizeExt(memoryInfo->extendedSize);
87 }
88 else
89 {
90 dimmSize(memoryInfo->size);
91 }
Tom Tung39cc3682023-03-15 04:44:04 +080092 // If the size is 0, no memory device is installed in the socket.
93 const auto isDimmPresent = memoryInfo->size > 0;
94 present(isDimmPresent);
95 functional(isDimmPresent);
Cheng C Yang8c3fab62019-12-19 00:51:06 +080096
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +000097 dimmDeviceLocator(memoryInfo->bankLocator, memoryInfo->deviceLocator,
98 memoryInfo->length, dataIn);
Cheng C Yang8c3fab62019-12-19 00:51:06 +080099 dimmType(memoryInfo->memoryType);
100 dimmTypeDetail(memoryInfo->typeDetail);
101 maxMemorySpeedInMhz(memoryInfo->speed);
102 dimmManufacturer(memoryInfo->manufacturer, memoryInfo->length, dataIn);
103 dimmSerialNum(memoryInfo->serialNum, memoryInfo->length, dataIn);
104 dimmPartNum(memoryInfo->partNum, memoryInfo->length, dataIn);
105 memoryAttributes(memoryInfo->attributes);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000106 dimmMedia(memoryInfo->memoryTechnology);
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800107 memoryConfiguredSpeedInMhz(memoryInfo->confClockSpeed);
108
kasunath2eca4fe2022-08-17 17:30:07 -0700109 updateEccType(memoryInfo->phyArrayHandle);
110
Jie Yange7cf3192021-08-20 11:21:43 -0700111 if (!motherboardPath.empty())
112 {
113 std::vector<std::tuple<std::string, std::string, std::string>> assocs;
114 assocs.emplace_back("chassis", "memories", motherboardPath);
115 association::associations(assocs);
116 }
117
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800118 return;
119}
120
kasunath2eca4fe2022-08-17 17:30:07 -0700121void Dimm::updateEccType(uint16_t exPhyArrayHandle)
122{
123 uint8_t* dataIn = storage;
124
125 while (dataIn != nullptr)
126 {
127 dataIn = getSMBIOSTypePtr(dataIn, physicalMemoryArrayType);
128 if (dataIn == nullptr)
129 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530130 lg2::error("Failed to get SMBIOS table type-16 data.");
kasunath2eca4fe2022-08-17 17:30:07 -0700131 return;
132 }
133
134 auto info = reinterpret_cast<struct PhysicalMemoryArrayInfo*>(dataIn);
135 if (info->handle == exPhyArrayHandle)
136 {
137 std::map<uint8_t, EccType>::const_iterator it =
138 dimmEccTypeMap.find(info->memoryErrorCorrection);
139 if (it == dimmEccTypeMap.end())
140 {
141 ecc(EccType::NoECC);
142 }
143 else
144 {
145 ecc(it->second);
146 }
147 return;
148 }
149
150 dataIn = smbiosNextPtr(dataIn);
151 }
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530152 lg2::error(
153 "Failed find the corresponding SMBIOS table type-16 data for dimm: {DIMM}",
154 "DIMM", dimmNum);
kasunath2eca4fe2022-08-17 17:30:07 -0700155}
156
157EccType Dimm::ecc(EccType value)
158{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700159 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::ecc(
kasunath2eca4fe2022-08-17 17:30:07 -0700160 value);
161}
162
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800163uint16_t Dimm::memoryDataWidth(uint16_t value)
164{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700165 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800166 memoryDataWidth(value);
167}
168
Joseph Fu410bbc22023-07-12 19:01:04 +0800169uint16_t Dimm::memoryTotalWidth(uint16_t value)
170{
171 return sdbusplus::xyz::openbmc_project::Inventory::Item::server::Dimm::
172 memoryTotalWidth(value);
173}
174
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800175static constexpr uint16_t baseNewVersionDimmSize = 0x8000;
176static constexpr uint16_t dimmSizeUnit = 1024;
177void Dimm::dimmSize(const uint16_t size)
178{
Joseph Fu0b1d9422023-03-31 17:47:12 +0800179 uint32_t result = size & maxOldDimmSize;
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800180 if (0 == (size & baseNewVersionDimmSize))
181 {
182 result = result * dimmSizeUnit;
183 }
184 memorySizeInKB(result);
185}
186
Joseph Fu0b1d9422023-03-31 17:47:12 +0800187void Dimm::dimmSizeExt(uint32_t size)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800188{
189 size = size * dimmSizeUnit;
190 memorySizeInKB(size);
191}
192
Jason M. Billse7770992021-05-14 13:24:33 -0700193size_t Dimm::memorySizeInKB(size_t value)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800194{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700195 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800196 memorySizeInKB(value);
197}
198
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000199void Dimm::dimmDeviceLocator(const uint8_t bankLocatorPositionNum,
200 const uint8_t deviceLocatorPositionNum,
201 const uint8_t structLen, uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800202{
Patrick Williams1d73dcc2024-08-16 15:21:42 -0400203 std::string deviceLocator =
204 positionToString(deviceLocatorPositionNum, structLen, dataIn);
205 std::string bankLocator =
206 positionToString(bankLocatorPositionNum, structLen, dataIn);
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000207
208 std::string result;
John Edward Broadbentefd41542022-12-13 16:39:18 -0800209 if (bankLocator.empty() || onlyDimmLocationCode)
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000210 {
John Edward Broadbentefd41542022-12-13 16:39:18 -0800211 result = deviceLocator;
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000212 }
213 else
214 {
John Edward Broadbentefd41542022-12-13 16:39:18 -0800215 result = bankLocator + " " + deviceLocator;
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000216 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800217
218 memoryDeviceLocator(result);
Jie Yang31720392021-07-22 21:45:45 -0700219
220 locationCode(result);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000221 const std::string substrCpu = "CPU";
222 auto cpuPos = deviceLocator.find(substrCpu);
223
Tony Lee8f789c32024-07-10 20:01:43 +0800224 auto data = parseConfigFile();
225
226 if (!data.empty())
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000227 {
Tony Lee8f789c32024-07-10 20:01:43 +0800228 auto it = data.find(deviceLocator);
229
230 if (it != data.end())
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000231 {
Tony Lee8f789c32024-07-10 20:01:43 +0800232 uint8_t memoryControllerValue =
233 it.value()["MemoryController"].get<uint8_t>();
234 uint8_t socketValue = it.value()["Socket"].get<uint8_t>();
235 uint8_t slotValue = it.value()["Slot"].get<uint8_t>();
236 uint8_t channelValue = it.value()["Channel"].get<uint8_t>();
237
Chanh Nguyen9a6ac032025-01-09 07:03:15 +0000238 socket(socketValue);
239 memoryController(memoryControllerValue);
Tony Lee8f789c32024-07-10 20:01:43 +0800240 slot(slotValue);
241 channel(channelValue);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000242 }
Tony Lee8f789c32024-07-10 20:01:43 +0800243 else
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000244 {
Tony Lee8f789c32024-07-10 20:01:43 +0800245 socket(0);
246 memoryController(0);
247 slot(0);
248 channel(0);
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530249 lg2::error("Failed find the corresponding table for dimm {DIMM}",
250 "DIMM", deviceLocator.c_str());
Tony Lee8f789c32024-07-10 20:01:43 +0800251 }
252 }
253 else
254 {
255 if (cpuPos != std::string::npos)
256 {
257 std::string socketString =
258 deviceLocator.substr(cpuPos + substrCpu.length(), 1);
259 try
260 {
261 uint8_t socketNum =
262 static_cast<uint8_t>(std::stoi(socketString) + 1);
263 socket(socketNum);
264 }
265 catch (const sdbusplus::exception_t& ex)
266 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530267 lg2::error("std::stoi operation failed {ERROR}", "ERROR",
268 ex.what());
Tony Lee8f789c32024-07-10 20:01:43 +0800269 }
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000270 }
271 }
272
273 const std::string substrDimm = "DIMM";
274 auto dimmPos = deviceLocator.find(substrDimm);
275
276 if (dimmPos != std::string::npos)
277 {
278 std::string slotString =
279 deviceLocator.substr(dimmPos + substrDimm.length() + 1);
280 /* slotString is extracted from substrDimm (DIMM_A) if slotString is
281 * single alphabet like A, B , C.. then assign ASCII value of slotString
282 * to slot */
283 if ((std::regex_match(slotString, std::regex("^[A-Za-z]+$"))) &&
284 (slotString.length() == 1))
285 {
286 slot(static_cast<uint8_t>(toupper(slotString[0])));
287 }
288 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800289}
290
291std::string Dimm::memoryDeviceLocator(std::string value)
292{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700293 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800294 memoryDeviceLocator(value);
295}
296
297void Dimm::dimmType(const uint8_t type)
298{
299 std::map<uint8_t, DeviceType>::const_iterator it = dimmTypeTable.find(type);
300 if (it == dimmTypeTable.end())
301 {
302 memoryType(DeviceType::Unknown);
303 }
304 else
305 {
306 memoryType(it->second);
307 }
308}
309
310DeviceType Dimm::memoryType(DeviceType value)
311{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700312 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800313 memoryType(value);
314}
315
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000316void Dimm::dimmMedia(const uint8_t type)
317{
318 std::map<uint8_t, MemoryTechType>::const_iterator it =
319 dimmMemoryTechTypeMap.find(type);
320 if (it == dimmMemoryTechTypeMap.end())
321 {
322 memoryMedia(MemoryTechType::Unknown);
323 }
324 else
325 {
326 memoryMedia(it->second);
327 }
328}
329
330MemoryTechType Dimm::memoryMedia(MemoryTechType value)
331{
332 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
333 memoryMedia(value);
334}
335
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800336void Dimm::dimmTypeDetail(uint16_t detail)
337{
338 std::string result;
339 for (uint8_t index = 0; index < (8 * sizeof(detail)); index++)
340 {
341 if (detail & 0x01)
342 {
343 result += detailTable[index];
344 }
345 detail >>= 1;
346 }
347 memoryTypeDetail(result);
348}
349
350std::string Dimm::memoryTypeDetail(std::string value)
351{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700352 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800353 memoryTypeDetail(value);
354}
355
356uint16_t Dimm::maxMemorySpeedInMhz(uint16_t value)
357{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700358 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800359 maxMemorySpeedInMhz(value);
360}
361
362void Dimm::dimmManufacturer(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800363 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800364{
365 std::string result = positionToString(positionNum, structLen, dataIn);
366
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530367 if (result == "NO DIMM")
368 {
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530369 // No dimm presence so making manufacturer value as "" (instead of
370 // NO DIMM - as there won't be any manufacturer for DIMM which is not
371 // present).
372 result = "";
373 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800374 manufacturer(result);
375}
376
377std::string Dimm::manufacturer(std::string value)
378{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700379 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800380 Asset::manufacturer(value);
381}
382
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530383bool Dimm::present(bool value)
384{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700385 return sdbusplus::server::xyz::openbmc_project::inventory::Item::present(
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530386 value);
387}
388
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800389void Dimm::dimmSerialNum(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800390 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800391{
392 std::string result = positionToString(positionNum, structLen, dataIn);
393
394 serialNumber(result);
395}
396
397std::string Dimm::serialNumber(std::string value)
398{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700399 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800400 Asset::serialNumber(value);
401}
402
403void Dimm::dimmPartNum(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800404 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800405{
406 std::string result = positionToString(positionNum, structLen, dataIn);
407
kasunath634ec6a2022-07-25 15:34:17 -0700408 // Part number could contain spaces at the end. Eg: "abcd123 ". Since its
409 // unnecessary, we should remove them.
410 boost::algorithm::trim_right(result);
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800411 partNumber(result);
412}
413
414std::string Dimm::partNumber(std::string value)
415{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700416 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800417 Asset::partNumber(value);
418}
419
Jie Yang31720392021-07-22 21:45:45 -0700420std::string Dimm::locationCode(std::string value)
421{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700422 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Jie Yang31720392021-07-22 21:45:45 -0700423 LocationCode::locationCode(value);
424}
425
George Liu036374a2023-06-15 08:47:46 +0800426size_t Dimm::memoryAttributes(size_t value)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800427{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700428 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800429 memoryAttributes(value);
430}
431
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000432uint8_t Dimm::slot(uint8_t value)
433{
434 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
435 MemoryLocation::slot(value);
436}
437
Tony Lee8f789c32024-07-10 20:01:43 +0800438uint8_t Dimm::memoryController(uint8_t value)
439{
440 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
441 MemoryLocation::memoryController(value);
442}
443
444uint8_t Dimm::channel(uint8_t value)
445{
446 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
447 MemoryLocation::channel(value);
448}
449
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000450uint8_t Dimm::socket(uint8_t value)
451{
452 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
453 MemoryLocation::socket(value);
454}
455
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800456uint16_t Dimm::memoryConfiguredSpeedInMhz(uint16_t value)
457{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700458 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800459 memoryConfiguredSpeedInMhz(value);
460}
461
Tim Leedc469c72021-07-20 10:55:58 +0800462bool Dimm::functional(bool value)
463{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700464 return sdbusplus::server::xyz::openbmc_project::state::decorator::
Tim Leedc469c72021-07-20 10:55:58 +0800465 OperationalStatus::functional(value);
466}
467
Tony Lee8f789c32024-07-10 20:01:43 +0800468Json Dimm::parseConfigFile()
469{
470 std::ifstream memoryLocationFile(filename);
471
472 if (!memoryLocationFile.is_open())
473 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530474 lg2::error("config JSON file not found, FILENAME {FILENAME}",
475 "FILENAME", filename);
Tony Lee8f789c32024-07-10 20:01:43 +0800476 return {};
477 }
478
479 auto data = Json::parse(memoryLocationFile, nullptr, false);
480 if (data.is_discarded())
481 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530482 lg2::error("config readings JSON parser failure");
Tony Lee8f789c32024-07-10 20:01:43 +0800483 return {};
484 }
485
486 return data;
487}
488
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800489} // namespace smbios
490} // namespace phosphor