diff --git a/include/pcieslot.hpp b/include/pcieslot.hpp
new file mode 100644
index 0000000..d16d75e
--- /dev/null
+++ b/include/pcieslot.hpp
@@ -0,0 +1,156 @@
+#pragma once
+#include "smbios_mdrv2.hpp"
+
+#include <xyz/openbmc_project/Inventory/Connector/Embedded/server.hpp>
+#include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp>
+#include <xyz/openbmc_project/Inventory/Item/PCIeSlot/server.hpp>
+#include <xyz/openbmc_project/Inventory/Item/server.hpp>
+
+#include <cstdint>
+#include <map>
+#include <unordered_set>
+
+namespace phosphor
+{
+
+namespace smbios
+{
+
+using PCIeSlot =
+    sdbusplus::xyz::openbmc_project::Inventory::Item::server::PCIeSlot;
+using PCIeGeneration = sdbusplus::xyz::openbmc_project::Inventory::Item::
+    server::PCIeSlot::Generations;
+using PCIeType = sdbusplus::xyz::openbmc_project::Inventory::Item::server::
+    PCIeSlot::SlotTypes;
+using embedded =
+    sdbusplus::xyz::openbmc_project::Inventory::Connector::server::Embedded;
+using location =
+    sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::LocationCode;
+using item = sdbusplus::xyz::openbmc_project::Inventory::server::Item;
+
+class Pcie : sdbusplus::server::object_t<PCIeSlot, location, embedded, item>
+{
+  public:
+    Pcie() = delete;
+    Pcie(const Pcie&) = delete;
+    Pcie& operator=(const Pcie&) = delete;
+    Pcie(Pcie&&) = delete;
+    Pcie& operator=(Pcie&&) = delete;
+    ~Pcie() = default;
+
+    Pcie(sdbusplus::bus::bus& bus, const std::string& objPath,
+         const uint8_t& pcieId, uint8_t* smbiosTableStorage) :
+        sdbusplus::server::object_t<PCIeSlot, location, embedded, item>(
+            bus, objPath.c_str()),
+        pcieNum(pcieId), storage(smbiosTableStorage)
+    {
+        pcieInfoUpdate();
+    }
+
+    void pcieInfoUpdate();
+
+  private:
+    uint8_t pcieNum;
+    uint8_t* storage;
+
+    struct SystemSlotInfo
+    {
+        uint8_t type;
+        uint8_t length;
+        uint16_t handle;
+        uint8_t slotDesignation;
+        uint8_t slotType;
+        uint8_t slotDataBusWidth;
+        uint8_t currUsage;
+        uint8_t slotLength;
+        uint16_t slotID;
+        uint8_t characteristics1;
+        uint8_t characteristics2;
+        uint16_t segGroupNum;
+        uint8_t busNum;
+        uint8_t deviceNum;
+    } __attribute__((packed));
+
+    void pcieGeneration(const uint8_t type);
+    void pcieType(const uint8_t type);
+    void pcieLaneSize(const uint8_t width);
+    void pcieIsHotPluggable(const uint8_t characteristics);
+    void pcieLocation(const uint8_t slotDesignation, const uint8_t structLen,
+                      uint8_t* dataIn);
+};
+
+static const std::unordered_set<uint8_t> pcieSmbiosType = {
+    0x09, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c,
+    0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1,
+    0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd,
+    0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6};
+
+// Definition follow smbios spec DSP0134 3.4.0
+static const std::map<uint8_t, PCIeGeneration> pcieGenerationTable = {
+    {0x09, PCIeGeneration::Unknown}, {0x14, PCIeGeneration::Gen3},
+    {0x15, PCIeGeneration::Gen3},    {0x16, PCIeGeneration::Gen3},
+    {0x17, PCIeGeneration::Gen3},    {0x18, PCIeGeneration::Gen1},
+    {0x19, PCIeGeneration::Gen1},    {0x1a, PCIeGeneration::Gen1},
+    {0x1b, PCIeGeneration::Gen1},    {0x1c, PCIeGeneration::Gen1},
+    {0x1d, PCIeGeneration::Gen3},    {0x1e, PCIeGeneration::Gen3},
+    {0x1f, PCIeGeneration::Gen2},    {0x20, PCIeGeneration::Gen3},
+    {0x21, PCIeGeneration::Gen1},    {0x22, PCIeGeneration::Gen1},
+    {0x23, PCIeGeneration::Gen1},    {0x24, PCIeGeneration::Gen4},
+    {0x25, PCIeGeneration::Gen5},    {0x26, PCIeGeneration::Unknown},
+    {0x27, PCIeGeneration::Unknown}, {0x28, PCIeGeneration::Unknown},
+    {0x29, PCIeGeneration::Unknown}, {0xa5, PCIeGeneration::Gen1},
+    {0xa6, PCIeGeneration::Gen1},    {0xa7, PCIeGeneration::Gen1},
+    {0xa8, PCIeGeneration::Gen1},    {0xa9, PCIeGeneration::Gen1},
+    {0xaa, PCIeGeneration::Gen1},    {0xab, PCIeGeneration::Gen2},
+    {0xac, PCIeGeneration::Gen2},    {0xad, PCIeGeneration::Gen2},
+    {0xae, PCIeGeneration::Gen2},    {0xaf, PCIeGeneration::Gen2},
+    {0xb0, PCIeGeneration::Gen2},    {0xb1, PCIeGeneration::Gen3},
+    {0xb2, PCIeGeneration::Gen3},    {0xb3, PCIeGeneration::Gen3},
+    {0xb4, PCIeGeneration::Gen3},    {0xb5, PCIeGeneration::Gen3},
+    {0xb6, PCIeGeneration::Gen3},    {0xb8, PCIeGeneration::Gen4},
+    {0xb9, PCIeGeneration::Gen4},    {0xba, PCIeGeneration::Gen4},
+    {0xbb, PCIeGeneration::Gen4},    {0xbc, PCIeGeneration::Gen4},
+    {0xbd, PCIeGeneration::Gen4},    {0xbe, PCIeGeneration::Gen5},
+    {0xbf, PCIeGeneration::Gen5},    {0xc0, PCIeGeneration::Gen5},
+    {0xc1, PCIeGeneration::Gen5},    {0xc2, PCIeGeneration::Gen5},
+    {0xc3, PCIeGeneration::Gen5},    {0xc4, PCIeGeneration::Unknown},
+    {0xc5, PCIeGeneration::Unknown}, {0xc6, PCIeGeneration::Unknown}};
+
+static const std::map<uint8_t, PCIeType> pcieTypeTable = {
+    {0x09, PCIeType::OEM},       {0x14, PCIeType::M_2},
+    {0x15, PCIeType::M_2},       {0x16, PCIeType::M_2},
+    {0x17, PCIeType::M_2},       {0x18, PCIeType::Unknown},
+    {0x19, PCIeType::Unknown},   {0x1a, PCIeType::Unknown},
+    {0x1b, PCIeType::Unknown},   {0x1c, PCIeType::Unknown},
+    {0x1d, PCIeType::Unknown},   {0x1e, PCIeType::Unknown},
+    {0xa8, PCIeType::Unknown},   {0xa9, PCIeType::Unknown},
+    {0x1F, PCIeType::U_2},       {0x20, PCIeType::U_2},
+    {0x21, PCIeType::Mini},      {0x22, PCIeType::Mini},
+    {0x23, PCIeType::Mini},      {0x24, PCIeType::U_2},
+    {0x25, PCIeType::U_2},       {0x26, PCIeType::OCP3Small},
+    {0x27, PCIeType::OCP3Large}, {0x28, PCIeType::Unknown},
+    {0x29, PCIeType::Unknown},   {0xa5, PCIeType::Unknown},
+    {0xa6, PCIeType::Unknown},   {0xa7, PCIeType::Unknown},
+    {0xa8, PCIeType::Unknown},   {0xa9, PCIeType::Unknown},
+    {0xaa, PCIeType::Unknown},   {0xab, PCIeType::Unknown},
+    {0xac, PCIeType::Unknown},   {0xad, PCIeType::Unknown},
+    {0xae, PCIeType::Unknown},   {0xaf, PCIeType::Unknown},
+    {0xb0, PCIeType::Unknown},   {0xb1, PCIeType::Unknown},
+    {0xb2, PCIeType::Unknown},   {0xb3, PCIeType::Unknown},
+    {0xb4, PCIeType::Unknown},   {0xb5, PCIeType::Unknown},
+    {0xb6, PCIeType::Unknown},   {0xb8, PCIeType::Unknown},
+    {0xb9, PCIeType::Unknown},   {0xba, PCIeType::Unknown},
+    {0xbb, PCIeType::Unknown},   {0xbc, PCIeType::Unknown},
+    {0xbd, PCIeType::Unknown},   {0xbe, PCIeType::Unknown},
+    {0xbf, PCIeType::Unknown},   {0xc0, PCIeType::Unknown},
+    {0xc1, PCIeType::Unknown},   {0xc2, PCIeType::Unknown},
+    {0xc3, PCIeType::Unknown},   {0xc4, PCIeType::Unknown},
+    {0xc5, PCIeType::Unknown},   {0xc6, PCIeType::Unknown}};
+
+const std::map<uint8_t, size_t> pcieLanesTable = {
+    {0x08, 1}, {0x09, 2}, {0xa, 4}, {0xb, 8}, {0xc, 12}, {0xd, 16}, {0xe, 32}};
+
+}; // namespace smbios
+
+}; // namespace phosphor
