diff --git a/include/mdrv2.hpp b/include/mdrv2.hpp
index 2cdcc45..c7b4655 100644
--- a/include/mdrv2.hpp
+++ b/include/mdrv2.hpp
@@ -125,6 +125,7 @@
     Mdr2DirStruct smbiosDir;
 
     bool readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data);
+    bool checkSMBIOSVersion(uint8_t* dataIn);
 
     const std::array<uint8_t, 16> smbiosTableId{
         40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 0x42};
diff --git a/include/smbios_mdrv2.hpp b/include/smbios_mdrv2.hpp
index 0d8ec30..4f3b654 100644
--- a/include/smbios_mdrv2.hpp
+++ b/include/smbios_mdrv2.hpp
@@ -119,6 +119,29 @@
     uint32_t dataSize;
 } __attribute__((packed));
 
+typedef struct
+{
+    uint8_t majorVersion;
+    uint8_t minorVersion;
+} SMBIOSVersion;
+
+struct EntryPointStructure
+{
+    uint32_t anchorString;
+    uint8_t epChecksum;
+    uint8_t epLength;
+    SMBIOSVersion smbiosVersion;
+    uint16_t maxStructSize;
+    uint8_t epRevision;
+    uint8_t formattedArea[5];
+    uint8_t intermediateAnchorString[5];
+    uint8_t intermediateChecksum;
+    uint16_t structTableLength;
+    uint32_t structTableAddress;
+    uint16_t noOfSmbiosStruct;
+    uint8_t smbiosBDCRevision;
+} __attribute__((packed));
+
 static constexpr const char* cpuPath =
     "/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu";
 
@@ -131,6 +154,9 @@
 static constexpr const char* systemPath =
     "/xyz/openbmc_project/inventory/system/chassis/motherboard/bios";
 
+constexpr std::array<SMBIOSVersion, 2> supportedSMBIOSVersions{
+    SMBIOSVersion{3, 2}, SMBIOSVersion{3, 3}};
+
 typedef enum
 {
     biosType = 0,
diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index d678848..8e5883b 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -581,6 +581,50 @@
     return num;
 }
 
+bool MDR_V2::checkSMBIOSVersion(uint8_t* dataIn)
+{
+    const std::string anchorString = "_SM_";
+    std::string buffer(dataIn, dataIn + smbiosTableStorageSize);
+
+    auto it = std::search(std::begin(buffer), std::end(buffer),
+                          std::begin(anchorString), std::end(anchorString));
+    if (it == std::end(buffer))
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Anchor String not found");
+        return false;
+    }
+
+    auto pos = std::distance(std::begin(buffer), it);
+    auto length = smbiosTableStorageSize - pos;
+    if (length < sizeof(EntryPointStructure))
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Invalid entry point structure");
+        return false;
+    }
+
+    auto epStructure =
+        reinterpret_cast<const EntryPointStructure*>(&dataIn[pos]);
+    lg2::info("SMBIOS VERSION - {MAJOR}.{MINOR}", "MAJOR",
+              epStructure->smbiosVersion.majorVersion, "MINOR",
+              epStructure->smbiosVersion.minorVersion);
+
+    auto itr = std::find_if(
+        std::begin(supportedSMBIOSVersions), std::end(supportedSMBIOSVersions),
+        [&](SMBIOSVersion versionItr) {
+            return versionItr.majorVersion ==
+                       epStructure->smbiosVersion.majorVersion &&
+                   versionItr.minorVersion ==
+                       epStructure->smbiosVersion.minorVersion;
+        });
+    if (itr == std::end(supportedSMBIOSVersions))
+    {
+        return false;
+    }
+    return true;
+}
+
 bool MDR_V2::agentSynchronizeData()
 {
     struct MDRSMBIOSHeader mdr2SMBIOS;
@@ -592,15 +636,21 @@
             "agent data sync failed - read data from flash failed");
         return false;
     }
-    else
+
+    if (!checkSMBIOSVersion(smbiosDir.dir[smbiosDirIndex].dataStorage))
     {
-        systemInfoUpdate();
-        smbiosDir.dir[smbiosDirIndex].common.dataVersion = mdr2SMBIOS.dirVer;
-        smbiosDir.dir[smbiosDirIndex].common.timestamp = mdr2SMBIOS.timestamp;
-        smbiosDir.dir[smbiosDirIndex].common.size = mdr2SMBIOS.dataSize;
-        smbiosDir.dir[smbiosDirIndex].stage = MDR2SMBIOSStatusEnum::mdr2Loaded;
-        smbiosDir.dir[smbiosDirIndex].lock = MDR2DirLockEnum::mdr2DirUnlock;
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Unsupported SMBIOS table version");
+        return false;
     }
+
+    systemInfoUpdate();
+    smbiosDir.dir[smbiosDirIndex].common.dataVersion = mdr2SMBIOS.dirVer;
+    smbiosDir.dir[smbiosDirIndex].common.timestamp = mdr2SMBIOS.timestamp;
+    smbiosDir.dir[smbiosDirIndex].common.size = mdr2SMBIOS.dataSize;
+    smbiosDir.dir[smbiosDirIndex].stage = MDR2SMBIOSStatusEnum::mdr2Loaded;
+    smbiosDir.dir[smbiosDirIndex].lock = MDR2DirLockEnum::mdr2DirUnlock;
+
     return true;
 }
 
