summaryrefslogtreecommitdiff
path: root/redfish-core/include/utils/pcie_util.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/include/utils/pcie_util.hpp')
-rw-r--r--redfish-core/include/utils/pcie_util.hpp76
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