xref: /openbmc/bmcweb/features/redfish/include/utils/pcie_util.hpp (revision 472bd202da308ea7ba6c9f5606e025367b52fccc)
1*472bd202SLakshmi Yadlapati #pragma once
2*472bd202SLakshmi Yadlapati 
3*472bd202SLakshmi Yadlapati #include "async_resp.hpp"
4*472bd202SLakshmi Yadlapati #include "dbus_utility.hpp"
5*472bd202SLakshmi Yadlapati #include "error_messages.hpp"
6*472bd202SLakshmi Yadlapati #include "http/utility.hpp"
7*472bd202SLakshmi Yadlapati 
8*472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp>
9*472bd202SLakshmi Yadlapati #include <boost/url/format.hpp>
10*472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp>
11*472bd202SLakshmi Yadlapati 
12*472bd202SLakshmi Yadlapati #include <array>
13*472bd202SLakshmi Yadlapati #include <memory>
14*472bd202SLakshmi Yadlapati #include <string>
15*472bd202SLakshmi Yadlapati #include <string_view>
16*472bd202SLakshmi Yadlapati 
17*472bd202SLakshmi Yadlapati namespace redfish
18*472bd202SLakshmi Yadlapati {
19*472bd202SLakshmi Yadlapati namespace pcie_util
20*472bd202SLakshmi Yadlapati {
21*472bd202SLakshmi Yadlapati 
22*472bd202SLakshmi Yadlapati /**
23*472bd202SLakshmi Yadlapati  * @brief Populate the PCIe Device list from a GetSubTreePaths search of
24*472bd202SLakshmi Yadlapati  *        inventory
25*472bd202SLakshmi Yadlapati  *
26*472bd202SLakshmi Yadlapati  * @param[i,o] aResp  Async response object
27*472bd202SLakshmi Yadlapati  * @param[i]   Name   Key to store the list of PCIe devices in aResp
28*472bd202SLakshmi Yadlapati  *
29*472bd202SLakshmi Yadlapati  * @return void
30*472bd202SLakshmi Yadlapati  */
31*472bd202SLakshmi Yadlapati 
32*472bd202SLakshmi Yadlapati inline void
33*472bd202SLakshmi Yadlapati     getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
34*472bd202SLakshmi Yadlapati                       const std::string& name)
35*472bd202SLakshmi Yadlapati {
36*472bd202SLakshmi Yadlapati     static constexpr std::array<std::string_view, 1> pcieDeviceInterface = {
37*472bd202SLakshmi Yadlapati         "xyz.openbmc_project.Inventory.Item.PCIeDevice"};
38*472bd202SLakshmi Yadlapati 
39*472bd202SLakshmi Yadlapati     dbus::utility::getSubTreePaths(
40*472bd202SLakshmi Yadlapati         "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface,
41*472bd202SLakshmi Yadlapati         [asyncResp, name](const boost::system::error_code& ec,
42*472bd202SLakshmi Yadlapati                           const dbus::utility::MapperGetSubTreePathsResponse&
43*472bd202SLakshmi Yadlapati                               pcieDevicePaths) {
44*472bd202SLakshmi Yadlapati         if (ec)
45*472bd202SLakshmi Yadlapati         {
46*472bd202SLakshmi Yadlapati             BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
47*472bd202SLakshmi Yadlapati                              << ec.message();
48*472bd202SLakshmi Yadlapati             // Not an error, system just doesn't have PCIe info
49*472bd202SLakshmi Yadlapati             return;
50*472bd202SLakshmi Yadlapati         }
51*472bd202SLakshmi Yadlapati         nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
52*472bd202SLakshmi Yadlapati         pcieDeviceList = nlohmann::json::array();
53*472bd202SLakshmi Yadlapati         for (const std::string& pcieDevicePath : pcieDevicePaths)
54*472bd202SLakshmi Yadlapati         {
55*472bd202SLakshmi Yadlapati             size_t devStart = pcieDevicePath.rfind('/');
56*472bd202SLakshmi Yadlapati             if (devStart == std::string::npos)
57*472bd202SLakshmi Yadlapati             {
58*472bd202SLakshmi Yadlapati                 continue;
59*472bd202SLakshmi Yadlapati             }
60*472bd202SLakshmi Yadlapati 
61*472bd202SLakshmi Yadlapati             std::string devName = pcieDevicePath.substr(devStart + 1);
62*472bd202SLakshmi Yadlapati             if (devName.empty())
63*472bd202SLakshmi Yadlapati             {
64*472bd202SLakshmi Yadlapati                 continue;
65*472bd202SLakshmi Yadlapati             }
66*472bd202SLakshmi Yadlapati             nlohmann::json::object_t pcieDevice;
67*472bd202SLakshmi Yadlapati             pcieDevice["@odata.id"] = boost::urls::format(
68*472bd202SLakshmi Yadlapati                 "/redfish/v1/Systems/system/PCIeDevices/{}", devName);
69*472bd202SLakshmi Yadlapati             pcieDeviceList.emplace_back(std::move(pcieDevice));
70*472bd202SLakshmi Yadlapati         }
71*472bd202SLakshmi Yadlapati         asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
72*472bd202SLakshmi Yadlapati         });
73*472bd202SLakshmi Yadlapati }
74*472bd202SLakshmi Yadlapati 
75*472bd202SLakshmi Yadlapati } // namespace pcie_util
76*472bd202SLakshmi Yadlapati } // namespace redfish
77