Enable MemoryLocation properties to be customized

-Enable MemoryLocation properties to be customized by a json table.
Example of memoryLocationTable.json:
{
    "<MemoryDeviceLocator>": {
      "MemoryController": 1,
      "Socket":48,
      "Slot":0,
      "Channel":0
    }
}

-Add attribute "memoryController", "slot", "channel", "socket" in
MemoryLocation.

Tested:

memoryLocationTable.json:
{
    "DIMM4": {
      "MemoryController": 1,
      "Socket":48,
      "Slot":0,
      "Channel":0
    }
}

with the change:
curl -k -X GET http://${bmc}/redfish/v1/Systems/system/Memory/dimm1
{
  "@odata.id": "/redfish/v1/Systems/system/Memory/dimm1",
  "@odata.type": "#Memory.v1_11_0.Memory",
  "AllowedSpeedsMHz": [],
  "BaseModuleType": "RDIMM",
  "BusWidthBits": 80,
  "CapacityMiB": 49152,
  "DataWidthBits": 64,
  "ErrorCorrection": "SingleBitECC",
  "FirmwareRevision": "0",
  "Id": "dimm1",
  "Location": {
    "PartLocation": {
      "LocationType": "Slot",
      "ServiceLabel": "DIMM4"
    }
  },
  "Manufacturer": "",
  "MemoryDeviceType": "DDR5",
  "MemoryLocation": {
    "Channel": 0,
    "MemoryController": 1,
    "Slot": 0,
    "Socket": 48
  }

without the change:

curl -k -X GET http://${bmc}/redfish/v1/Systems/system/Memory/dimm1
{
  "@odata.id": "/redfish/v1/Systems/system/Memory/dimm1",
  "@odata.type": "#Memory.v1_11_0.Memory",
  "AllowedSpeedsMHz": [],
  "BaseModuleType": "RDIMM",
  "BusWidthBits": 80,
  "CapacityMiB": 49152,
  "DataWidthBits": 64,
  "ErrorCorrection": "SingleBitECC",
  "FirmwareRevision": "0",
  "Id": "dimm1",
  "Location": {
    "PartLocation": {
      "LocationType": "Slot",
      "ServiceLabel": "DIMM4"
    }
  },
  "Manufacturer": "",
  "MemoryDeviceType": "DDR5",
  "MemoryLocation": {
    "Channel": 0,
    "MemoryController": 0,
    "Slot": 0,
    "Socket": 0
  }

Change-Id: Ic5ff09715a619907f06d06af33aa0d1755c8b4f3
Signed-off-by: Tony Lee <tony.lee@quantatw.com>
diff --git a/include/dimm.hpp b/include/dimm.hpp
index a3a48be..e848f42 100644
--- a/include/dimm.hpp
+++ b/include/dimm.hpp
@@ -17,6 +17,7 @@
 #pragma once
 #include "smbios_mdrv2.hpp"
 
+#include <nlohmann/json.hpp>
 #include <xyz/openbmc_project/Association/Definitions/server.hpp>
 #include <xyz/openbmc_project/Inventory/Connector/Slot/server.hpp>
 #include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
@@ -41,6 +42,8 @@
 using MemoryTechType =
     sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::MemoryTech;
 
+using Json = nlohmann::json;
+
 class Dimm :
     sdbusplus::server::object_t<
         sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm>,
@@ -119,9 +122,12 @@
     MemoryTechType memoryMedia(MemoryTechType value) override;
     uint8_t slot(uint8_t value) override;
     uint8_t socket(uint8_t value) override;
+    uint8_t memoryController(uint8_t value) override;
+    uint8_t channel(uint8_t value) override;
     uint16_t memoryConfiguredSpeedInMhz(uint16_t value) override;
     bool functional(bool value) override;
     EccType ecc(EccType value) override;
+    Json parseConfigFile();
 
   private:
     uint8_t dimmNum;
@@ -250,6 +256,14 @@
     {0x5, MemoryTechType::NVDIMM_F},   {0x6, MemoryTechType::NVDIMM_P},
     {0x7, MemoryTechType::IntelOptane}};
 
+struct memoryLocation
+{
+    uint8_t memoryController;
+    uint8_t socket;
+    uint8_t slot;
+    uint8_t channel;
+};
+
 } // namespace smbios
 
 } // namespace phosphor