diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index bb0088f..b7de1a6 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -14,6 +14,7 @@
 
 #include <CLI/CLI.hpp>
 #include <algorithm>
+#include <boost/algorithm/string.hpp>
 #include <cstdarg>
 #include <exception>
 #include <filesystem>
@@ -23,6 +24,7 @@
 #include <iterator>
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
+#include <regex>
 
 using namespace std;
 using namespace openpower::vpd;
@@ -175,7 +177,6 @@
             {
                 Binary vec(get_if<Binary>(&kwVal.second)->begin(),
                            get_if<Binary>(&kwVal.second)->end());
-
                 prop.emplace(move(kw), move(vec));
             }
             else
@@ -755,6 +756,107 @@
 }
 
 /**
+ * @brief This checks for is this FRU a processor
+ *        And if yes, then checks for is this primary
+ *
+ * @param[in] js- vpd json to get the information about this FRU
+ * @param[in] filePath- FRU vpd
+ *
+ * @return true/false
+ */
+bool isThisPrimaryProcessor(nlohmann::json& js, const string& filePath)
+{
+    bool isProcessor = false;
+    bool isPrimary = false;
+
+    for (const auto& item : js["frus"][filePath])
+    {
+        if (item.find("extraInterfaces") != item.end())
+        {
+            for (const auto& eI : item["extraInterfaces"].items())
+            {
+                if (eI.key().find("Inventory.Item.Cpu") != string::npos)
+                {
+                    isProcessor = true;
+                }
+            }
+        }
+
+        if (isProcessor)
+        {
+            string cpuType = item.value("cpuType", "");
+            if (cpuType == "primary")
+            {
+                isPrimary = true;
+            }
+        }
+    }
+
+    return (isProcessor && isPrimary);
+}
+
+/**
+ * @brief This finds DIMM vpd in vpd json and enables them by binding the device
+ *        driver
+ * @param[in] js- vpd json to iterate through and take action if it is DIMM
+ */
+void doEnableAllDimms(nlohmann::json& js)
+{
+    // iterate over each fru
+    for (const auto& eachFru : js["frus"].items())
+    {
+        // skip the driver binding if eeprom already exists
+        if (fs::exists(eachFru.key()))
+        {
+            continue;
+        }
+
+        for (const auto& eachInventory : eachFru.value())
+        {
+            if (eachInventory.find("extraInterfaces") != eachInventory.end())
+            {
+                for (const auto& eI : eachInventory["extraInterfaces"].items())
+                {
+                    if (eI.key().find("Inventory.Item.Dimm") != string::npos)
+                    {
+                        string dimmVpd = eachFru.key();
+                        // fetch it from
+                        // "/sys/bus/i2c/drivers/at24/414-0050/eeprom"
+
+                        regex matchPatern("([0-9]+-[0-9]{4})");
+                        smatch matchFound;
+                        if (regex_search(dimmVpd, matchFound, matchPatern))
+                        {
+                            vector<string> i2cReg;
+                            boost::split(i2cReg, matchFound.str(0),
+                                         boost::is_any_of("-"));
+
+                            // remove 0s from begining
+                            const regex pattern("^0+(?!$)");
+                            for (auto& i : i2cReg)
+                            {
+                                i = regex_replace(i, pattern, "");
+                            }
+
+                            if (i2cReg.size() == 2)
+                            {
+                                // echo 24c32 0x50 >
+                                // /sys/bus/i2c/devices/i2c-16/new_device
+                                string cmnd = "echo 24c32 0x" + i2cReg[1] +
+                                              " > /sys/bus/i2c/devices/i2c-" +
+                                              i2cReg[0] + "/new_device";
+
+                                executeCmd(cmnd);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+/**
  * @brief Populate Dbus.
  * This method invokes all the populateInterface functions
  * and notifies PIM about dbus object.
@@ -798,6 +900,23 @@
                 log<level::ERR>("No object path found");
             }
         }
+        else
+        {
+            // check if it is processor vpd.
+            auto isPrimaryCpu = isThisPrimaryProcessor(js, filePath);
+
+            if (isPrimaryCpu)
+            {
+                auto ddVersion = getKwVal(vpdMap, "CRP0", "DD");
+
+                auto chipVersion = atoi(ddVersion.substr(1, 2).c_str());
+
+                if (chipVersion >= 2)
+                {
+                    doEnableAllDimms(js);
+                }
+            }
+        }
     }
 
     for (const auto& item : js["frus"][filePath])
diff --git a/ibm_vpd_utils.cpp b/ibm_vpd_utils.cpp
index 9b5530e..b8af0ed 100644
--- a/ibm_vpd_utils.cpp
+++ b/ibm_vpd_utils.cpp
@@ -543,5 +543,27 @@
     badVpdFileStream.write(reinterpret_cast<const char*>(vpdVector.data()),
                            vpdVector.size());
 }
+
+const string getKwVal(const Parsed& vpdMap, const string& rec,
+                      const string& kwd)
+{
+    string kwVal{};
+
+    auto findRec = vpdMap.find(rec);
+
+    // check if record is found in map we got by parser
+    if (findRec != vpdMap.end())
+    {
+        auto findKwd = findRec->second.find(kwd);
+
+        if (findKwd != findRec->second.end())
+        {
+            kwVal = findKwd->second;
+        }
+    }
+
+    return kwVal;
+}
+
 } // namespace vpd
 } // namespace openpower
\ No newline at end of file
diff --git a/ibm_vpd_utils.hpp b/ibm_vpd_utils.hpp
index 8983985..8cedafb 100644
--- a/ibm_vpd_utils.hpp
+++ b/ibm_vpd_utils.hpp
@@ -209,5 +209,20 @@
  * @param[in] vpdVector - bad vpd vector
  */
 void dumpBadVpd(const std::string& file, const Binary& vpdVector);
+
+/*
+ * @brief This function fetches the value for given keyword in the given record
+ *        from vpd data and returns this value.
+ *
+ * @param[in] vpdMap - vpd to find out the data
+ * @param[in] rec - Record under which desired keyword exists
+ * @param[in] kwd - keyword to read the data from
+ *
+ * @returns keyword value if record/keyword combination found
+ *          empty string if record or keyword is not found.
+ */
+const string getKwVal(const Parsed& vpdMap, const string& rec,
+                      const string& kwd);
+
 } // namespace vpd
 } // namespace openpower
\ No newline at end of file
