1472bd202SLakshmi Yadlapati #pragma once 2472bd202SLakshmi Yadlapati 3472bd202SLakshmi Yadlapati #include "async_resp.hpp" 4472bd202SLakshmi Yadlapati #include "dbus_utility.hpp" 5472bd202SLakshmi Yadlapati #include "error_messages.hpp" 6c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_device.hpp" 7c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_slots.hpp" 8472bd202SLakshmi Yadlapati #include "http/utility.hpp" 9472bd202SLakshmi Yadlapati 10472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp> 11472bd202SLakshmi Yadlapati #include <boost/url/format.hpp> 12472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp> 13472bd202SLakshmi Yadlapati 14472bd202SLakshmi Yadlapati #include <array> 15472bd202SLakshmi Yadlapati #include <memory> 16c49c329dSLakshmi Yadlapati #include <optional> 17472bd202SLakshmi Yadlapati #include <string> 18472bd202SLakshmi Yadlapati #include <string_view> 19472bd202SLakshmi Yadlapati 20472bd202SLakshmi Yadlapati namespace redfish 21472bd202SLakshmi Yadlapati { 22472bd202SLakshmi Yadlapati namespace pcie_util 23472bd202SLakshmi Yadlapati { 24472bd202SLakshmi Yadlapati 25472bd202SLakshmi Yadlapati /** 26472bd202SLakshmi Yadlapati * @brief Populate the PCIe Device list from a GetSubTreePaths search of 27472bd202SLakshmi Yadlapati * inventory 28472bd202SLakshmi Yadlapati * 29ac106bf6SEd Tanous * @param[i,o] asyncResp Async response object 30ac106bf6SEd Tanous * @param[i] Name Key to store the list of PCIe devices in asyncResp 31472bd202SLakshmi Yadlapati * 32472bd202SLakshmi Yadlapati * @return void 33472bd202SLakshmi Yadlapati */ 34472bd202SLakshmi Yadlapati 35472bd202SLakshmi Yadlapati inline void 36472bd202SLakshmi Yadlapati getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 37472bd202SLakshmi Yadlapati const std::string& name) 38472bd202SLakshmi Yadlapati { 39472bd202SLakshmi Yadlapati static constexpr std::array<std::string_view, 1> pcieDeviceInterface = { 40472bd202SLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; 41472bd202SLakshmi Yadlapati 42472bd202SLakshmi Yadlapati dbus::utility::getSubTreePaths( 43472bd202SLakshmi Yadlapati "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface, 44472bd202SLakshmi Yadlapati [asyncResp, name](const boost::system::error_code& ec, 45472bd202SLakshmi Yadlapati const dbus::utility::MapperGetSubTreePathsResponse& 46472bd202SLakshmi Yadlapati pcieDevicePaths) { 47472bd202SLakshmi Yadlapati if (ec) 48472bd202SLakshmi Yadlapati { 49472bd202SLakshmi Yadlapati BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: " 50472bd202SLakshmi Yadlapati << ec.message(); 51472bd202SLakshmi Yadlapati // Not an error, system just doesn't have PCIe info 52472bd202SLakshmi Yadlapati return; 53472bd202SLakshmi Yadlapati } 54472bd202SLakshmi Yadlapati nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name]; 55472bd202SLakshmi Yadlapati pcieDeviceList = nlohmann::json::array(); 56472bd202SLakshmi Yadlapati for (const std::string& pcieDevicePath : pcieDevicePaths) 57472bd202SLakshmi Yadlapati { 58472bd202SLakshmi Yadlapati size_t devStart = pcieDevicePath.rfind('/'); 59472bd202SLakshmi Yadlapati if (devStart == std::string::npos) 60472bd202SLakshmi Yadlapati { 61472bd202SLakshmi Yadlapati continue; 62472bd202SLakshmi Yadlapati } 63472bd202SLakshmi Yadlapati 64472bd202SLakshmi Yadlapati std::string devName = pcieDevicePath.substr(devStart + 1); 65472bd202SLakshmi Yadlapati if (devName.empty()) 66472bd202SLakshmi Yadlapati { 67472bd202SLakshmi Yadlapati continue; 68472bd202SLakshmi Yadlapati } 69472bd202SLakshmi Yadlapati nlohmann::json::object_t pcieDevice; 70472bd202SLakshmi Yadlapati pcieDevice["@odata.id"] = boost::urls::format( 71472bd202SLakshmi Yadlapati "/redfish/v1/Systems/system/PCIeDevices/{}", devName); 72472bd202SLakshmi Yadlapati pcieDeviceList.emplace_back(std::move(pcieDevice)); 73472bd202SLakshmi Yadlapati } 74472bd202SLakshmi Yadlapati asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size(); 75472bd202SLakshmi Yadlapati }); 76472bd202SLakshmi Yadlapati } 77472bd202SLakshmi Yadlapati 78c49c329dSLakshmi Yadlapati inline std::optional<pcie_slots::SlotTypes> 79c49c329dSLakshmi Yadlapati dbusSlotTypeToRf(const std::string& slotType) 80c49c329dSLakshmi Yadlapati { 81c49c329dSLakshmi Yadlapati if (slotType == 82c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength") 83c49c329dSLakshmi Yadlapati { 84c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::FullLength; 85c49c329dSLakshmi Yadlapati } 86c49c329dSLakshmi Yadlapati if (slotType == 87c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength") 88c49c329dSLakshmi Yadlapati { 89c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::HalfLength; 90c49c329dSLakshmi Yadlapati } 91c49c329dSLakshmi Yadlapati if (slotType == 92c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile") 93c49c329dSLakshmi Yadlapati { 94c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::LowProfile; 95c49c329dSLakshmi Yadlapati } 96c49c329dSLakshmi Yadlapati if (slotType == 97c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini") 98c49c329dSLakshmi Yadlapati { 99c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::Mini; 100c49c329dSLakshmi Yadlapati } 101c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2") 102c49c329dSLakshmi Yadlapati { 103c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::M2; 104c49c329dSLakshmi Yadlapati } 105c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM") 106c49c329dSLakshmi Yadlapati { 107c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OEM; 108c49c329dSLakshmi Yadlapati } 109c49c329dSLakshmi Yadlapati if (slotType == 110c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small") 111c49c329dSLakshmi Yadlapati { 112c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Small; 113c49c329dSLakshmi Yadlapati } 114c49c329dSLakshmi Yadlapati if (slotType == 115c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large") 116c49c329dSLakshmi Yadlapati { 117c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Large; 118c49c329dSLakshmi Yadlapati } 119c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2") 120c49c329dSLakshmi Yadlapati { 121c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::U2; 122c49c329dSLakshmi Yadlapati } 123c49c329dSLakshmi Yadlapati if (slotType == 124c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown") 125c49c329dSLakshmi Yadlapati { 126*cf3b484eSLakshmi Yadlapati return std::nullopt; 127c49c329dSLakshmi Yadlapati } 128c49c329dSLakshmi Yadlapati 129*cf3b484eSLakshmi Yadlapati return pcie_slots::SlotTypes::Invalid; 130c49c329dSLakshmi Yadlapati } 131c49c329dSLakshmi Yadlapati 132c49c329dSLakshmi Yadlapati inline std::optional<pcie_device::PCIeTypes> 133c49c329dSLakshmi Yadlapati redfishPcieGenerationFromDbus(const std::string& generationInUse) 134c49c329dSLakshmi Yadlapati { 135c49c329dSLakshmi Yadlapati if (generationInUse == 136c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1") 137c49c329dSLakshmi Yadlapati { 138c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen1; 139c49c329dSLakshmi Yadlapati } 140c49c329dSLakshmi Yadlapati if (generationInUse == 141c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2") 142c49c329dSLakshmi Yadlapati { 143c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen2; 144c49c329dSLakshmi Yadlapati } 145c49c329dSLakshmi Yadlapati if (generationInUse == 146c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3") 147c49c329dSLakshmi Yadlapati { 148c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen3; 149c49c329dSLakshmi Yadlapati } 150c49c329dSLakshmi Yadlapati if (generationInUse == 151c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4") 152c49c329dSLakshmi Yadlapati { 153c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen4; 154c49c329dSLakshmi Yadlapati } 155c49c329dSLakshmi Yadlapati if (generationInUse == 156c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5") 157c49c329dSLakshmi Yadlapati { 158c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen5; 159c49c329dSLakshmi Yadlapati } 160c49c329dSLakshmi Yadlapati if (generationInUse.empty() || 161c49c329dSLakshmi Yadlapati generationInUse == 162c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown") 163c49c329dSLakshmi Yadlapati { 164*cf3b484eSLakshmi Yadlapati return std::nullopt; 165c49c329dSLakshmi Yadlapati } 166c49c329dSLakshmi Yadlapati 167*cf3b484eSLakshmi Yadlapati return pcie_device::PCIeTypes::Invalid; 168c49c329dSLakshmi Yadlapati } 169c49c329dSLakshmi Yadlapati 170472bd202SLakshmi Yadlapati } // namespace pcie_util 171472bd202SLakshmi Yadlapati } // namespace redfish 172