xref: /openbmc/smbios-mdr/src/dimm.cpp (revision 9a6ac03d71948d77207fd19258efac270d6b5389)
18c3fab63SCheng C Yang /*
28c3fab63SCheng C Yang // Copyright (c) 2018 Intel Corporation
38c3fab63SCheng C Yang //
48c3fab63SCheng C Yang // Licensed under the Apache License, Version 2.0 (the "License");
58c3fab63SCheng C Yang // you may not use this file except in compliance with the License.
68c3fab63SCheng C Yang // You may obtain a copy of the License at
78c3fab63SCheng C Yang //
88c3fab63SCheng C Yang //      http://www.apache.org/licenses/LICENSE-2.0
98c3fab63SCheng C Yang //
108c3fab63SCheng C Yang // Unless required by applicable law or agreed to in writing, software
118c3fab63SCheng C Yang // distributed under the License is distributed on an "AS IS" BASIS,
128c3fab63SCheng C Yang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138c3fab63SCheng C Yang // See the License for the specific language governing permissions and
148c3fab63SCheng C Yang // limitations under the License.
158c3fab63SCheng C Yang */
168c3fab63SCheng C Yang 
178c3fab63SCheng C Yang #include "dimm.hpp"
188c3fab63SCheng C Yang 
198c3fab63SCheng C Yang #include "mdrv2.hpp"
208c3fab63SCheng C Yang 
21634ec6aeSkasunath #include <boost/algorithm/string.hpp>
222eca4fe5Skasunath #include <phosphor-logging/elog-errors.hpp>
23634ec6aeSkasunath 
248f789c3aSTony Lee #include <fstream>
258f789c3aSTony Lee #include <iostream>
26a1ff2445SJayaprakash Mutyala #include <regex>
27a1ff2445SJayaprakash Mutyala 
288c3fab63SCheng C Yang namespace phosphor
298c3fab63SCheng C Yang {
308c3fab63SCheng C Yang namespace smbios
318c3fab63SCheng C Yang {
328c3fab63SCheng C Yang 
33efd41540SJohn Edward Broadbent #ifdef DIMM_ONLY_LOCATOR
34efd41540SJohn Edward Broadbent bool onlyDimmLocationCode = true;
35efd41540SJohn Edward Broadbent #else
36efd41540SJohn Edward Broadbent bool onlyDimmLocationCode = false;
37efd41540SJohn Edward Broadbent #endif
38efd41540SJohn Edward Broadbent 
398c3fab63SCheng C Yang using DeviceType =
4033ae81feSJason M. Bills     sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::DeviceType;
418c3fab63SCheng C Yang 
422eca4fe5Skasunath using EccType =
4333ae81feSJason M. Bills     sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::Ecc;
442eca4fe5Skasunath 
458c3fab63SCheng C Yang static constexpr uint16_t maxOldDimmSize = 0x7fff;
468f789c3aSTony Lee 
478f789c3aSTony Lee static constexpr const char* filename =
488f789c3aSTony Lee     "/usr/share/smbios-mdr/memoryLocationTable.json";
498f789c3aSTony Lee 
memoryInfoUpdate(uint8_t * smbiosTableStorage,const std::string & motherboard)505a122a6eSBrandon Kim void Dimm::memoryInfoUpdate(uint8_t* smbiosTableStorage,
515a122a6eSBrandon Kim                             const std::string& motherboard)
528c3fab63SCheng C Yang {
535a122a6eSBrandon Kim     storage = smbiosTableStorage;
545a122a6eSBrandon Kim     motherboardPath = motherboard;
555a122a6eSBrandon Kim 
568c3fab63SCheng C Yang     uint8_t* dataIn = storage;
578c3fab63SCheng C Yang 
588c3fab63SCheng C Yang     dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType);
598c3fab63SCheng C Yang 
608c3fab63SCheng C Yang     if (dataIn == nullptr)
618c3fab63SCheng C Yang     {
628c3fab63SCheng C Yang         return;
638c3fab63SCheng C Yang     }
648c3fab63SCheng C Yang     for (uint8_t index = 0; index < dimmNum; index++)
658c3fab63SCheng C Yang     {
668c3fab63SCheng C Yang         dataIn = smbiosNextPtr(dataIn);
678c3fab63SCheng C Yang         if (dataIn == nullptr)
688c3fab63SCheng C Yang         {
698c3fab63SCheng C Yang             return;
708c3fab63SCheng C Yang         }
718c3fab63SCheng C Yang         dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType);
728c3fab63SCheng C Yang         if (dataIn == nullptr)
738c3fab63SCheng C Yang         {
748c3fab63SCheng C Yang             return;
758c3fab63SCheng C Yang         }
768c3fab63SCheng C Yang     }
778c3fab63SCheng C Yang 
788c3fab63SCheng C Yang     auto memoryInfo = reinterpret_cast<struct MemoryInfo*>(dataIn);
798c3fab63SCheng C Yang 
808c3fab63SCheng C Yang     memoryDataWidth(memoryInfo->dataWidth);
81410bbc27SJoseph Fu     memoryTotalWidth(memoryInfo->totalWidth);
828c3fab63SCheng C Yang 
838c3fab63SCheng C Yang     if (memoryInfo->size == maxOldDimmSize)
848c3fab63SCheng C Yang     {
858c3fab63SCheng C Yang         dimmSizeExt(memoryInfo->extendedSize);
868c3fab63SCheng C Yang     }
878c3fab63SCheng C Yang     else
888c3fab63SCheng C Yang     {
898c3fab63SCheng C Yang         dimmSize(memoryInfo->size);
908c3fab63SCheng C Yang     }
9139cc3683STom Tung     // If the size is 0, no memory device is installed in the socket.
9239cc3683STom Tung     const auto isDimmPresent = memoryInfo->size > 0;
9339cc3683STom Tung     present(isDimmPresent);
9439cc3683STom Tung     functional(isDimmPresent);
958c3fab63SCheng C Yang 
96744b35aaSKonstantin Aladyshev     dimmDeviceLocator(memoryInfo->bankLocator, memoryInfo->deviceLocator,
97744b35aaSKonstantin Aladyshev                       memoryInfo->length, dataIn);
988c3fab63SCheng C Yang     dimmType(memoryInfo->memoryType);
998c3fab63SCheng C Yang     dimmTypeDetail(memoryInfo->typeDetail);
1008c3fab63SCheng C Yang     maxMemorySpeedInMhz(memoryInfo->speed);
1018c3fab63SCheng C Yang     dimmManufacturer(memoryInfo->manufacturer, memoryInfo->length, dataIn);
1028c3fab63SCheng C Yang     dimmSerialNum(memoryInfo->serialNum, memoryInfo->length, dataIn);
1038c3fab63SCheng C Yang     dimmPartNum(memoryInfo->partNum, memoryInfo->length, dataIn);
1048c3fab63SCheng C Yang     memoryAttributes(memoryInfo->attributes);
105a1ff2445SJayaprakash Mutyala     dimmMedia(memoryInfo->memoryTechnology);
1068c3fab63SCheng C Yang     memoryConfiguredSpeedInMhz(memoryInfo->confClockSpeed);
1078c3fab63SCheng C Yang 
1082eca4fe5Skasunath     updateEccType(memoryInfo->phyArrayHandle);
1092eca4fe5Skasunath 
110e7cf3195SJie Yang     if (!motherboardPath.empty())
111e7cf3195SJie Yang     {
112e7cf3195SJie Yang         std::vector<std::tuple<std::string, std::string, std::string>> assocs;
113e7cf3195SJie Yang         assocs.emplace_back("chassis", "memories", motherboardPath);
114e7cf3195SJie Yang         association::associations(assocs);
115e7cf3195SJie Yang     }
116e7cf3195SJie Yang 
1178c3fab63SCheng C Yang     return;
1188c3fab63SCheng C Yang }
1198c3fab63SCheng C Yang 
updateEccType(uint16_t exPhyArrayHandle)1202eca4fe5Skasunath void Dimm::updateEccType(uint16_t exPhyArrayHandle)
1212eca4fe5Skasunath {
1222eca4fe5Skasunath     uint8_t* dataIn = storage;
1232eca4fe5Skasunath 
1242eca4fe5Skasunath     while (dataIn != nullptr)
1252eca4fe5Skasunath     {
1262eca4fe5Skasunath         dataIn = getSMBIOSTypePtr(dataIn, physicalMemoryArrayType);
1272eca4fe5Skasunath         if (dataIn == nullptr)
1282eca4fe5Skasunath         {
1292eca4fe5Skasunath             phosphor::logging::log<phosphor::logging::level::ERR>(
1302eca4fe5Skasunath                 "Failed to get SMBIOS table type-16 data.");
1312eca4fe5Skasunath             return;
1322eca4fe5Skasunath         }
1332eca4fe5Skasunath 
1342eca4fe5Skasunath         auto info = reinterpret_cast<struct PhysicalMemoryArrayInfo*>(dataIn);
1352eca4fe5Skasunath         if (info->handle == exPhyArrayHandle)
1362eca4fe5Skasunath         {
1372eca4fe5Skasunath             std::map<uint8_t, EccType>::const_iterator it =
1382eca4fe5Skasunath                 dimmEccTypeMap.find(info->memoryErrorCorrection);
1392eca4fe5Skasunath             if (it == dimmEccTypeMap.end())
1402eca4fe5Skasunath             {
1412eca4fe5Skasunath                 ecc(EccType::NoECC);
1422eca4fe5Skasunath             }
1432eca4fe5Skasunath             else
1442eca4fe5Skasunath             {
1452eca4fe5Skasunath                 ecc(it->second);
1462eca4fe5Skasunath             }
1472eca4fe5Skasunath             return;
1482eca4fe5Skasunath         }
1492eca4fe5Skasunath 
1502eca4fe5Skasunath         dataIn = smbiosNextPtr(dataIn);
1512eca4fe5Skasunath     }
1522eca4fe5Skasunath     phosphor::logging::log<phosphor::logging::level::ERR>(
1532eca4fe5Skasunath         "Failed find the corresponding SMBIOS table type-16 data for dimm:",
1542eca4fe5Skasunath         phosphor::logging::entry("DIMM:%d", dimmNum));
1552eca4fe5Skasunath }
1562eca4fe5Skasunath 
ecc(EccType value)1572eca4fe5Skasunath EccType Dimm::ecc(EccType value)
1582eca4fe5Skasunath {
15933ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::ecc(
1602eca4fe5Skasunath         value);
1612eca4fe5Skasunath }
1622eca4fe5Skasunath 
memoryDataWidth(uint16_t value)1638c3fab63SCheng C Yang uint16_t Dimm::memoryDataWidth(uint16_t value)
1648c3fab63SCheng C Yang {
16533ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
1668c3fab63SCheng C Yang         memoryDataWidth(value);
1678c3fab63SCheng C Yang }
1688c3fab63SCheng C Yang 
memoryTotalWidth(uint16_t value)169410bbc27SJoseph Fu uint16_t Dimm::memoryTotalWidth(uint16_t value)
170410bbc27SJoseph Fu {
171410bbc27SJoseph Fu     return sdbusplus::xyz::openbmc_project::Inventory::Item::server::Dimm::
172410bbc27SJoseph Fu         memoryTotalWidth(value);
173410bbc27SJoseph Fu }
174410bbc27SJoseph Fu 
1758c3fab63SCheng C Yang static constexpr uint16_t baseNewVersionDimmSize = 0x8000;
1768c3fab63SCheng C Yang static constexpr uint16_t dimmSizeUnit = 1024;
dimmSize(const uint16_t size)1778c3fab63SCheng C Yang void Dimm::dimmSize(const uint16_t size)
1788c3fab63SCheng C Yang {
1790b1d942dSJoseph Fu     uint32_t result = size & maxOldDimmSize;
1808c3fab63SCheng C Yang     if (0 == (size & baseNewVersionDimmSize))
1818c3fab63SCheng C Yang     {
1828c3fab63SCheng C Yang         result = result * dimmSizeUnit;
1838c3fab63SCheng C Yang     }
1848c3fab63SCheng C Yang     memorySizeInKB(result);
1858c3fab63SCheng C Yang }
1868c3fab63SCheng C Yang 
dimmSizeExt(uint32_t size)1870b1d942dSJoseph Fu void Dimm::dimmSizeExt(uint32_t size)
1888c3fab63SCheng C Yang {
1898c3fab63SCheng C Yang     size = size * dimmSizeUnit;
1908c3fab63SCheng C Yang     memorySizeInKB(size);
1918c3fab63SCheng C Yang }
1928c3fab63SCheng C Yang 
memorySizeInKB(size_t value)193e7770991SJason M. Bills size_t Dimm::memorySizeInKB(size_t value)
1948c3fab63SCheng C Yang {
19533ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
1968c3fab63SCheng C Yang         memorySizeInKB(value);
1978c3fab63SCheng C Yang }
1988c3fab63SCheng C Yang 
dimmDeviceLocator(const uint8_t bankLocatorPositionNum,const uint8_t deviceLocatorPositionNum,const uint8_t structLen,uint8_t * dataIn)199744b35aaSKonstantin Aladyshev void Dimm::dimmDeviceLocator(const uint8_t bankLocatorPositionNum,
200744b35aaSKonstantin Aladyshev                              const uint8_t deviceLocatorPositionNum,
201744b35aaSKonstantin Aladyshev                              const uint8_t structLen, uint8_t* dataIn)
2028c3fab63SCheng C Yang {
2031d73dcccSPatrick Williams     std::string deviceLocator =
2041d73dcccSPatrick Williams         positionToString(deviceLocatorPositionNum, structLen, dataIn);
2051d73dcccSPatrick Williams     std::string bankLocator =
2061d73dcccSPatrick Williams         positionToString(bankLocatorPositionNum, structLen, dataIn);
207744b35aaSKonstantin Aladyshev 
208744b35aaSKonstantin Aladyshev     std::string result;
209efd41540SJohn Edward Broadbent     if (bankLocator.empty() || onlyDimmLocationCode)
210744b35aaSKonstantin Aladyshev     {
211efd41540SJohn Edward Broadbent         result = deviceLocator;
212744b35aaSKonstantin Aladyshev     }
213744b35aaSKonstantin Aladyshev     else
214744b35aaSKonstantin Aladyshev     {
215efd41540SJohn Edward Broadbent         result = bankLocator + " " + deviceLocator;
216744b35aaSKonstantin Aladyshev     }
2178c3fab63SCheng C Yang 
2188c3fab63SCheng C Yang     memoryDeviceLocator(result);
21931720397SJie Yang 
22031720397SJie Yang     locationCode(result);
221a1ff2445SJayaprakash Mutyala     const std::string substrCpu = "CPU";
222a1ff2445SJayaprakash Mutyala     auto cpuPos = deviceLocator.find(substrCpu);
223a1ff2445SJayaprakash Mutyala 
2248f789c3aSTony Lee     auto data = parseConfigFile();
2258f789c3aSTony Lee 
2268f789c3aSTony Lee     if (!data.empty())
2278f789c3aSTony Lee     {
2288f789c3aSTony Lee         auto it = data.find(deviceLocator);
2298f789c3aSTony Lee 
2308f789c3aSTony Lee         if (it != data.end())
2318f789c3aSTony Lee         {
2328f789c3aSTony Lee             uint8_t memoryControllerValue =
2338f789c3aSTony Lee                 it.value()["MemoryController"].get<uint8_t>();
2348f789c3aSTony Lee             uint8_t socketValue = it.value()["Socket"].get<uint8_t>();
2358f789c3aSTony Lee             uint8_t slotValue = it.value()["Slot"].get<uint8_t>();
2368f789c3aSTony Lee             uint8_t channelValue = it.value()["Channel"].get<uint8_t>();
2378f789c3aSTony Lee 
238*9a6ac03dSChanh Nguyen             socket(socketValue);
239*9a6ac03dSChanh Nguyen             memoryController(memoryControllerValue);
2408f789c3aSTony Lee             slot(slotValue);
2418f789c3aSTony Lee             channel(channelValue);
2428f789c3aSTony Lee         }
2438f789c3aSTony Lee         else
2448f789c3aSTony Lee         {
2458f789c3aSTony Lee             socket(0);
2468f789c3aSTony Lee             memoryController(0);
2478f789c3aSTony Lee             slot(0);
2488f789c3aSTony Lee             channel(0);
2498f789c3aSTony Lee             phosphor::logging::log<phosphor::logging::level::ERR>(
2508f789c3aSTony Lee                 "Failed find the corresponding table for dimm ",
2518f789c3aSTony Lee                 phosphor::logging::entry("DIMM:%s", deviceLocator.c_str()));
2528f789c3aSTony Lee         }
2538f789c3aSTony Lee     }
2548f789c3aSTony Lee     else
2558f789c3aSTony Lee     {
256a1ff2445SJayaprakash Mutyala         if (cpuPos != std::string::npos)
257a1ff2445SJayaprakash Mutyala         {
258a1ff2445SJayaprakash Mutyala             std::string socketString =
259a1ff2445SJayaprakash Mutyala                 deviceLocator.substr(cpuPos + substrCpu.length(), 1);
260a1ff2445SJayaprakash Mutyala             try
261a1ff2445SJayaprakash Mutyala             {
262a1ff2445SJayaprakash Mutyala                 uint8_t socketNum =
263a1ff2445SJayaprakash Mutyala                     static_cast<uint8_t>(std::stoi(socketString) + 1);
264a1ff2445SJayaprakash Mutyala                 socket(socketNum);
265a1ff2445SJayaprakash Mutyala             }
266a1ff2445SJayaprakash Mutyala             catch (const sdbusplus::exception_t& ex)
267a1ff2445SJayaprakash Mutyala             {
268a1ff2445SJayaprakash Mutyala                 phosphor::logging::log<phosphor::logging::level::ERR>(
269a1ff2445SJayaprakash Mutyala                     "std::stoi operation failed ",
270a1ff2445SJayaprakash Mutyala                     phosphor::logging::entry("ERROR=%s", ex.what()));
271a1ff2445SJayaprakash Mutyala             }
272a1ff2445SJayaprakash Mutyala         }
2738f789c3aSTony Lee     }
274a1ff2445SJayaprakash Mutyala 
275a1ff2445SJayaprakash Mutyala     const std::string substrDimm = "DIMM";
276a1ff2445SJayaprakash Mutyala     auto dimmPos = deviceLocator.find(substrDimm);
277a1ff2445SJayaprakash Mutyala 
278a1ff2445SJayaprakash Mutyala     if (dimmPos != std::string::npos)
279a1ff2445SJayaprakash Mutyala     {
280a1ff2445SJayaprakash Mutyala         std::string slotString =
281a1ff2445SJayaprakash Mutyala             deviceLocator.substr(dimmPos + substrDimm.length() + 1);
282a1ff2445SJayaprakash Mutyala         /* slotString is extracted from substrDimm (DIMM_A) if slotString is
283a1ff2445SJayaprakash Mutyala          * single alphabet like A, B , C.. then assign ASCII value of slotString
284a1ff2445SJayaprakash Mutyala          * to slot */
285a1ff2445SJayaprakash Mutyala         if ((std::regex_match(slotString, std::regex("^[A-Za-z]+$"))) &&
286a1ff2445SJayaprakash Mutyala             (slotString.length() == 1))
287a1ff2445SJayaprakash Mutyala         {
288a1ff2445SJayaprakash Mutyala             slot(static_cast<uint8_t>(toupper(slotString[0])));
289a1ff2445SJayaprakash Mutyala         }
290a1ff2445SJayaprakash Mutyala     }
2918c3fab63SCheng C Yang }
2928c3fab63SCheng C Yang 
memoryDeviceLocator(std::string value)2938c3fab63SCheng C Yang std::string Dimm::memoryDeviceLocator(std::string value)
2948c3fab63SCheng C Yang {
29533ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
2968c3fab63SCheng C Yang         memoryDeviceLocator(value);
2978c3fab63SCheng C Yang }
2988c3fab63SCheng C Yang 
dimmType(const uint8_t type)2998c3fab63SCheng C Yang void Dimm::dimmType(const uint8_t type)
3008c3fab63SCheng C Yang {
3018c3fab63SCheng C Yang     std::map<uint8_t, DeviceType>::const_iterator it = dimmTypeTable.find(type);
3028c3fab63SCheng C Yang     if (it == dimmTypeTable.end())
3038c3fab63SCheng C Yang     {
3048c3fab63SCheng C Yang         memoryType(DeviceType::Unknown);
3058c3fab63SCheng C Yang     }
3068c3fab63SCheng C Yang     else
3078c3fab63SCheng C Yang     {
3088c3fab63SCheng C Yang         memoryType(it->second);
3098c3fab63SCheng C Yang     }
3108c3fab63SCheng C Yang }
3118c3fab63SCheng C Yang 
memoryType(DeviceType value)3128c3fab63SCheng C Yang DeviceType Dimm::memoryType(DeviceType value)
3138c3fab63SCheng C Yang {
31433ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
3158c3fab63SCheng C Yang         memoryType(value);
3168c3fab63SCheng C Yang }
3178c3fab63SCheng C Yang 
dimmMedia(const uint8_t type)318a1ff2445SJayaprakash Mutyala void Dimm::dimmMedia(const uint8_t type)
319a1ff2445SJayaprakash Mutyala {
320a1ff2445SJayaprakash Mutyala     std::map<uint8_t, MemoryTechType>::const_iterator it =
321a1ff2445SJayaprakash Mutyala         dimmMemoryTechTypeMap.find(type);
322a1ff2445SJayaprakash Mutyala     if (it == dimmMemoryTechTypeMap.end())
323a1ff2445SJayaprakash Mutyala     {
324a1ff2445SJayaprakash Mutyala         memoryMedia(MemoryTechType::Unknown);
325a1ff2445SJayaprakash Mutyala     }
326a1ff2445SJayaprakash Mutyala     else
327a1ff2445SJayaprakash Mutyala     {
328a1ff2445SJayaprakash Mutyala         memoryMedia(it->second);
329a1ff2445SJayaprakash Mutyala     }
330a1ff2445SJayaprakash Mutyala }
331a1ff2445SJayaprakash Mutyala 
memoryMedia(MemoryTechType value)332a1ff2445SJayaprakash Mutyala MemoryTechType Dimm::memoryMedia(MemoryTechType value)
333a1ff2445SJayaprakash Mutyala {
334a1ff2445SJayaprakash Mutyala     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
335a1ff2445SJayaprakash Mutyala         memoryMedia(value);
336a1ff2445SJayaprakash Mutyala }
337a1ff2445SJayaprakash Mutyala 
dimmTypeDetail(uint16_t detail)3388c3fab63SCheng C Yang void Dimm::dimmTypeDetail(uint16_t detail)
3398c3fab63SCheng C Yang {
3408c3fab63SCheng C Yang     std::string result;
3418c3fab63SCheng C Yang     for (uint8_t index = 0; index < (8 * sizeof(detail)); index++)
3428c3fab63SCheng C Yang     {
3438c3fab63SCheng C Yang         if (detail & 0x01)
3448c3fab63SCheng C Yang         {
3458c3fab63SCheng C Yang             result += detailTable[index];
3468c3fab63SCheng C Yang         }
3478c3fab63SCheng C Yang         detail >>= 1;
3488c3fab63SCheng C Yang     }
3498c3fab63SCheng C Yang     memoryTypeDetail(result);
3508c3fab63SCheng C Yang }
3518c3fab63SCheng C Yang 
memoryTypeDetail(std::string value)3528c3fab63SCheng C Yang std::string Dimm::memoryTypeDetail(std::string value)
3538c3fab63SCheng C Yang {
35433ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
3558c3fab63SCheng C Yang         memoryTypeDetail(value);
3568c3fab63SCheng C Yang }
3578c3fab63SCheng C Yang 
maxMemorySpeedInMhz(uint16_t value)3588c3fab63SCheng C Yang uint16_t Dimm::maxMemorySpeedInMhz(uint16_t value)
3598c3fab63SCheng C Yang {
36033ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
3618c3fab63SCheng C Yang         maxMemorySpeedInMhz(value);
3628c3fab63SCheng C Yang }
3638c3fab63SCheng C Yang 
dimmManufacturer(const uint8_t positionNum,const uint8_t structLen,uint8_t * dataIn)3648c3fab63SCheng C Yang void Dimm::dimmManufacturer(const uint8_t positionNum, const uint8_t structLen,
3658c3fab63SCheng C Yang                             uint8_t* dataIn)
3668c3fab63SCheng C Yang {
3678c3fab63SCheng C Yang     std::string result = positionToString(positionNum, structLen, dataIn);
3688c3fab63SCheng C Yang 
36933c948a4SJoshi-Mansi     if (result == "NO DIMM")
37033c948a4SJoshi-Mansi     {
37133c948a4SJoshi-Mansi         // No dimm presence so making manufacturer value as "" (instead of
37233c948a4SJoshi-Mansi         // NO DIMM - as there won't be any manufacturer for DIMM which is not
37333c948a4SJoshi-Mansi         // present).
37433c948a4SJoshi-Mansi         result = "";
37533c948a4SJoshi-Mansi     }
3768c3fab63SCheng C Yang     manufacturer(result);
3778c3fab63SCheng C Yang }
3788c3fab63SCheng C Yang 
manufacturer(std::string value)3798c3fab63SCheng C Yang std::string Dimm::manufacturer(std::string value)
3808c3fab63SCheng C Yang {
38133ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
3828c3fab63SCheng C Yang         Asset::manufacturer(value);
3838c3fab63SCheng C Yang }
3848c3fab63SCheng C Yang 
present(bool value)38533c948a4SJoshi-Mansi bool Dimm::present(bool value)
38633c948a4SJoshi-Mansi {
38733ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::Item::present(
38833c948a4SJoshi-Mansi         value);
38933c948a4SJoshi-Mansi }
39033c948a4SJoshi-Mansi 
dimmSerialNum(const uint8_t positionNum,const uint8_t structLen,uint8_t * dataIn)3918c3fab63SCheng C Yang void Dimm::dimmSerialNum(const uint8_t positionNum, const uint8_t structLen,
3928c3fab63SCheng C Yang                          uint8_t* dataIn)
3938c3fab63SCheng C Yang {
3948c3fab63SCheng C Yang     std::string result = positionToString(positionNum, structLen, dataIn);
3958c3fab63SCheng C Yang 
3968c3fab63SCheng C Yang     serialNumber(result);
3978c3fab63SCheng C Yang }
3988c3fab63SCheng C Yang 
serialNumber(std::string value)3998c3fab63SCheng C Yang std::string Dimm::serialNumber(std::string value)
4008c3fab63SCheng C Yang {
40133ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
4028c3fab63SCheng C Yang         Asset::serialNumber(value);
4038c3fab63SCheng C Yang }
4048c3fab63SCheng C Yang 
dimmPartNum(const uint8_t positionNum,const uint8_t structLen,uint8_t * dataIn)4058c3fab63SCheng C Yang void Dimm::dimmPartNum(const uint8_t positionNum, const uint8_t structLen,
4068c3fab63SCheng C Yang                        uint8_t* dataIn)
4078c3fab63SCheng C Yang {
4088c3fab63SCheng C Yang     std::string result = positionToString(positionNum, structLen, dataIn);
4098c3fab63SCheng C Yang 
410634ec6aeSkasunath     // Part number could contain spaces at the end. Eg: "abcd123  ". Since its
411634ec6aeSkasunath     // unnecessary, we should remove them.
412634ec6aeSkasunath     boost::algorithm::trim_right(result);
4138c3fab63SCheng C Yang     partNumber(result);
4148c3fab63SCheng C Yang }
4158c3fab63SCheng C Yang 
partNumber(std::string value)4168c3fab63SCheng C Yang std::string Dimm::partNumber(std::string value)
4178c3fab63SCheng C Yang {
41833ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
4198c3fab63SCheng C Yang         Asset::partNumber(value);
4208c3fab63SCheng C Yang }
4218c3fab63SCheng C Yang 
locationCode(std::string value)42231720397SJie Yang std::string Dimm::locationCode(std::string value)
42331720397SJie Yang {
42433ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::decorator::
42531720397SJie Yang         LocationCode::locationCode(value);
42631720397SJie Yang }
42731720397SJie Yang 
memoryAttributes(size_t value)428036374a2SGeorge Liu size_t Dimm::memoryAttributes(size_t value)
4298c3fab63SCheng C Yang {
43033ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
4318c3fab63SCheng C Yang         memoryAttributes(value);
4328c3fab63SCheng C Yang }
4338c3fab63SCheng C Yang 
slot(uint8_t value)434a1ff2445SJayaprakash Mutyala uint8_t Dimm::slot(uint8_t value)
435a1ff2445SJayaprakash Mutyala {
436a1ff2445SJayaprakash Mutyala     return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
437a1ff2445SJayaprakash Mutyala         MemoryLocation::slot(value);
438a1ff2445SJayaprakash Mutyala }
439a1ff2445SJayaprakash Mutyala 
memoryController(uint8_t value)4408f789c3aSTony Lee uint8_t Dimm::memoryController(uint8_t value)
4418f789c3aSTony Lee {
4428f789c3aSTony Lee     return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
4438f789c3aSTony Lee         MemoryLocation::memoryController(value);
4448f789c3aSTony Lee }
4458f789c3aSTony Lee 
channel(uint8_t value)4468f789c3aSTony Lee uint8_t Dimm::channel(uint8_t value)
4478f789c3aSTony Lee {
4488f789c3aSTony Lee     return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
4498f789c3aSTony Lee         MemoryLocation::channel(value);
4508f789c3aSTony Lee }
4518f789c3aSTony Lee 
socket(uint8_t value)452a1ff2445SJayaprakash Mutyala uint8_t Dimm::socket(uint8_t value)
453a1ff2445SJayaprakash Mutyala {
454a1ff2445SJayaprakash Mutyala     return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
455a1ff2445SJayaprakash Mutyala         MemoryLocation::socket(value);
456a1ff2445SJayaprakash Mutyala }
457a1ff2445SJayaprakash Mutyala 
memoryConfiguredSpeedInMhz(uint16_t value)4588c3fab63SCheng C Yang uint16_t Dimm::memoryConfiguredSpeedInMhz(uint16_t value)
4598c3fab63SCheng C Yang {
46033ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
4618c3fab63SCheng C Yang         memoryConfiguredSpeedInMhz(value);
4628c3fab63SCheng C Yang }
4638c3fab63SCheng C Yang 
functional(bool value)464dc469c74STim Lee bool Dimm::functional(bool value)
465dc469c74STim Lee {
46633ae81feSJason M. Bills     return sdbusplus::server::xyz::openbmc_project::state::decorator::
467dc469c74STim Lee         OperationalStatus::functional(value);
468dc469c74STim Lee }
469dc469c74STim Lee 
parseConfigFile()4708f789c3aSTony Lee Json Dimm::parseConfigFile()
4718f789c3aSTony Lee {
4728f789c3aSTony Lee     std::ifstream memoryLocationFile(filename);
4738f789c3aSTony Lee 
4748f789c3aSTony Lee     if (!memoryLocationFile.is_open())
4758f789c3aSTony Lee     {
4768f789c3aSTony Lee         phosphor::logging::log<phosphor::logging::level::ERR>(
4778f789c3aSTony Lee             "config JSON file not found, FILENAME ",
4788f789c3aSTony Lee             phosphor::logging::entry("%s", filename));
4798f789c3aSTony Lee         return {};
4808f789c3aSTony Lee     }
4818f789c3aSTony Lee 
4828f789c3aSTony Lee     auto data = Json::parse(memoryLocationFile, nullptr, false);
4838f789c3aSTony Lee     if (data.is_discarded())
4848f789c3aSTony Lee     {
4858f789c3aSTony Lee         phosphor::logging::log<phosphor::logging::level::ERR>(
4868f789c3aSTony Lee             "config readings JSON parser failure");
4878f789c3aSTony Lee         return {};
4888f789c3aSTony Lee     }
4898f789c3aSTony Lee 
4908f789c3aSTony Lee     return data;
4918f789c3aSTony Lee }
4928f789c3aSTony Lee 
4938c3fab63SCheng C Yang } // namespace smbios
4948c3fab63SCheng C Yang } // namespace phosphor
495