Update FormFactor property on DIMM interface

The patch adds the `FormFactor` property on DIMM interface.
BMC parses the SMBIOS Type 17 records and assigns the DIMM
FormFactor.

Tested:
[1] busctl get-property xyz.openbmc_project.Smbios.MDR_V2 xyz/openbmc_project/inventory/system/chassis/motherboard/dimm1 xyz.openbmc_project.Inventory.Item.Dimm FormFactor s "xyz.openbmc_project.Inventory.Item.Dimm.FormFactor.Die"

Change-Id: I14b7f0ea0a51e58306c117fcde1b268da798cd36
Signed-off-by: Prithvi Pai <ppai@nvidia.com>
diff --git a/include/dimm.hpp b/include/dimm.hpp
index e848f42..851ef82 100644
--- a/include/dimm.hpp
+++ b/include/dimm.hpp
@@ -42,6 +42,9 @@
 using MemoryTechType =
     sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::MemoryTech;
 
+using FormFactor =
+    sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::FormFactor;
+
 using Json = nlohmann::json;
 
 class Dimm :
@@ -127,6 +130,7 @@
     uint16_t memoryConfiguredSpeedInMhz(uint16_t value) override;
     bool functional(bool value) override;
     EccType ecc(EccType value) override;
+    FormFactor formFactor(FormFactor value) override;
     Json parseConfigFile();
 
   private:
@@ -151,6 +155,7 @@
     void dimmPartNum(const uint8_t positionNum, const uint8_t structLen,
                      uint8_t* dataIn);
     void updateEccType(uint16_t exPhyArrayHandle);
+    void updateFormFactor(const uint8_t formFactorKey);
 };
 
 struct MemoryInfo
@@ -264,6 +269,9 @@
     uint8_t channel;
 };
 
+const std::map<uint8_t, FormFactor> dimmFormFactorMap = {
+    {0x10, FormFactor::Die}};
+
 } // namespace smbios
 
 } // namespace phosphor
diff --git a/src/dimm.cpp b/src/dimm.cpp
index ce63f4f..f6228c9 100644
--- a/src/dimm.cpp
+++ b/src/dimm.cpp
@@ -99,6 +99,7 @@
     dimmType(memoryInfo->memoryType);
     dimmTypeDetail(memoryInfo->typeDetail);
     maxMemorySpeedInMhz(memoryInfo->speed);
+    updateFormFactor(memoryInfo->formFactor);
     dimmManufacturer(memoryInfo->manufacturer, memoryInfo->length, dataIn);
     dimmSerialNum(memoryInfo->serialNum, memoryInfo->length, dataIn);
     dimmPartNum(memoryInfo->partNum, memoryInfo->length, dataIn);
@@ -465,6 +466,22 @@
         OperationalStatus::functional(value);
 }
 
+void Dimm::updateFormFactor(const uint8_t formFactorKey)
+{
+    std::map<uint8_t, FormFactor>::const_iterator it =
+        dimmFormFactorMap.find(formFactorKey);
+    if (it != dimmFormFactorMap.end())
+    {
+        formFactor(it->second);
+    }
+}
+
+FormFactor Dimm::formFactor(FormFactor value)
+{
+    return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
+        formFactor(value);
+}
+
 Json Dimm::parseConfigFile()
 {
     std::ifstream memoryLocationFile(filename);