diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index 25ef98a..f33fbc1 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -619,6 +619,38 @@
         }
     }
 
+#ifdef TPM_DBUS
+
+    num = getTotalTpm();
+    if (!num)
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>("get tpm failed");
+        return;
+    }
+    // In case the new size is smaller than old, trim the vector
+    if (*num < tpms.size())
+    {
+        tpms.resize(*num);
+    }
+
+    for (unsigned int index = 0; index < *num; index++)
+    {
+        std::string path =
+            smbiosInventoryPath + tpmSuffix + std::to_string(index);
+        if (index + 1 > tpms.size())
+        {
+            tpms.emplace_back(std::make_unique<phosphor::smbios::Tpm>(
+                *bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
+                motherboardPath));
+        }
+        else
+        {
+            tpms[index]->tpmInfoUpdate(
+                smbiosDir.dir[smbiosDirIndex].dataStorage, motherboardPath);
+        }
+    }
+#endif
+
     system.reset();
     system = std::make_unique<System>(bus, smbiosInventoryPath + systemSuffix,
                                       smbiosDir.dir[smbiosDirIndex].dataStorage,
@@ -734,6 +766,40 @@
     return num;
 }
 
+std::optional<size_t> MDRV2::getTotalTpm()
+{
+    uint8_t* dataIn = smbiosDir.dir[smbiosDirIndex].dataStorage;
+    size_t num = 0;
+
+    if (dataIn == nullptr)
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Fail to get tpm total slot - no storage data");
+        return std::nullopt;
+    }
+
+    while (1)
+    {
+        dataIn = getSMBIOSTypePtr(dataIn, tpmDeviceType);
+        if (dataIn == nullptr)
+        {
+            break;
+        }
+        num++;
+        dataIn = smbiosNextPtr(dataIn);
+        if (dataIn == nullptr)
+        {
+            break;
+        }
+        if (num >= limitEntryLen)
+        {
+            break;
+        }
+    }
+
+    return num;
+}
+
 bool MDRV2::checkSMBIOSVersion(uint8_t* dataIn)
 {
     const std::string anchorString21 = "_SM_";
diff --git a/src/meson.build b/src/meson.build
index 1c983bd..3a2bc17 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -15,6 +15,10 @@
     cpp_args_smbios += ['-DSLOT_DRIVE_PRESENCE']
 endif
 
+if get_option('tpm-dbus').allowed()
+    cpp_args_smbios += ['-DTPM_DBUS']
+endif
+
 executable(
     'smbiosmdrv2app',
     'mdrv2.cpp',
@@ -23,6 +27,7 @@
     'dimm.cpp',
     'system.cpp',
     'pcieslot.cpp',
+    'tpm.cpp',
     cpp_args: cpp_args_smbios,
     dependencies: [
         boost_dep,
diff --git a/src/tpm.cpp b/src/tpm.cpp
new file mode 100644
index 0000000..74279d0
--- /dev/null
+++ b/src/tpm.cpp
@@ -0,0 +1,102 @@
+#include "tpm.hpp"
+
+#include "mdrv2.hpp"
+
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+
+namespace phosphor
+{
+namespace smbios
+{
+
+void Tpm::tpmInfoUpdate(uint8_t* smbiosTableStorage,
+                        const std::string& motherboard)
+{
+    storage = smbiosTableStorage;
+    motherboardPath = motherboard;
+
+    uint8_t* dataIn = storage;
+    dataIn = getSMBIOSTypePtr(dataIn, tpmDeviceType);
+    if (dataIn == nullptr)
+    {
+        return;
+    }
+    for (uint8_t index = 0; index < tpmId; index++)
+    {
+        dataIn = smbiosNextPtr(dataIn);
+        if (dataIn == nullptr)
+        {
+            return;
+        }
+        dataIn = getSMBIOSTypePtr(dataIn, tpmDeviceType);
+        if (dataIn == nullptr)
+        {
+            return;
+        }
+    }
+    auto tpmInfo = reinterpret_cast<struct TPMInfo*>(dataIn);
+
+    present(true);
+    purpose(softwareversion::VersionPurpose::Other);
+    tpmVendor(tpmInfo);
+    tpmFirmwareVersion(tpmInfo);
+    tpmDescription(tpmInfo->description, tpmInfo->length, dataIn);
+    if (!motherboardPath.empty())
+    {
+        std::vector<std::tuple<std::string, std::string, std::string>> assocs;
+        assocs.emplace_back("chassis", "trusted_components", motherboardPath);
+        association::associations(assocs);
+    }
+}
+
+void Tpm::tpmVendor(const struct TPMInfo* tpmInfo)
+{
+    constexpr int vendorIdLength = 4;
+    // Specified as four ASCII characters, as defined by TCG Vendor ID
+    char vendorId[vendorIdLength + 1];
+    int i;
+    for (i = 0; i < vendorIdLength && tpmInfo->vendor[i] != '\0'; i++)
+    {
+        if (std::isprint(tpmInfo->vendor[i]))
+        {
+            vendorId[i] = tpmInfo->vendor[i];
+        }
+        else
+        {
+            vendorId[i] = '.';
+        }
+    }
+    vendorId[i] = '\0';
+    manufacturer(vendorId);
+}
+
+void Tpm::tpmFirmwareVersion(const struct TPMInfo* tpmInfo)
+{
+    std::stringstream stream;
+
+    if (tpmInfo->specMajor == tpmMajorVerion1)
+    {
+        auto ver = reinterpret_cast<const struct TPMVersionSpec1*>(
+            &tpmInfo->firmwareVersion1);
+        stream << ver->revMajor << "." << ver->revMinor;
+    }
+    else if (tpmInfo->specMajor == tpmMajorVerion2)
+    {
+        auto ver = reinterpret_cast<const struct TPMVersionSpec2*>(
+            &tpmInfo->firmwareVersion1);
+        stream << ver->revMajor << "." << ver->revMinor;
+    }
+    version(stream.str());
+}
+
+void Tpm::tpmDescription(const uint8_t positionNum, const uint8_t structLen,
+                         uint8_t* dataIn)
+{
+    std::string result = positionToString(positionNum, structLen, dataIn);
+    prettyName(result);
+}
+} // namespace smbios
+} // namespace phosphor
