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