summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--redfish-core/lib/memory.hpp524
1 files changed, 257 insertions, 267 deletions
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index 6e4ab679c0..f84a17a709 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -426,295 +426,285 @@ inline void getPersistentMemoryProperties(
}
}
-inline void getDimmDataByService(std::shared_ptr<bmcweb::AsyncResp> aResp,
- const std::string& dimmId,
- const std::string& service,
- const std::string& objPath)
+inline void
+ assembleDimmProperties(std::string_view dimmId,
+ const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+ const dbus::utility::DBusPropertiesMap& properties)
{
- auto health = std::make_shared<HealthPopulate>(aResp);
- health->selfPath = objPath;
- health->populate();
+ aResp->res.jsonValue["Id"] = dimmId;
+ aResp->res.jsonValue["Name"] = "DIMM Slot";
+ aResp->res.jsonValue["Status"]["State"] = "Enabled";
+ aResp->res.jsonValue["Status"]["Health"] = "OK";
- BMCWEB_LOG_DEBUG << "Get available system components.";
- crow::connections::systemBus->async_method_call(
- [dimmId, aResp{std::move(aResp)}](
- const boost::system::error_code ec,
- const dbus::utility::DBusPropertiesMap& properties) {
- if (ec)
+ for (const auto& property : properties)
+ {
+ if (property.first == "MemoryDataWidth")
+ {
+ const uint16_t* value = std::get_if<uint16_t>(&property.second);
+ if (value == nullptr)
{
- BMCWEB_LOG_DEBUG << "DBUS response error";
+ continue;
+ }
+ aResp->res.jsonValue["DataWidthBits"] = *value;
+ }
+ else if (property.first == "MemorySizeInKB")
+ {
+ const size_t* memorySize = std::get_if<size_t>(&property.second);
+ if (memorySize == nullptr)
+ {
+ // Important property not in desired type
messages::internalError(aResp->res);
return;
}
- aResp->res.jsonValue["Id"] = dimmId;
- aResp->res.jsonValue["Name"] = "DIMM Slot";
- aResp->res.jsonValue["Status"]["State"] = "Enabled";
- aResp->res.jsonValue["Status"]["Health"] = "OK";
+ aResp->res.jsonValue["CapacityMiB"] = (*memorySize >> 10);
+ }
+ else if (property.first == "PartNumber")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ aResp->res.jsonValue["PartNumber"] = *value;
+ }
+ else if (property.first == "SerialNumber")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ aResp->res.jsonValue["SerialNumber"] = *value;
+ }
+ else if (property.first == "Manufacturer")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ aResp->res.jsonValue["Manufacturer"] = *value;
+ }
+ else if (property.first == "RevisionCode")
+ {
+ const uint16_t* value = std::get_if<uint16_t>(&property.second);
- for (const auto& property : properties)
+ if (value == nullptr)
{
- if (property.first == "MemoryDataWidth")
- {
- const uint16_t* value =
- std::get_if<uint16_t>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["DataWidthBits"] = *value;
- }
- else if (property.first == "MemorySizeInKB")
- {
- const size_t* memorySize =
- std::get_if<size_t>(&property.second);
- if (memorySize == nullptr)
- {
- // Important property not in desired type
- messages::internalError(aResp->res);
- return;
- }
- aResp->res.jsonValue["CapacityMiB"] = (*memorySize >> 10);
- }
- else if (property.first == "PartNumber")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["PartNumber"] = *value;
- }
- else if (property.first == "SerialNumber")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["SerialNumber"] = *value;
- }
- else if (property.first == "Manufacturer")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["Manufacturer"] = *value;
- }
- else if (property.first == "RevisionCode")
- {
- const uint16_t* value =
- std::get_if<uint16_t>(&property.second);
+ messages::internalError(aResp->res);
+ BMCWEB_LOG_DEBUG << "Invalid property type for RevisionCode";
+ return;
+ }
+ aResp->res.jsonValue["FirmwareRevision"] = std::to_string(*value);
+ }
+ else if (property.first == "Present")
+ {
+ const bool* value = std::get_if<bool>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ BMCWEB_LOG_DEBUG << "Invalid property type for Dimm Presence";
+ return;
+ }
+ if (!*value)
+ {
+ aResp->res.jsonValue["Status"]["State"] = "Absent";
+ }
+ }
+ else if (property.first == "MemoryTotalWidth")
+ {
+ const uint16_t* value = std::get_if<uint16_t>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ aResp->res.jsonValue["BusWidthBits"] = *value;
+ }
+ else if (property.first == "ECC")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ BMCWEB_LOG_DEBUG << "Invalid property type for ECC";
+ return;
+ }
+ constexpr const std::array<const char*, 4> values{
+ "NoECC", "SingleBitECC", "MultiBitECC", "AddressParity"};
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG
- << "Invalid property type for RevisionCode";
- return;
- }
- aResp->res.jsonValue["FirmwareRevision"] =
- std::to_string(*value);
- }
- else if (property.first == "Present")
- {
- const bool* value = std::get_if<bool>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG
- << "Invalid property type for Dimm Presence";
- return;
- }
- if (!*value)
- {
- aResp->res.jsonValue["Status"]["State"] = "Absent";
- }
- }
- else if (property.first == "MemoryTotalWidth")
- {
- const uint16_t* value =
- std::get_if<uint16_t>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["BusWidthBits"] = *value;
- }
- else if (property.first == "ECC")
+ for (const char* v : values)
+ {
+ if (boost::ends_with(*value, v))
{
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG << "Invalid property type for ECC";
- return;
- }
- constexpr const std::array<const char*, 4> values{
- "NoECC", "SingleBitECC", "MultiBitECC",
- "AddressParity"};
-
- for (const char* v : values)
- {
- if (boost::ends_with(*value, v))
- {
- aResp->res.jsonValue["ErrorCorrection"] = v;
- break;
- }
- }
+ aResp->res.jsonValue["ErrorCorrection"] = v;
+ break;
}
- else if (property.first == "FormFactor")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG
- << "Invalid property type for FormFactor";
- return;
- }
- constexpr const std::array<const char*, 11> values{
- "RDIMM", "UDIMM", "SO_DIMM",
- "LRDIMM", "Mini_RDIMM", "Mini_UDIMM",
- "SO_RDIMM_72b", "SO_UDIMM_72b", "SO_DIMM_16b",
- "SO_DIMM_32b", "Die"};
+ }
+ }
+ else if (property.first == "FormFactor")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ BMCWEB_LOG_DEBUG << "Invalid property type for FormFactor";
+ return;
+ }
+ constexpr const std::array<const char*, 11> values{
+ "RDIMM", "UDIMM", "SO_DIMM", "LRDIMM",
+ "Mini_RDIMM", "Mini_UDIMM", "SO_RDIMM_72b", "SO_UDIMM_72b",
+ "SO_DIMM_16b", "SO_DIMM_32b", "Die"};
- for (const char* v : values)
- {
- if (boost::ends_with(*value, v))
- {
- aResp->res.jsonValue["BaseModuleType"] = v;
- break;
- }
- }
- }
- else if (property.first == "AllowedSpeedsMT")
+ for (const char* v : values)
+ {
+ if (boost::ends_with(*value, v))
{
- const std::vector<uint16_t>* value =
- std::get_if<std::vector<uint16_t>>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- nlohmann::json& jValue =
- aResp->res.jsonValue["AllowedSpeedsMHz"];
- jValue = nlohmann::json::array();
- for (uint16_t subVal : *value)
- {
- jValue.push_back(subVal);
- }
+ aResp->res.jsonValue["BaseModuleType"] = v;
+ break;
}
- else if (property.first == "MemoryAttributes")
- {
- const uint8_t* value =
- std::get_if<uint8_t>(&property.second);
+ }
+ }
+ else if (property.first == "AllowedSpeedsMT")
+ {
+ const std::vector<uint16_t>* value =
+ std::get_if<std::vector<uint16_t>>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ nlohmann::json& jValue = aResp->res.jsonValue["AllowedSpeedsMHz"];
+ jValue = nlohmann::json::array();
+ for (uint16_t subVal : *value)
+ {
+ jValue.push_back(subVal);
+ }
+ }
+ else if (property.first == "MemoryAttributes")
+ {
+ const uint8_t* value = std::get_if<uint8_t>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG
- << "Invalid property type for MemoryAttributes";
- return;
- }
- aResp->res.jsonValue["RankCount"] =
- static_cast<uint64_t>(*value);
- }
- else if (property.first == "MemoryConfiguredSpeedInMhz")
- {
- const uint16_t* value =
- std::get_if<uint16_t>(&property.second);
- if (value == nullptr)
- {
- continue;
- }
- aResp->res.jsonValue["OperatingSpeedMhz"] = *value;
- }
- else if (property.first == "MemoryType")
- {
- const auto* value =
- std::get_if<std::string>(&property.second);
- if (value != nullptr)
- {
- std::string memoryDeviceType =
- translateMemoryTypeToRedfish(*value);
- // Values like "Unknown" or "Other" will return empty
- // so just leave off
- if (!memoryDeviceType.empty())
- {
- aResp->res.jsonValue["MemoryDeviceType"] =
- memoryDeviceType;
- }
- if (value->find("DDR") != std::string::npos)
- {
- aResp->res.jsonValue["MemoryType"] = "DRAM";
- }
- else if (boost::ends_with(*value, "Logical"))
- {
- aResp->res.jsonValue["MemoryType"] = "IntelOptane";
- }
- }
- }
- // memory location interface
- else if (property.first == "Channel" ||
- property.first == "MemoryController" ||
- property.first == "Slot" || property.first == "Socket")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- return;
- }
- aResp->res.jsonValue["MemoryLocation"][property.first] =
- *value;
- }
- else if (property.first == "SparePartNumber")
- {
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- return;
- }
- aResp->res.jsonValue["SparePartNumber"] = *value;
- }
- else if (property.first == "Model")
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ BMCWEB_LOG_DEBUG
+ << "Invalid property type for MemoryAttributes";
+ return;
+ }
+ aResp->res.jsonValue["RankCount"] = static_cast<uint64_t>(*value);
+ }
+ else if (property.first == "MemoryConfiguredSpeedInMhz")
+ {
+ const uint16_t* value = std::get_if<uint16_t>(&property.second);
+ if (value == nullptr)
+ {
+ continue;
+ }
+ aResp->res.jsonValue["OperatingSpeedMhz"] = *value;
+ }
+ else if (property.first == "MemoryType")
+ {
+ const auto* value = std::get_if<std::string>(&property.second);
+ if (value != nullptr)
+ {
+ std::string memoryDeviceType =
+ translateMemoryTypeToRedfish(*value);
+ // Values like "Unknown" or "Other" will return empty
+ // so just leave off
+ if (!memoryDeviceType.empty())
{
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- return;
- }
- aResp->res.jsonValue["Model"] = *value;
+ aResp->res.jsonValue["MemoryDeviceType"] = memoryDeviceType;
}
- else if (property.first == "LocationCode")
+ if (value->find("DDR") != std::string::npos)
{
- const std::string* value =
- std::get_if<std::string>(&property.second);
- if (value == nullptr)
- {
- messages::internalError(aResp->res);
- return;
- }
- aResp->res
- .jsonValue["Location"]["PartLocation"]["ServiceLabel"] =
- *value;
+ aResp->res.jsonValue["MemoryType"] = "DRAM";
}
- else
+ else if (boost::ends_with(*value, "Logical"))
{
- getPersistentMemoryProperties(aResp, property);
+ aResp->res.jsonValue["MemoryType"] = "IntelOptane";
}
}
+ }
+ // memory location interface
+ else if (property.first == "Channel" ||
+ property.first == "MemoryController" ||
+ property.first == "Slot" || property.first == "Socket")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ return;
+ }
+ aResp->res.jsonValue["MemoryLocation"][property.first] = *value;
+ }
+ else if (property.first == "SparePartNumber")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ return;
+ }
+ aResp->res.jsonValue["SparePartNumber"] = *value;
+ }
+ else if (property.first == "Model")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ return;
+ }
+ aResp->res.jsonValue["Model"] = *value;
+ }
+ else if (property.first == "LocationCode")
+ {
+ const std::string* value =
+ std::get_if<std::string>(&property.second);
+ if (value == nullptr)
+ {
+ messages::internalError(aResp->res);
+ return;
+ }
+ aResp->res.jsonValue["Location"]["PartLocation"]["ServiceLabel"] =
+ *value;
+ }
+ else
+ {
+ getPersistentMemoryProperties(aResp, property);
+ }
+ }
+}
+
+inline void getDimmDataByService(std::shared_ptr<bmcweb::AsyncResp> aResp,
+ const std::string& dimmId,
+ const std::string& service,
+ const std::string& objPath)
+{
+ auto health = std::make_shared<HealthPopulate>(aResp);
+ health->selfPath = objPath;
+ health->populate();
+
+ BMCWEB_LOG_DEBUG << "Get available system components.";
+ crow::connections::systemBus->async_method_call(
+ [dimmId, aResp{std::move(aResp)}](
+ const boost::system::error_code ec,
+ const dbus::utility::DBusPropertiesMap& properties) {
+ if (ec)
+ {
+ BMCWEB_LOG_DEBUG << "DBUS response error";
+ messages::internalError(aResp->res);
+ return;
+ }
+ assembleDimmProperties(dimmId, aResp, properties);
},
service, objPath, "org.freedesktop.DBus.Properties", "GetAll", "");
}