1472bd202SLakshmi Yadlapati #pragma once 2472bd202SLakshmi Yadlapati 3472bd202SLakshmi Yadlapati #include "async_resp.hpp" 4472bd202SLakshmi Yadlapati #include "dbus_utility.hpp" 5472bd202SLakshmi Yadlapati #include "error_messages.hpp" 6*c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_device.hpp" 7*c49c329dSLakshmi 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> 16*c49c329dSLakshmi 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 78*c49c329dSLakshmi Yadlapati inline std::optional<pcie_slots::SlotTypes> 79*c49c329dSLakshmi Yadlapati dbusSlotTypeToRf(const std::string& slotType) 80*c49c329dSLakshmi Yadlapati { 81*c49c329dSLakshmi Yadlapati if (slotType == 82*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength") 83*c49c329dSLakshmi Yadlapati { 84*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::FullLength; 85*c49c329dSLakshmi Yadlapati } 86*c49c329dSLakshmi Yadlapati if (slotType == 87*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength") 88*c49c329dSLakshmi Yadlapati { 89*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::HalfLength; 90*c49c329dSLakshmi Yadlapati } 91*c49c329dSLakshmi Yadlapati if (slotType == 92*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile") 93*c49c329dSLakshmi Yadlapati { 94*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::LowProfile; 95*c49c329dSLakshmi Yadlapati } 96*c49c329dSLakshmi Yadlapati if (slotType == 97*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini") 98*c49c329dSLakshmi Yadlapati { 99*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::Mini; 100*c49c329dSLakshmi Yadlapati } 101*c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2") 102*c49c329dSLakshmi Yadlapati { 103*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::M2; 104*c49c329dSLakshmi Yadlapati } 105*c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM") 106*c49c329dSLakshmi Yadlapati { 107*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OEM; 108*c49c329dSLakshmi Yadlapati } 109*c49c329dSLakshmi Yadlapati if (slotType == 110*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small") 111*c49c329dSLakshmi Yadlapati { 112*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Small; 113*c49c329dSLakshmi Yadlapati } 114*c49c329dSLakshmi Yadlapati if (slotType == 115*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large") 116*c49c329dSLakshmi Yadlapati { 117*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Large; 118*c49c329dSLakshmi Yadlapati } 119*c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2") 120*c49c329dSLakshmi Yadlapati { 121*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::U2; 122*c49c329dSLakshmi Yadlapati } 123*c49c329dSLakshmi Yadlapati if (slotType == 124*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown") 125*c49c329dSLakshmi Yadlapati { 126*c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::Invalid; 127*c49c329dSLakshmi Yadlapati } 128*c49c329dSLakshmi Yadlapati 129*c49c329dSLakshmi Yadlapati // Unspecified slotType should return an internal error. 130*c49c329dSLakshmi Yadlapati return std::nullopt; 131*c49c329dSLakshmi Yadlapati } 132*c49c329dSLakshmi Yadlapati 133*c49c329dSLakshmi Yadlapati inline std::optional<pcie_device::PCIeTypes> 134*c49c329dSLakshmi Yadlapati redfishPcieGenerationFromDbus(const std::string& generationInUse) 135*c49c329dSLakshmi Yadlapati { 136*c49c329dSLakshmi Yadlapati if (generationInUse == 137*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1") 138*c49c329dSLakshmi Yadlapati { 139*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen1; 140*c49c329dSLakshmi Yadlapati } 141*c49c329dSLakshmi Yadlapati if (generationInUse == 142*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2") 143*c49c329dSLakshmi Yadlapati { 144*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen2; 145*c49c329dSLakshmi Yadlapati } 146*c49c329dSLakshmi Yadlapati if (generationInUse == 147*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3") 148*c49c329dSLakshmi Yadlapati { 149*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen3; 150*c49c329dSLakshmi Yadlapati } 151*c49c329dSLakshmi Yadlapati if (generationInUse == 152*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4") 153*c49c329dSLakshmi Yadlapati { 154*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen4; 155*c49c329dSLakshmi Yadlapati } 156*c49c329dSLakshmi Yadlapati if (generationInUse == 157*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5") 158*c49c329dSLakshmi Yadlapati { 159*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen5; 160*c49c329dSLakshmi Yadlapati } 161*c49c329dSLakshmi Yadlapati if (generationInUse.empty() || 162*c49c329dSLakshmi Yadlapati generationInUse == 163*c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown") 164*c49c329dSLakshmi Yadlapati { 165*c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Invalid; 166*c49c329dSLakshmi Yadlapati } 167*c49c329dSLakshmi Yadlapati 168*c49c329dSLakshmi Yadlapati // The value is not unknown or Gen1-5, need return an internal error. 169*c49c329dSLakshmi Yadlapati return std::nullopt; 170*c49c329dSLakshmi Yadlapati } 171*c49c329dSLakshmi Yadlapati 172472bd202SLakshmi Yadlapati } // namespace pcie_util 173472bd202SLakshmi Yadlapati } // namespace redfish 174