xref: /openbmc/bmcweb/features/redfish/include/utils/pcie_util.hpp (revision c49c329d2ccf45859030844eb205a8476148fb25)
1472bd202SLakshmi Yadlapati #pragma once
2472bd202SLakshmi Yadlapati 
3472bd202SLakshmi Yadlapati #include "async_resp.hpp"
4472bd202SLakshmi Yadlapati #include "dbus_utility.hpp"
5472bd202SLakshmi Yadlapati #include "error_messages.hpp"
6*c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_device.hpp"
7*c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_slots.hpp"
8472bd202SLakshmi Yadlapati #include "http/utility.hpp"
9472bd202SLakshmi Yadlapati 
10472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp>
11472bd202SLakshmi Yadlapati #include <boost/url/format.hpp>
12472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp>
13472bd202SLakshmi Yadlapati 
14472bd202SLakshmi Yadlapati #include <array>
15472bd202SLakshmi Yadlapati #include <memory>
16*c49c329dSLakshmi Yadlapati #include <optional>
17472bd202SLakshmi Yadlapati #include <string>
18472bd202SLakshmi Yadlapati #include <string_view>
19472bd202SLakshmi Yadlapati 
20472bd202SLakshmi Yadlapati namespace redfish
21472bd202SLakshmi Yadlapati {
22472bd202SLakshmi Yadlapati namespace pcie_util
23472bd202SLakshmi Yadlapati {
24472bd202SLakshmi Yadlapati 
25472bd202SLakshmi Yadlapati /**
26472bd202SLakshmi Yadlapati  * @brief Populate the PCIe Device list from a GetSubTreePaths search of
27472bd202SLakshmi Yadlapati  *        inventory
28472bd202SLakshmi Yadlapati  *
29ac106bf6SEd Tanous  * @param[i,o] asyncResp  Async response object
30ac106bf6SEd Tanous  * @param[i]   Name   Key to store the list of PCIe devices in asyncResp
31472bd202SLakshmi Yadlapati  *
32472bd202SLakshmi Yadlapati  * @return void
33472bd202SLakshmi Yadlapati  */
34472bd202SLakshmi Yadlapati 
35472bd202SLakshmi Yadlapati inline void
36472bd202SLakshmi Yadlapati     getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
37472bd202SLakshmi Yadlapati                       const std::string& name)
38472bd202SLakshmi Yadlapati {
39472bd202SLakshmi Yadlapati     static constexpr std::array<std::string_view, 1> pcieDeviceInterface = {
40472bd202SLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeDevice"};
41472bd202SLakshmi Yadlapati 
42472bd202SLakshmi Yadlapati     dbus::utility::getSubTreePaths(
43472bd202SLakshmi Yadlapati         "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface,
44472bd202SLakshmi Yadlapati         [asyncResp, name](const boost::system::error_code& ec,
45472bd202SLakshmi Yadlapati                           const dbus::utility::MapperGetSubTreePathsResponse&
46472bd202SLakshmi Yadlapati                               pcieDevicePaths) {
47472bd202SLakshmi Yadlapati         if (ec)
48472bd202SLakshmi Yadlapati         {
49472bd202SLakshmi Yadlapati             BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
50472bd202SLakshmi Yadlapati                              << ec.message();
51472bd202SLakshmi Yadlapati             // Not an error, system just doesn't have PCIe info
52472bd202SLakshmi Yadlapati             return;
53472bd202SLakshmi Yadlapati         }
54472bd202SLakshmi Yadlapati         nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
55472bd202SLakshmi Yadlapati         pcieDeviceList = nlohmann::json::array();
56472bd202SLakshmi Yadlapati         for (const std::string& pcieDevicePath : pcieDevicePaths)
57472bd202SLakshmi Yadlapati         {
58472bd202SLakshmi Yadlapati             size_t devStart = pcieDevicePath.rfind('/');
59472bd202SLakshmi Yadlapati             if (devStart == std::string::npos)
60472bd202SLakshmi Yadlapati             {
61472bd202SLakshmi Yadlapati                 continue;
62472bd202SLakshmi Yadlapati             }
63472bd202SLakshmi Yadlapati 
64472bd202SLakshmi Yadlapati             std::string devName = pcieDevicePath.substr(devStart + 1);
65472bd202SLakshmi Yadlapati             if (devName.empty())
66472bd202SLakshmi Yadlapati             {
67472bd202SLakshmi Yadlapati                 continue;
68472bd202SLakshmi Yadlapati             }
69472bd202SLakshmi Yadlapati             nlohmann::json::object_t pcieDevice;
70472bd202SLakshmi Yadlapati             pcieDevice["@odata.id"] = boost::urls::format(
71472bd202SLakshmi Yadlapati                 "/redfish/v1/Systems/system/PCIeDevices/{}", devName);
72472bd202SLakshmi Yadlapati             pcieDeviceList.emplace_back(std::move(pcieDevice));
73472bd202SLakshmi Yadlapati         }
74472bd202SLakshmi Yadlapati         asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
75472bd202SLakshmi Yadlapati         });
76472bd202SLakshmi Yadlapati }
77472bd202SLakshmi Yadlapati 
78*c49c329dSLakshmi Yadlapati inline std::optional<pcie_slots::SlotTypes>
79*c49c329dSLakshmi Yadlapati     dbusSlotTypeToRf(const std::string& slotType)
80*c49c329dSLakshmi Yadlapati {
81*c49c329dSLakshmi Yadlapati     if (slotType ==
82*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength")
83*c49c329dSLakshmi Yadlapati     {
84*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::FullLength;
85*c49c329dSLakshmi Yadlapati     }
86*c49c329dSLakshmi Yadlapati     if (slotType ==
87*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength")
88*c49c329dSLakshmi Yadlapati     {
89*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::HalfLength;
90*c49c329dSLakshmi Yadlapati     }
91*c49c329dSLakshmi Yadlapati     if (slotType ==
92*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile")
93*c49c329dSLakshmi Yadlapati     {
94*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::LowProfile;
95*c49c329dSLakshmi Yadlapati     }
96*c49c329dSLakshmi Yadlapati     if (slotType ==
97*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini")
98*c49c329dSLakshmi Yadlapati     {
99*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::Mini;
100*c49c329dSLakshmi Yadlapati     }
101*c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2")
102*c49c329dSLakshmi Yadlapati     {
103*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::M2;
104*c49c329dSLakshmi Yadlapati     }
105*c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM")
106*c49c329dSLakshmi Yadlapati     {
107*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OEM;
108*c49c329dSLakshmi Yadlapati     }
109*c49c329dSLakshmi Yadlapati     if (slotType ==
110*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small")
111*c49c329dSLakshmi Yadlapati     {
112*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OCP3Small;
113*c49c329dSLakshmi Yadlapati     }
114*c49c329dSLakshmi Yadlapati     if (slotType ==
115*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large")
116*c49c329dSLakshmi Yadlapati     {
117*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OCP3Large;
118*c49c329dSLakshmi Yadlapati     }
119*c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2")
120*c49c329dSLakshmi Yadlapati     {
121*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::U2;
122*c49c329dSLakshmi Yadlapati     }
123*c49c329dSLakshmi Yadlapati     if (slotType ==
124*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown")
125*c49c329dSLakshmi Yadlapati     {
126*c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::Invalid;
127*c49c329dSLakshmi Yadlapati     }
128*c49c329dSLakshmi Yadlapati 
129*c49c329dSLakshmi Yadlapati     // Unspecified slotType should return an internal error.
130*c49c329dSLakshmi Yadlapati     return std::nullopt;
131*c49c329dSLakshmi Yadlapati }
132*c49c329dSLakshmi Yadlapati 
133*c49c329dSLakshmi Yadlapati inline std::optional<pcie_device::PCIeTypes>
134*c49c329dSLakshmi Yadlapati     redfishPcieGenerationFromDbus(const std::string& generationInUse)
135*c49c329dSLakshmi Yadlapati {
136*c49c329dSLakshmi Yadlapati     if (generationInUse ==
137*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1")
138*c49c329dSLakshmi Yadlapati     {
139*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen1;
140*c49c329dSLakshmi Yadlapati     }
141*c49c329dSLakshmi Yadlapati     if (generationInUse ==
142*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2")
143*c49c329dSLakshmi Yadlapati     {
144*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen2;
145*c49c329dSLakshmi Yadlapati     }
146*c49c329dSLakshmi Yadlapati     if (generationInUse ==
147*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3")
148*c49c329dSLakshmi Yadlapati     {
149*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen3;
150*c49c329dSLakshmi Yadlapati     }
151*c49c329dSLakshmi Yadlapati     if (generationInUse ==
152*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4")
153*c49c329dSLakshmi Yadlapati     {
154*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen4;
155*c49c329dSLakshmi Yadlapati     }
156*c49c329dSLakshmi Yadlapati     if (generationInUse ==
157*c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5")
158*c49c329dSLakshmi Yadlapati     {
159*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen5;
160*c49c329dSLakshmi Yadlapati     }
161*c49c329dSLakshmi Yadlapati     if (generationInUse.empty() ||
162*c49c329dSLakshmi Yadlapati         generationInUse ==
163*c49c329dSLakshmi Yadlapati             "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown")
164*c49c329dSLakshmi Yadlapati     {
165*c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Invalid;
166*c49c329dSLakshmi Yadlapati     }
167*c49c329dSLakshmi Yadlapati 
168*c49c329dSLakshmi Yadlapati     // The value is not unknown or Gen1-5, need return an internal error.
169*c49c329dSLakshmi Yadlapati     return std::nullopt;
170*c49c329dSLakshmi Yadlapati }
171*c49c329dSLakshmi Yadlapati 
172472bd202SLakshmi Yadlapati } // namespace pcie_util
173472bd202SLakshmi Yadlapati } // namespace redfish
174