1*08e4a6dfSJie Yang #pragma once 2*08e4a6dfSJie Yang #include "smbios_mdrv2.hpp" 3*08e4a6dfSJie Yang 4*08e4a6dfSJie Yang #include <xyz/openbmc_project/Inventory/Connector/Embedded/server.hpp> 5*08e4a6dfSJie Yang #include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp> 6*08e4a6dfSJie Yang #include <xyz/openbmc_project/Inventory/Item/PCIeSlot/server.hpp> 7*08e4a6dfSJie Yang #include <xyz/openbmc_project/Inventory/Item/server.hpp> 8*08e4a6dfSJie Yang 9*08e4a6dfSJie Yang #include <cstdint> 10*08e4a6dfSJie Yang #include <map> 11*08e4a6dfSJie Yang #include <unordered_set> 12*08e4a6dfSJie Yang 13*08e4a6dfSJie Yang namespace phosphor 14*08e4a6dfSJie Yang { 15*08e4a6dfSJie Yang 16*08e4a6dfSJie Yang namespace smbios 17*08e4a6dfSJie Yang { 18*08e4a6dfSJie Yang 19*08e4a6dfSJie Yang using PCIeSlot = 20*08e4a6dfSJie Yang sdbusplus::xyz::openbmc_project::Inventory::Item::server::PCIeSlot; 21*08e4a6dfSJie Yang using PCIeGeneration = sdbusplus::xyz::openbmc_project::Inventory::Item:: 22*08e4a6dfSJie Yang server::PCIeSlot::Generations; 23*08e4a6dfSJie Yang using PCIeType = sdbusplus::xyz::openbmc_project::Inventory::Item::server:: 24*08e4a6dfSJie Yang PCIeSlot::SlotTypes; 25*08e4a6dfSJie Yang using embedded = 26*08e4a6dfSJie Yang sdbusplus::xyz::openbmc_project::Inventory::Connector::server::Embedded; 27*08e4a6dfSJie Yang using location = 28*08e4a6dfSJie Yang sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::LocationCode; 29*08e4a6dfSJie Yang using item = sdbusplus::xyz::openbmc_project::Inventory::server::Item; 30*08e4a6dfSJie Yang 31*08e4a6dfSJie Yang class Pcie : sdbusplus::server::object_t<PCIeSlot, location, embedded, item> 32*08e4a6dfSJie Yang { 33*08e4a6dfSJie Yang public: 34*08e4a6dfSJie Yang Pcie() = delete; 35*08e4a6dfSJie Yang Pcie(const Pcie&) = delete; 36*08e4a6dfSJie Yang Pcie& operator=(const Pcie&) = delete; 37*08e4a6dfSJie Yang Pcie(Pcie&&) = delete; 38*08e4a6dfSJie Yang Pcie& operator=(Pcie&&) = delete; 39*08e4a6dfSJie Yang ~Pcie() = default; 40*08e4a6dfSJie Yang 41*08e4a6dfSJie Yang Pcie(sdbusplus::bus::bus& bus, const std::string& objPath, 42*08e4a6dfSJie Yang const uint8_t& pcieId, uint8_t* smbiosTableStorage) : 43*08e4a6dfSJie Yang sdbusplus::server::object_t<PCIeSlot, location, embedded, item>( 44*08e4a6dfSJie Yang bus, objPath.c_str()), 45*08e4a6dfSJie Yang pcieNum(pcieId), storage(smbiosTableStorage) 46*08e4a6dfSJie Yang { 47*08e4a6dfSJie Yang pcieInfoUpdate(); 48*08e4a6dfSJie Yang } 49*08e4a6dfSJie Yang 50*08e4a6dfSJie Yang void pcieInfoUpdate(); 51*08e4a6dfSJie Yang 52*08e4a6dfSJie Yang private: 53*08e4a6dfSJie Yang uint8_t pcieNum; 54*08e4a6dfSJie Yang uint8_t* storage; 55*08e4a6dfSJie Yang 56*08e4a6dfSJie Yang struct SystemSlotInfo 57*08e4a6dfSJie Yang { 58*08e4a6dfSJie Yang uint8_t type; 59*08e4a6dfSJie Yang uint8_t length; 60*08e4a6dfSJie Yang uint16_t handle; 61*08e4a6dfSJie Yang uint8_t slotDesignation; 62*08e4a6dfSJie Yang uint8_t slotType; 63*08e4a6dfSJie Yang uint8_t slotDataBusWidth; 64*08e4a6dfSJie Yang uint8_t currUsage; 65*08e4a6dfSJie Yang uint8_t slotLength; 66*08e4a6dfSJie Yang uint16_t slotID; 67*08e4a6dfSJie Yang uint8_t characteristics1; 68*08e4a6dfSJie Yang uint8_t characteristics2; 69*08e4a6dfSJie Yang uint16_t segGroupNum; 70*08e4a6dfSJie Yang uint8_t busNum; 71*08e4a6dfSJie Yang uint8_t deviceNum; 72*08e4a6dfSJie Yang } __attribute__((packed)); 73*08e4a6dfSJie Yang 74*08e4a6dfSJie Yang void pcieGeneration(const uint8_t type); 75*08e4a6dfSJie Yang void pcieType(const uint8_t type); 76*08e4a6dfSJie Yang void pcieLaneSize(const uint8_t width); 77*08e4a6dfSJie Yang void pcieIsHotPluggable(const uint8_t characteristics); 78*08e4a6dfSJie Yang void pcieLocation(const uint8_t slotDesignation, const uint8_t structLen, 79*08e4a6dfSJie Yang uint8_t* dataIn); 80*08e4a6dfSJie Yang }; 81*08e4a6dfSJie Yang 82*08e4a6dfSJie Yang static const std::unordered_set<uint8_t> pcieSmbiosType = { 83*08e4a6dfSJie Yang 0x09, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c, 84*08e4a6dfSJie Yang 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xa5, 85*08e4a6dfSJie Yang 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 86*08e4a6dfSJie Yang 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 87*08e4a6dfSJie Yang 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6}; 88*08e4a6dfSJie Yang 89*08e4a6dfSJie Yang // Definition follow smbios spec DSP0134 3.4.0 90*08e4a6dfSJie Yang static const std::map<uint8_t, PCIeGeneration> pcieGenerationTable = { 91*08e4a6dfSJie Yang {0x09, PCIeGeneration::Unknown}, {0x14, PCIeGeneration::Gen3}, 92*08e4a6dfSJie Yang {0x15, PCIeGeneration::Gen3}, {0x16, PCIeGeneration::Gen3}, 93*08e4a6dfSJie Yang {0x17, PCIeGeneration::Gen3}, {0x18, PCIeGeneration::Gen1}, 94*08e4a6dfSJie Yang {0x19, PCIeGeneration::Gen1}, {0x1a, PCIeGeneration::Gen1}, 95*08e4a6dfSJie Yang {0x1b, PCIeGeneration::Gen1}, {0x1c, PCIeGeneration::Gen1}, 96*08e4a6dfSJie Yang {0x1d, PCIeGeneration::Gen3}, {0x1e, PCIeGeneration::Gen3}, 97*08e4a6dfSJie Yang {0x1f, PCIeGeneration::Gen2}, {0x20, PCIeGeneration::Gen3}, 98*08e4a6dfSJie Yang {0x21, PCIeGeneration::Gen1}, {0x22, PCIeGeneration::Gen1}, 99*08e4a6dfSJie Yang {0x23, PCIeGeneration::Gen1}, {0x24, PCIeGeneration::Gen4}, 100*08e4a6dfSJie Yang {0x25, PCIeGeneration::Gen5}, {0x26, PCIeGeneration::Unknown}, 101*08e4a6dfSJie Yang {0x27, PCIeGeneration::Unknown}, {0x28, PCIeGeneration::Unknown}, 102*08e4a6dfSJie Yang {0x29, PCIeGeneration::Unknown}, {0xa5, PCIeGeneration::Gen1}, 103*08e4a6dfSJie Yang {0xa6, PCIeGeneration::Gen1}, {0xa7, PCIeGeneration::Gen1}, 104*08e4a6dfSJie Yang {0xa8, PCIeGeneration::Gen1}, {0xa9, PCIeGeneration::Gen1}, 105*08e4a6dfSJie Yang {0xaa, PCIeGeneration::Gen1}, {0xab, PCIeGeneration::Gen2}, 106*08e4a6dfSJie Yang {0xac, PCIeGeneration::Gen2}, {0xad, PCIeGeneration::Gen2}, 107*08e4a6dfSJie Yang {0xae, PCIeGeneration::Gen2}, {0xaf, PCIeGeneration::Gen2}, 108*08e4a6dfSJie Yang {0xb0, PCIeGeneration::Gen2}, {0xb1, PCIeGeneration::Gen3}, 109*08e4a6dfSJie Yang {0xb2, PCIeGeneration::Gen3}, {0xb3, PCIeGeneration::Gen3}, 110*08e4a6dfSJie Yang {0xb4, PCIeGeneration::Gen3}, {0xb5, PCIeGeneration::Gen3}, 111*08e4a6dfSJie Yang {0xb6, PCIeGeneration::Gen3}, {0xb8, PCIeGeneration::Gen4}, 112*08e4a6dfSJie Yang {0xb9, PCIeGeneration::Gen4}, {0xba, PCIeGeneration::Gen4}, 113*08e4a6dfSJie Yang {0xbb, PCIeGeneration::Gen4}, {0xbc, PCIeGeneration::Gen4}, 114*08e4a6dfSJie Yang {0xbd, PCIeGeneration::Gen4}, {0xbe, PCIeGeneration::Gen5}, 115*08e4a6dfSJie Yang {0xbf, PCIeGeneration::Gen5}, {0xc0, PCIeGeneration::Gen5}, 116*08e4a6dfSJie Yang {0xc1, PCIeGeneration::Gen5}, {0xc2, PCIeGeneration::Gen5}, 117*08e4a6dfSJie Yang {0xc3, PCIeGeneration::Gen5}, {0xc4, PCIeGeneration::Unknown}, 118*08e4a6dfSJie Yang {0xc5, PCIeGeneration::Unknown}, {0xc6, PCIeGeneration::Unknown}}; 119*08e4a6dfSJie Yang 120*08e4a6dfSJie Yang static const std::map<uint8_t, PCIeType> pcieTypeTable = { 121*08e4a6dfSJie Yang {0x09, PCIeType::OEM}, {0x14, PCIeType::M_2}, 122*08e4a6dfSJie Yang {0x15, PCIeType::M_2}, {0x16, PCIeType::M_2}, 123*08e4a6dfSJie Yang {0x17, PCIeType::M_2}, {0x18, PCIeType::Unknown}, 124*08e4a6dfSJie Yang {0x19, PCIeType::Unknown}, {0x1a, PCIeType::Unknown}, 125*08e4a6dfSJie Yang {0x1b, PCIeType::Unknown}, {0x1c, PCIeType::Unknown}, 126*08e4a6dfSJie Yang {0x1d, PCIeType::Unknown}, {0x1e, PCIeType::Unknown}, 127*08e4a6dfSJie Yang {0xa8, PCIeType::Unknown}, {0xa9, PCIeType::Unknown}, 128*08e4a6dfSJie Yang {0x1F, PCIeType::U_2}, {0x20, PCIeType::U_2}, 129*08e4a6dfSJie Yang {0x21, PCIeType::Mini}, {0x22, PCIeType::Mini}, 130*08e4a6dfSJie Yang {0x23, PCIeType::Mini}, {0x24, PCIeType::U_2}, 131*08e4a6dfSJie Yang {0x25, PCIeType::U_2}, {0x26, PCIeType::OCP3Small}, 132*08e4a6dfSJie Yang {0x27, PCIeType::OCP3Large}, {0x28, PCIeType::Unknown}, 133*08e4a6dfSJie Yang {0x29, PCIeType::Unknown}, {0xa5, PCIeType::Unknown}, 134*08e4a6dfSJie Yang {0xa6, PCIeType::Unknown}, {0xa7, PCIeType::Unknown}, 135*08e4a6dfSJie Yang {0xa8, PCIeType::Unknown}, {0xa9, PCIeType::Unknown}, 136*08e4a6dfSJie Yang {0xaa, PCIeType::Unknown}, {0xab, PCIeType::Unknown}, 137*08e4a6dfSJie Yang {0xac, PCIeType::Unknown}, {0xad, PCIeType::Unknown}, 138*08e4a6dfSJie Yang {0xae, PCIeType::Unknown}, {0xaf, PCIeType::Unknown}, 139*08e4a6dfSJie Yang {0xb0, PCIeType::Unknown}, {0xb1, PCIeType::Unknown}, 140*08e4a6dfSJie Yang {0xb2, PCIeType::Unknown}, {0xb3, PCIeType::Unknown}, 141*08e4a6dfSJie Yang {0xb4, PCIeType::Unknown}, {0xb5, PCIeType::Unknown}, 142*08e4a6dfSJie Yang {0xb6, PCIeType::Unknown}, {0xb8, PCIeType::Unknown}, 143*08e4a6dfSJie Yang {0xb9, PCIeType::Unknown}, {0xba, PCIeType::Unknown}, 144*08e4a6dfSJie Yang {0xbb, PCIeType::Unknown}, {0xbc, PCIeType::Unknown}, 145*08e4a6dfSJie Yang {0xbd, PCIeType::Unknown}, {0xbe, PCIeType::Unknown}, 146*08e4a6dfSJie Yang {0xbf, PCIeType::Unknown}, {0xc0, PCIeType::Unknown}, 147*08e4a6dfSJie Yang {0xc1, PCIeType::Unknown}, {0xc2, PCIeType::Unknown}, 148*08e4a6dfSJie Yang {0xc3, PCIeType::Unknown}, {0xc4, PCIeType::Unknown}, 149*08e4a6dfSJie Yang {0xc5, PCIeType::Unknown}, {0xc6, PCIeType::Unknown}}; 150*08e4a6dfSJie Yang 151*08e4a6dfSJie Yang const std::map<uint8_t, size_t> pcieLanesTable = { 152*08e4a6dfSJie Yang {0x08, 1}, {0x09, 2}, {0xa, 4}, {0xb, 8}, {0xc, 12}, {0xd, 16}, {0xe, 32}}; 153*08e4a6dfSJie Yang 154*08e4a6dfSJie Yang }; // namespace smbios 155*08e4a6dfSJie Yang 156*08e4a6dfSJie Yang }; // namespace phosphor 157