Memory: Fix potential validator error
"Other" and "Unknown" are not valid Redfish MemoryDeviceType
values.
Do correct converting D-Bus enum to redfish.
Straight mapping (D-Bus and Redfish both contain the same name):
DDR
DDR2
DDR3
DDR4
DDR4E_SDRAM
LPDDR4_SDRAM
LPDDR3_SDRAM
DDR2_SDRAM_FB_DIMM
DDR2_SDRAM_FB_DIMM_PROBE (no E on the end of the d-bus name)
DDR_SGRAM
ROM
SDRAM
EDO
FastPageMode
PipelinedNibble
Logical
HBM
HBM2
The following D-Bus values are not mapped:
Other
Unknown
DRAM
EDRAM
VRAM
SRAM
RAM
FLASH
EEPROM
FEPROM
EPROM
CDRAM
ThreeDRM
RDRAM
FBD2
LPDDR_SDRAM
LPDDR2_SDRAM
The following Redfish values don't have a mapping to:
"DDR4_SDRAM"
"DDR3_SDRAM"
"DDR_SDRAM"
"DDR2_SDRAM"
Saw this because not setting the MemoryType so defaulting to
"Other" and had removed the logic to leave off all other memory
properties when MemorySizeInKB is 0 (commit above).
IBM systems are not setting MemorySizeInKB so it is defaulting to 0
hence why this validator error has not been seen in CI.
The validator error was "ERROR - MemoryDeviceType: Invalid Enum value
'Other' found, expected ['DDR', 'DDR2', 'DDR3', 'DDR4', 'DDR4_SDRAM',
'DDR4E_SDRAM', 'LPDDR4_SDRAM', 'DDR3_SDRAM', 'LPDDR3_SDRAM', 'DDR2_SDRAM',
'DDR2_SDRAM_FB_DIMM', 'DDR2_SDRAM_FB_DIMM_PROBE', 'DDR_SGRAM',
'DDR_SDRAM', 'ROM', 'SDRAM', 'EDO', 'FastPageMode', 'PipelinedNibble',
'Logical', 'HBM', 'HBM2']"
https://github.com/openbmc/phosphor-dbus-interfaces/blob/1e8c11bf2656ed4a5fb27baa2dec3a65763bb47e/xyz/openbmc_project/Inventory/Item/Dimm.interface.yaml#L120
Tested: Passes the validator. Sent this property on D-Bus to different values.
Change-Id: I629a1acd81fa6648893b7f531dfaab413cc2dd8f
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index e7b1113..aaff473 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -32,6 +32,110 @@
using DimmProperties = boost::container::flat_map<std::string, DimmProperty>;
+inline std::string translateMemoryTypeToRedfish(const std::string& memoryType)
+{
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR")
+ {
+ return "DDR";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2")
+ {
+ return "DDR2";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR3")
+ {
+ return "DDR3";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR4")
+ {
+ return "DDR4";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR4E_SDRAM")
+ {
+ return "DDR4E_SDRAM";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.LPDDR4_SDRAM")
+ {
+ return "LPDDR4_SDRAM";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.LPDDR3_SDRAM")
+ {
+ return "LPDDR3_SDRAM";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_SDRAM_FB_DIMM")
+ {
+ return "DDR2_SDRAM_FB_DIMM";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_"
+ "SDRAM_FB_DIMM_PROB")
+ {
+ return "DDR2_SDRAM_FB_DIMM_PROBE";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR_SGRAM")
+ {
+ return "DDR_SGRAM";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.ROM")
+ {
+ return "ROM";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.SDRAM")
+ {
+ return "SDRAM";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.EDO")
+ {
+ return "EDO";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.FastPageMode")
+ {
+ return "FastPageMode";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.PipelinedNibble")
+ {
+ return "PipelinedNibble";
+ }
+ if (memoryType ==
+ "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.Logical")
+ {
+ return "Logical";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.HBM")
+ {
+ return "HBM";
+ }
+ if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.HBM2")
+ {
+ return "HBM2";
+ }
+ // This is values like Other or Unknown
+ // Also D-Bus values:
+ // DRAM
+ // EDRAM
+ // VRAM
+ // SRAM
+ // RAM
+ // FLASH
+ // EEPROM
+ // FEPROM
+ // EPROM
+ // CDRAM
+ // ThreeDRAM
+ // RDRAM
+ // FBD2
+ // LPDDR_SDRAM
+ // LPDDR2_SDRAM
+ return "";
+}
+
inline void dimmPropToHex(const std::shared_ptr<AsyncResp>& aResp,
const char* key,
const std::pair<std::string, DimmProperty>& property)
@@ -543,16 +647,15 @@
std::get_if<std::string>(&property.second);
if (value != nullptr)
{
- size_t idx = value->rfind('.');
- if (idx == std::string::npos ||
- idx + 1 >= value->size())
+ std::string memoryDeviceType =
+ translateMemoryTypeToRedfish(*value);
+ // Values like "Unknown" or "Other" will return empty
+ // so just leave off
+ if (!memoryDeviceType.empty())
{
- messages::internalError(aResp->res);
- BMCWEB_LOG_DEBUG << "Invalid property type for "
- "MemoryType";
+ aResp->res.jsonValue["MemoryDeviceType"] =
+ memoryDeviceType;
}
- std::string result = value->substr(idx + 1);
- aResp->res.jsonValue["MemoryDeviceType"] = result;
if (value->find("DDR") != std::string::npos)
{
aResp->res.jsonValue["MemoryType"] = "DRAM";