diff options
Diffstat (limited to 'redfish-core/include')
-rw-r--r-- | redfish-core/include/utils/pcie_util.hpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/redfish-core/include/utils/pcie_util.hpp b/redfish-core/include/utils/pcie_util.hpp new file mode 100644 index 0000000000..51423b435f --- /dev/null +++ b/redfish-core/include/utils/pcie_util.hpp @@ -0,0 +1,76 @@ +#pragma once + +#include "async_resp.hpp" +#include "dbus_utility.hpp" +#include "error_messages.hpp" +#include "http/utility.hpp" + +#include <boost/system/error_code.hpp> +#include <boost/url/format.hpp> +#include <nlohmann/json.hpp> + +#include <array> +#include <memory> +#include <string> +#include <string_view> + +namespace redfish +{ +namespace pcie_util +{ + +/** + * @brief Populate the PCIe Device list from a GetSubTreePaths search of + * inventory + * + * @param[i,o] aResp Async response object + * @param[i] Name Key to store the list of PCIe devices in aResp + * + * @return void + */ + +inline void + getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::string& name) +{ + static constexpr std::array<std::string_view, 1> pcieDeviceInterface = { + "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; + + dbus::utility::getSubTreePaths( + "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface, + [asyncResp, name](const boost::system::error_code& ec, + const dbus::utility::MapperGetSubTreePathsResponse& + pcieDevicePaths) { + if (ec) + { + BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: " + << ec.message(); + // Not an error, system just doesn't have PCIe info + return; + } + nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name]; + pcieDeviceList = nlohmann::json::array(); + for (const std::string& pcieDevicePath : pcieDevicePaths) + { + size_t devStart = pcieDevicePath.rfind('/'); + if (devStart == std::string::npos) + { + continue; + } + + std::string devName = pcieDevicePath.substr(devStart + 1); + if (devName.empty()) + { + continue; + } + nlohmann::json::object_t pcieDevice; + pcieDevice["@odata.id"] = boost::urls::format( + "/redfish/v1/Systems/system/PCIeDevices/{}", devName); + pcieDeviceList.emplace_back(std::move(pcieDevice)); + } + asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size(); + }); +} + +} // namespace pcie_util +} // namespace redfish |