blob: f6228c9f8a084763365f660471eae602abfc5143 [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);
Prithvi Pai1aea7e42025-04-11 15:00:26 +0530102 updateFormFactor(memoryInfo->formFactor);
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800103 dimmManufacturer(memoryInfo->manufacturer, memoryInfo->length, dataIn);
104 dimmSerialNum(memoryInfo->serialNum, memoryInfo->length, dataIn);
105 dimmPartNum(memoryInfo->partNum, memoryInfo->length, dataIn);
106 memoryAttributes(memoryInfo->attributes);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000107 dimmMedia(memoryInfo->memoryTechnology);
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800108 memoryConfiguredSpeedInMhz(memoryInfo->confClockSpeed);
109
kasunath2eca4fe2022-08-17 17:30:07 -0700110 updateEccType(memoryInfo->phyArrayHandle);
111
Jie Yange7cf3192021-08-20 11:21:43 -0700112 if (!motherboardPath.empty())
113 {
114 std::vector<std::tuple<std::string, std::string, std::string>> assocs;
115 assocs.emplace_back("chassis", "memories", motherboardPath);
116 association::associations(assocs);
117 }
118
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800119 return;
120}
121
kasunath2eca4fe2022-08-17 17:30:07 -0700122void Dimm::updateEccType(uint16_t exPhyArrayHandle)
123{
124 uint8_t* dataIn = storage;
125
126 while (dataIn != nullptr)
127 {
128 dataIn = getSMBIOSTypePtr(dataIn, physicalMemoryArrayType);
129 if (dataIn == nullptr)
130 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530131 lg2::error("Failed to get SMBIOS table type-16 data.");
kasunath2eca4fe2022-08-17 17:30:07 -0700132 return;
133 }
134
135 auto info = reinterpret_cast<struct PhysicalMemoryArrayInfo*>(dataIn);
136 if (info->handle == exPhyArrayHandle)
137 {
138 std::map<uint8_t, EccType>::const_iterator it =
139 dimmEccTypeMap.find(info->memoryErrorCorrection);
140 if (it == dimmEccTypeMap.end())
141 {
142 ecc(EccType::NoECC);
143 }
144 else
145 {
146 ecc(it->second);
147 }
148 return;
149 }
150
151 dataIn = smbiosNextPtr(dataIn);
152 }
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530153 lg2::error(
154 "Failed find the corresponding SMBIOS table type-16 data for dimm: {DIMM}",
155 "DIMM", dimmNum);
kasunath2eca4fe2022-08-17 17:30:07 -0700156}
157
158EccType Dimm::ecc(EccType value)
159{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700160 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::ecc(
kasunath2eca4fe2022-08-17 17:30:07 -0700161 value);
162}
163
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800164uint16_t Dimm::memoryDataWidth(uint16_t value)
165{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700166 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800167 memoryDataWidth(value);
168}
169
Joseph Fu410bbc22023-07-12 19:01:04 +0800170uint16_t Dimm::memoryTotalWidth(uint16_t value)
171{
172 return sdbusplus::xyz::openbmc_project::Inventory::Item::server::Dimm::
173 memoryTotalWidth(value);
174}
175
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800176static constexpr uint16_t baseNewVersionDimmSize = 0x8000;
177static constexpr uint16_t dimmSizeUnit = 1024;
178void Dimm::dimmSize(const uint16_t size)
179{
Joseph Fu0b1d9422023-03-31 17:47:12 +0800180 uint32_t result = size & maxOldDimmSize;
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800181 if (0 == (size & baseNewVersionDimmSize))
182 {
183 result = result * dimmSizeUnit;
184 }
185 memorySizeInKB(result);
186}
187
Joseph Fu0b1d9422023-03-31 17:47:12 +0800188void Dimm::dimmSizeExt(uint32_t size)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800189{
190 size = size * dimmSizeUnit;
191 memorySizeInKB(size);
192}
193
Jason M. Billse7770992021-05-14 13:24:33 -0700194size_t Dimm::memorySizeInKB(size_t value)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800195{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700196 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800197 memorySizeInKB(value);
198}
199
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000200void Dimm::dimmDeviceLocator(const uint8_t bankLocatorPositionNum,
201 const uint8_t deviceLocatorPositionNum,
202 const uint8_t structLen, uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800203{
Patrick Williams1d73dcc2024-08-16 15:21:42 -0400204 std::string deviceLocator =
205 positionToString(deviceLocatorPositionNum, structLen, dataIn);
206 std::string bankLocator =
207 positionToString(bankLocatorPositionNum, structLen, dataIn);
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000208
209 std::string result;
John Edward Broadbentefd41542022-12-13 16:39:18 -0800210 if (bankLocator.empty() || onlyDimmLocationCode)
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000211 {
John Edward Broadbentefd41542022-12-13 16:39:18 -0800212 result = deviceLocator;
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000213 }
214 else
215 {
John Edward Broadbentefd41542022-12-13 16:39:18 -0800216 result = bankLocator + " " + deviceLocator;
Konstantin Aladyshev744b35a2022-11-02 08:34:27 +0000217 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800218
219 memoryDeviceLocator(result);
Jie Yang31720392021-07-22 21:45:45 -0700220
221 locationCode(result);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000222 const std::string substrCpu = "CPU";
223 auto cpuPos = deviceLocator.find(substrCpu);
224
Tony Lee8f789c32024-07-10 20:01:43 +0800225 auto data = parseConfigFile();
226
227 if (!data.empty())
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000228 {
Tony Lee8f789c32024-07-10 20:01:43 +0800229 auto it = data.find(deviceLocator);
230
231 if (it != data.end())
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000232 {
Tony Lee8f789c32024-07-10 20:01:43 +0800233 uint8_t memoryControllerValue =
234 it.value()["MemoryController"].get<uint8_t>();
235 uint8_t socketValue = it.value()["Socket"].get<uint8_t>();
236 uint8_t slotValue = it.value()["Slot"].get<uint8_t>();
237 uint8_t channelValue = it.value()["Channel"].get<uint8_t>();
238
Chanh Nguyen9a6ac032025-01-09 07:03:15 +0000239 socket(socketValue);
240 memoryController(memoryControllerValue);
Tony Lee8f789c32024-07-10 20:01:43 +0800241 slot(slotValue);
242 channel(channelValue);
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000243 }
Tony Lee8f789c32024-07-10 20:01:43 +0800244 else
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000245 {
Tony Lee8f789c32024-07-10 20:01:43 +0800246 socket(0);
247 memoryController(0);
248 slot(0);
249 channel(0);
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530250 lg2::error("Failed find the corresponding table for dimm {DIMM}",
251 "DIMM", deviceLocator.c_str());
Tony Lee8f789c32024-07-10 20:01:43 +0800252 }
253 }
254 else
255 {
256 if (cpuPos != std::string::npos)
257 {
258 std::string socketString =
259 deviceLocator.substr(cpuPos + substrCpu.length(), 1);
260 try
261 {
262 uint8_t socketNum =
263 static_cast<uint8_t>(std::stoi(socketString) + 1);
264 socket(socketNum);
265 }
266 catch (const sdbusplus::exception_t& ex)
267 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530268 lg2::error("std::stoi operation failed {ERROR}", "ERROR",
269 ex.what());
Tony Lee8f789c32024-07-10 20:01:43 +0800270 }
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000271 }
272 }
273
274 const std::string substrDimm = "DIMM";
275 auto dimmPos = deviceLocator.find(substrDimm);
276
277 if (dimmPos != std::string::npos)
278 {
279 std::string slotString =
280 deviceLocator.substr(dimmPos + substrDimm.length() + 1);
281 /* slotString is extracted from substrDimm (DIMM_A) if slotString is
282 * single alphabet like A, B , C.. then assign ASCII value of slotString
283 * to slot */
284 if ((std::regex_match(slotString, std::regex("^[A-Za-z]+$"))) &&
285 (slotString.length() == 1))
286 {
287 slot(static_cast<uint8_t>(toupper(slotString[0])));
288 }
289 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800290}
291
292std::string Dimm::memoryDeviceLocator(std::string value)
293{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700294 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800295 memoryDeviceLocator(value);
296}
297
298void Dimm::dimmType(const uint8_t type)
299{
300 std::map<uint8_t, DeviceType>::const_iterator it = dimmTypeTable.find(type);
301 if (it == dimmTypeTable.end())
302 {
303 memoryType(DeviceType::Unknown);
304 }
305 else
306 {
307 memoryType(it->second);
308 }
309}
310
311DeviceType Dimm::memoryType(DeviceType value)
312{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700313 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800314 memoryType(value);
315}
316
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000317void Dimm::dimmMedia(const uint8_t type)
318{
319 std::map<uint8_t, MemoryTechType>::const_iterator it =
320 dimmMemoryTechTypeMap.find(type);
321 if (it == dimmMemoryTechTypeMap.end())
322 {
323 memoryMedia(MemoryTechType::Unknown);
324 }
325 else
326 {
327 memoryMedia(it->second);
328 }
329}
330
331MemoryTechType Dimm::memoryMedia(MemoryTechType value)
332{
333 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
334 memoryMedia(value);
335}
336
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800337void Dimm::dimmTypeDetail(uint16_t detail)
338{
339 std::string result;
340 for (uint8_t index = 0; index < (8 * sizeof(detail)); index++)
341 {
342 if (detail & 0x01)
343 {
344 result += detailTable[index];
345 }
346 detail >>= 1;
347 }
348 memoryTypeDetail(result);
349}
350
351std::string Dimm::memoryTypeDetail(std::string value)
352{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700353 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800354 memoryTypeDetail(value);
355}
356
357uint16_t Dimm::maxMemorySpeedInMhz(uint16_t value)
358{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700359 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800360 maxMemorySpeedInMhz(value);
361}
362
363void Dimm::dimmManufacturer(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800364 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800365{
366 std::string result = positionToString(positionNum, structLen, dataIn);
367
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530368 if (result == "NO DIMM")
369 {
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530370 // No dimm presence so making manufacturer value as "" (instead of
371 // NO DIMM - as there won't be any manufacturer for DIMM which is not
372 // present).
373 result = "";
374 }
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800375 manufacturer(result);
376}
377
378std::string Dimm::manufacturer(std::string value)
379{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700380 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800381 Asset::manufacturer(value);
382}
383
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530384bool Dimm::present(bool value)
385{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700386 return sdbusplus::server::xyz::openbmc_project::inventory::Item::present(
Joshi-Mansi33c948a2021-03-20 00:58:50 +0530387 value);
388}
389
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800390void Dimm::dimmSerialNum(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800391 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800392{
393 std::string result = positionToString(positionNum, structLen, dataIn);
394
395 serialNumber(result);
396}
397
398std::string Dimm::serialNumber(std::string value)
399{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700400 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800401 Asset::serialNumber(value);
402}
403
404void Dimm::dimmPartNum(const uint8_t positionNum, const uint8_t structLen,
Cheng C Yang2ca7a0f2019-12-19 10:46:42 +0800405 uint8_t* dataIn)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800406{
407 std::string result = positionToString(positionNum, structLen, dataIn);
408
kasunath634ec6a2022-07-25 15:34:17 -0700409 // Part number could contain spaces at the end. Eg: "abcd123 ". Since its
410 // unnecessary, we should remove them.
411 boost::algorithm::trim_right(result);
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800412 partNumber(result);
413}
414
415std::string Dimm::partNumber(std::string value)
416{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700417 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800418 Asset::partNumber(value);
419}
420
Jie Yang31720392021-07-22 21:45:45 -0700421std::string Dimm::locationCode(std::string value)
422{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700423 return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
Jie Yang31720392021-07-22 21:45:45 -0700424 LocationCode::locationCode(value);
425}
426
George Liu036374a2023-06-15 08:47:46 +0800427size_t Dimm::memoryAttributes(size_t value)
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800428{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700429 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800430 memoryAttributes(value);
431}
432
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000433uint8_t Dimm::slot(uint8_t value)
434{
435 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
436 MemoryLocation::slot(value);
437}
438
Tony Lee8f789c32024-07-10 20:01:43 +0800439uint8_t Dimm::memoryController(uint8_t value)
440{
441 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
442 MemoryLocation::memoryController(value);
443}
444
445uint8_t Dimm::channel(uint8_t value)
446{
447 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
448 MemoryLocation::channel(value);
449}
450
Jayaprakash Mutyalaa1ff2442023-06-15 07:10:07 +0000451uint8_t Dimm::socket(uint8_t value)
452{
453 return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
454 MemoryLocation::socket(value);
455}
456
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800457uint16_t Dimm::memoryConfiguredSpeedInMhz(uint16_t value)
458{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700459 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800460 memoryConfiguredSpeedInMhz(value);
461}
462
Tim Leedc469c72021-07-20 10:55:58 +0800463bool Dimm::functional(bool value)
464{
Jason M. Bills33ae81f2023-04-26 09:06:08 -0700465 return sdbusplus::server::xyz::openbmc_project::state::decorator::
Tim Leedc469c72021-07-20 10:55:58 +0800466 OperationalStatus::functional(value);
467}
468
Prithvi Pai1aea7e42025-04-11 15:00:26 +0530469void Dimm::updateFormFactor(const uint8_t formFactorKey)
470{
471 std::map<uint8_t, FormFactor>::const_iterator it =
472 dimmFormFactorMap.find(formFactorKey);
473 if (it != dimmFormFactorMap.end())
474 {
475 formFactor(it->second);
476 }
477}
478
479FormFactor Dimm::formFactor(FormFactor value)
480{
481 return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
482 formFactor(value);
483}
484
Tony Lee8f789c32024-07-10 20:01:43 +0800485Json Dimm::parseConfigFile()
486{
487 std::ifstream memoryLocationFile(filename);
488
489 if (!memoryLocationFile.is_open())
490 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530491 lg2::error("config JSON file not found, FILENAME {FILENAME}",
492 "FILENAME", filename);
Tony Lee8f789c32024-07-10 20:01:43 +0800493 return {};
494 }
495
496 auto data = Json::parse(memoryLocationFile, nullptr, false);
497 if (data.is_discarded())
498 {
Prithvi Pai6981b7f2025-04-02 10:33:29 +0530499 lg2::error("config readings JSON parser failure");
Tony Lee8f789c32024-07-10 20:01:43 +0800500 return {};
501 }
502
503 return data;
504}
505
Cheng C Yang8c3fab62019-12-19 00:51:06 +0800506} // namespace smbios
507} // namespace phosphor