xref: /openbmc/bmcweb/features/redfish/include/utils/pcie_util.hpp (revision cf3b484e14fe9754c1812d9871d77b5b1ac9f620)
1472bd202SLakshmi Yadlapati #pragma once
2472bd202SLakshmi Yadlapati 
3472bd202SLakshmi Yadlapati #include "async_resp.hpp"
4472bd202SLakshmi Yadlapati #include "dbus_utility.hpp"
5472bd202SLakshmi Yadlapati #include "error_messages.hpp"
6c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_device.hpp"
7c49c329dSLakshmi 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>
16c49c329dSLakshmi 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 
78c49c329dSLakshmi Yadlapati inline std::optional<pcie_slots::SlotTypes>
79c49c329dSLakshmi Yadlapati     dbusSlotTypeToRf(const std::string& slotType)
80c49c329dSLakshmi Yadlapati {
81c49c329dSLakshmi Yadlapati     if (slotType ==
82c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength")
83c49c329dSLakshmi Yadlapati     {
84c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::FullLength;
85c49c329dSLakshmi Yadlapati     }
86c49c329dSLakshmi Yadlapati     if (slotType ==
87c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength")
88c49c329dSLakshmi Yadlapati     {
89c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::HalfLength;
90c49c329dSLakshmi Yadlapati     }
91c49c329dSLakshmi Yadlapati     if (slotType ==
92c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile")
93c49c329dSLakshmi Yadlapati     {
94c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::LowProfile;
95c49c329dSLakshmi Yadlapati     }
96c49c329dSLakshmi Yadlapati     if (slotType ==
97c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini")
98c49c329dSLakshmi Yadlapati     {
99c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::Mini;
100c49c329dSLakshmi Yadlapati     }
101c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2")
102c49c329dSLakshmi Yadlapati     {
103c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::M2;
104c49c329dSLakshmi Yadlapati     }
105c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM")
106c49c329dSLakshmi Yadlapati     {
107c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OEM;
108c49c329dSLakshmi Yadlapati     }
109c49c329dSLakshmi Yadlapati     if (slotType ==
110c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small")
111c49c329dSLakshmi Yadlapati     {
112c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OCP3Small;
113c49c329dSLakshmi Yadlapati     }
114c49c329dSLakshmi Yadlapati     if (slotType ==
115c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large")
116c49c329dSLakshmi Yadlapati     {
117c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::OCP3Large;
118c49c329dSLakshmi Yadlapati     }
119c49c329dSLakshmi Yadlapati     if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2")
120c49c329dSLakshmi Yadlapati     {
121c49c329dSLakshmi Yadlapati         return pcie_slots::SlotTypes::U2;
122c49c329dSLakshmi Yadlapati     }
123c49c329dSLakshmi Yadlapati     if (slotType ==
124c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown")
125c49c329dSLakshmi Yadlapati     {
126*cf3b484eSLakshmi Yadlapati         return std::nullopt;
127c49c329dSLakshmi Yadlapati     }
128c49c329dSLakshmi Yadlapati 
129*cf3b484eSLakshmi Yadlapati     return pcie_slots::SlotTypes::Invalid;
130c49c329dSLakshmi Yadlapati }
131c49c329dSLakshmi Yadlapati 
132c49c329dSLakshmi Yadlapati inline std::optional<pcie_device::PCIeTypes>
133c49c329dSLakshmi Yadlapati     redfishPcieGenerationFromDbus(const std::string& generationInUse)
134c49c329dSLakshmi Yadlapati {
135c49c329dSLakshmi Yadlapati     if (generationInUse ==
136c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1")
137c49c329dSLakshmi Yadlapati     {
138c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen1;
139c49c329dSLakshmi Yadlapati     }
140c49c329dSLakshmi Yadlapati     if (generationInUse ==
141c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2")
142c49c329dSLakshmi Yadlapati     {
143c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen2;
144c49c329dSLakshmi Yadlapati     }
145c49c329dSLakshmi Yadlapati     if (generationInUse ==
146c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3")
147c49c329dSLakshmi Yadlapati     {
148c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen3;
149c49c329dSLakshmi Yadlapati     }
150c49c329dSLakshmi Yadlapati     if (generationInUse ==
151c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4")
152c49c329dSLakshmi Yadlapati     {
153c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen4;
154c49c329dSLakshmi Yadlapati     }
155c49c329dSLakshmi Yadlapati     if (generationInUse ==
156c49c329dSLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5")
157c49c329dSLakshmi Yadlapati     {
158c49c329dSLakshmi Yadlapati         return pcie_device::PCIeTypes::Gen5;
159c49c329dSLakshmi Yadlapati     }
160c49c329dSLakshmi Yadlapati     if (generationInUse.empty() ||
161c49c329dSLakshmi Yadlapati         generationInUse ==
162c49c329dSLakshmi Yadlapati             "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown")
163c49c329dSLakshmi Yadlapati     {
164*cf3b484eSLakshmi Yadlapati         return std::nullopt;
165c49c329dSLakshmi Yadlapati     }
166c49c329dSLakshmi Yadlapati 
167*cf3b484eSLakshmi Yadlapati     return pcie_device::PCIeTypes::Invalid;
168c49c329dSLakshmi Yadlapati }
169c49c329dSLakshmi Yadlapati 
170472bd202SLakshmi Yadlapati } // namespace pcie_util
171472bd202SLakshmi Yadlapati } // namespace redfish
172