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