diff --git a/src/dimm.cpp b/src/dimm.cpp
index 72f5ed3..2138886 100644
--- a/src/dimm.cpp
+++ b/src/dimm.cpp
@@ -21,6 +21,8 @@
 #include <boost/algorithm/string.hpp>
 #include <phosphor-logging/elog-errors.hpp>
 
+#include <regex>
+
 namespace phosphor
 {
 namespace smbios
@@ -93,6 +95,7 @@
     dimmSerialNum(memoryInfo->serialNum, memoryInfo->length, dataIn);
     dimmPartNum(memoryInfo->partNum, memoryInfo->length, dataIn);
     memoryAttributes(memoryInfo->attributes);
+    dimmMedia(memoryInfo->memoryTechnology);
     memoryConfiguredSpeedInMhz(memoryInfo->confClockSpeed);
 
     updateEccType(memoryInfo->phyArrayHandle);
@@ -202,6 +205,43 @@
     memoryDeviceLocator(result);
 
     locationCode(result);
+    const std::string substrCpu = "CPU";
+    auto cpuPos = deviceLocator.find(substrCpu);
+
+    if (cpuPos != std::string::npos)
+    {
+        std::string socketString =
+            deviceLocator.substr(cpuPos + substrCpu.length(), 1);
+        try
+        {
+            uint8_t socketNum =
+                static_cast<uint8_t>(std::stoi(socketString) + 1);
+            socket(socketNum);
+        }
+        catch (const sdbusplus::exception_t& ex)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "std::stoi operation failed ",
+                phosphor::logging::entry("ERROR=%s", ex.what()));
+        }
+    }
+
+    const std::string substrDimm = "DIMM";
+    auto dimmPos = deviceLocator.find(substrDimm);
+
+    if (dimmPos != std::string::npos)
+    {
+        std::string slotString =
+            deviceLocator.substr(dimmPos + substrDimm.length() + 1);
+        /* slotString is extracted from substrDimm (DIMM_A) if slotString is
+         * single alphabet like A, B , C.. then assign ASCII value of slotString
+         * to slot */
+        if ((std::regex_match(slotString, std::regex("^[A-Za-z]+$"))) &&
+            (slotString.length() == 1))
+        {
+            slot(static_cast<uint8_t>(toupper(slotString[0])));
+        }
+    }
 }
 
 std::string Dimm::memoryDeviceLocator(std::string value)
@@ -229,6 +269,26 @@
         memoryType(value);
 }
 
+void Dimm::dimmMedia(const uint8_t type)
+{
+    std::map<uint8_t, MemoryTechType>::const_iterator it =
+        dimmMemoryTechTypeMap.find(type);
+    if (it == dimmMemoryTechTypeMap.end())
+    {
+        memoryMedia(MemoryTechType::Unknown);
+    }
+    else
+    {
+        memoryMedia(it->second);
+    }
+}
+
+MemoryTechType Dimm::memoryMedia(MemoryTechType value)
+{
+    return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
+        memoryMedia(value);
+}
+
 void Dimm::dimmTypeDetail(uint16_t detail)
 {
     std::string result;
@@ -325,6 +385,18 @@
         memoryAttributes(value);
 }
 
+uint8_t Dimm::slot(uint8_t value)
+{
+    return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
+        MemoryLocation::slot(value);
+}
+
+uint8_t Dimm::socket(uint8_t value)
+{
+    return sdbusplus::server::xyz::openbmc_project::inventory::item::dimm::
+        MemoryLocation::socket(value);
+}
+
 uint16_t Dimm::memoryConfiguredSpeedInMhz(uint16_t value)
 {
     return sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::
