xref: /openbmc/smbios-mdr/include/pcieslot.hpp (revision 08e4a6dfe54a98171839dba482f87ed9005b516b)
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