xref: /openbmc/bmcweb/features/redfish/include/utils/pcie_util.hpp (revision ac106bf6d10841a25088ed14105a73636ba71519)
1472bd202SLakshmi Yadlapati #pragma once
2472bd202SLakshmi Yadlapati 
3472bd202SLakshmi Yadlapati #include "async_resp.hpp"
4472bd202SLakshmi Yadlapati #include "dbus_utility.hpp"
5472bd202SLakshmi Yadlapati #include "error_messages.hpp"
6472bd202SLakshmi Yadlapati #include "http/utility.hpp"
7472bd202SLakshmi Yadlapati 
8472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp>
9472bd202SLakshmi Yadlapati #include <boost/url/format.hpp>
10472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp>
11472bd202SLakshmi Yadlapati 
12472bd202SLakshmi Yadlapati #include <array>
13472bd202SLakshmi Yadlapati #include <memory>
14472bd202SLakshmi Yadlapati #include <string>
15472bd202SLakshmi Yadlapati #include <string_view>
16472bd202SLakshmi Yadlapati 
17472bd202SLakshmi Yadlapati namespace redfish
18472bd202SLakshmi Yadlapati {
19472bd202SLakshmi Yadlapati namespace pcie_util
20472bd202SLakshmi Yadlapati {
21472bd202SLakshmi Yadlapati 
22472bd202SLakshmi Yadlapati /**
23472bd202SLakshmi Yadlapati  * @brief Populate the PCIe Device list from a GetSubTreePaths search of
24472bd202SLakshmi Yadlapati  *        inventory
25472bd202SLakshmi Yadlapati  *
26*ac106bf6SEd Tanous  * @param[i,o] asyncResp  Async response object
27*ac106bf6SEd Tanous  * @param[i]   Name   Key to store the list of PCIe devices in asyncResp
28472bd202SLakshmi Yadlapati  *
29472bd202SLakshmi Yadlapati  * @return void
30472bd202SLakshmi Yadlapati  */
31472bd202SLakshmi Yadlapati 
32472bd202SLakshmi Yadlapati inline void
33472bd202SLakshmi Yadlapati     getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
34472bd202SLakshmi Yadlapati                       const std::string& name)
35472bd202SLakshmi Yadlapati {
36472bd202SLakshmi Yadlapati     static constexpr std::array<std::string_view, 1> pcieDeviceInterface = {
37472bd202SLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeDevice"};
38472bd202SLakshmi Yadlapati 
39472bd202SLakshmi Yadlapati     dbus::utility::getSubTreePaths(
40472bd202SLakshmi Yadlapati         "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface,
41472bd202SLakshmi Yadlapati         [asyncResp, name](const boost::system::error_code& ec,
42472bd202SLakshmi Yadlapati                           const dbus::utility::MapperGetSubTreePathsResponse&
43472bd202SLakshmi Yadlapati                               pcieDevicePaths) {
44472bd202SLakshmi Yadlapati         if (ec)
45472bd202SLakshmi Yadlapati         {
46472bd202SLakshmi Yadlapati             BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
47472bd202SLakshmi Yadlapati                              << ec.message();
48472bd202SLakshmi Yadlapati             // Not an error, system just doesn't have PCIe info
49472bd202SLakshmi Yadlapati             return;
50472bd202SLakshmi Yadlapati         }
51472bd202SLakshmi Yadlapati         nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
52472bd202SLakshmi Yadlapati         pcieDeviceList = nlohmann::json::array();
53472bd202SLakshmi Yadlapati         for (const std::string& pcieDevicePath : pcieDevicePaths)
54472bd202SLakshmi Yadlapati         {
55472bd202SLakshmi Yadlapati             size_t devStart = pcieDevicePath.rfind('/');
56472bd202SLakshmi Yadlapati             if (devStart == std::string::npos)
57472bd202SLakshmi Yadlapati             {
58472bd202SLakshmi Yadlapati                 continue;
59472bd202SLakshmi Yadlapati             }
60472bd202SLakshmi Yadlapati 
61472bd202SLakshmi Yadlapati             std::string devName = pcieDevicePath.substr(devStart + 1);
62472bd202SLakshmi Yadlapati             if (devName.empty())
63472bd202SLakshmi Yadlapati             {
64472bd202SLakshmi Yadlapati                 continue;
65472bd202SLakshmi Yadlapati             }
66472bd202SLakshmi Yadlapati             nlohmann::json::object_t pcieDevice;
67472bd202SLakshmi Yadlapati             pcieDevice["@odata.id"] = boost::urls::format(
68472bd202SLakshmi Yadlapati                 "/redfish/v1/Systems/system/PCIeDevices/{}", devName);
69472bd202SLakshmi Yadlapati             pcieDeviceList.emplace_back(std::move(pcieDevice));
70472bd202SLakshmi Yadlapati         }
71472bd202SLakshmi Yadlapati         asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
72472bd202SLakshmi Yadlapati         });
73472bd202SLakshmi Yadlapati }
74472bd202SLakshmi Yadlapati 
75472bd202SLakshmi Yadlapati } // namespace pcie_util
76472bd202SLakshmi Yadlapati } // namespace redfish
77