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" 9*70c4d545SLakshmi Yadlapati #include "utils/collection.hpp" 10472bd202SLakshmi Yadlapati 11472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp> 12472bd202SLakshmi Yadlapati #include <boost/url/format.hpp> 13472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp> 14472bd202SLakshmi Yadlapati 15472bd202SLakshmi Yadlapati #include <array> 16472bd202SLakshmi Yadlapati #include <memory> 17c49c329dSLakshmi Yadlapati #include <optional> 18472bd202SLakshmi Yadlapati #include <string> 19472bd202SLakshmi Yadlapati #include <string_view> 20472bd202SLakshmi Yadlapati 21472bd202SLakshmi Yadlapati namespace redfish 22472bd202SLakshmi Yadlapati { 23472bd202SLakshmi Yadlapati namespace pcie_util 24472bd202SLakshmi Yadlapati { 25472bd202SLakshmi Yadlapati 26472bd202SLakshmi Yadlapati /** 27472bd202SLakshmi Yadlapati * @brief Populate the PCIe Device list from a GetSubTreePaths search of 28472bd202SLakshmi Yadlapati * inventory 29472bd202SLakshmi Yadlapati * 30ac106bf6SEd Tanous * @param[i,o] asyncResp Async response object 31ac106bf6SEd Tanous * @param[i] Name Key to store the list of PCIe devices in asyncResp 32472bd202SLakshmi Yadlapati * 33472bd202SLakshmi Yadlapati * @return void 34472bd202SLakshmi Yadlapati */ 35472bd202SLakshmi Yadlapati 36472bd202SLakshmi Yadlapati inline void 37472bd202SLakshmi Yadlapati getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 38*70c4d545SLakshmi Yadlapati const nlohmann::json::json_pointer& jsonKeyName) 39472bd202SLakshmi Yadlapati { 40472bd202SLakshmi Yadlapati static constexpr std::array<std::string_view, 1> pcieDeviceInterface = { 41472bd202SLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; 42*70c4d545SLakshmi Yadlapati const boost::urls::url pcieDeviceUrl = 43*70c4d545SLakshmi Yadlapati boost::urls::url("/redfish/v1/Systems/system/PCIeDevices"); 44472bd202SLakshmi Yadlapati 45*70c4d545SLakshmi Yadlapati collection_util::getCollectionToKey( 46*70c4d545SLakshmi Yadlapati asyncResp, pcieDeviceUrl, pcieDeviceInterface, 47*70c4d545SLakshmi Yadlapati "/xyz/openbmc_project/inventory", jsonKeyName); 48472bd202SLakshmi Yadlapati } 49472bd202SLakshmi Yadlapati 50c49c329dSLakshmi Yadlapati inline std::optional<pcie_slots::SlotTypes> 51c49c329dSLakshmi Yadlapati dbusSlotTypeToRf(const std::string& slotType) 52c49c329dSLakshmi Yadlapati { 53c49c329dSLakshmi Yadlapati if (slotType == 54c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength") 55c49c329dSLakshmi Yadlapati { 56c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::FullLength; 57c49c329dSLakshmi Yadlapati } 58c49c329dSLakshmi Yadlapati if (slotType == 59c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength") 60c49c329dSLakshmi Yadlapati { 61c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::HalfLength; 62c49c329dSLakshmi Yadlapati } 63c49c329dSLakshmi Yadlapati if (slotType == 64c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile") 65c49c329dSLakshmi Yadlapati { 66c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::LowProfile; 67c49c329dSLakshmi Yadlapati } 68c49c329dSLakshmi Yadlapati if (slotType == 69c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini") 70c49c329dSLakshmi Yadlapati { 71c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::Mini; 72c49c329dSLakshmi Yadlapati } 73c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2") 74c49c329dSLakshmi Yadlapati { 75c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::M2; 76c49c329dSLakshmi Yadlapati } 77c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM") 78c49c329dSLakshmi Yadlapati { 79c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OEM; 80c49c329dSLakshmi Yadlapati } 81c49c329dSLakshmi Yadlapati if (slotType == 82c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small") 83c49c329dSLakshmi Yadlapati { 84c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Small; 85c49c329dSLakshmi Yadlapati } 86c49c329dSLakshmi Yadlapati if (slotType == 87c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large") 88c49c329dSLakshmi Yadlapati { 89c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Large; 90c49c329dSLakshmi Yadlapati } 91c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2") 92c49c329dSLakshmi Yadlapati { 93c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::U2; 94c49c329dSLakshmi Yadlapati } 95c49c329dSLakshmi Yadlapati if (slotType == 96c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown") 97c49c329dSLakshmi Yadlapati { 98cf3b484eSLakshmi Yadlapati return std::nullopt; 99c49c329dSLakshmi Yadlapati } 100c49c329dSLakshmi Yadlapati 101cf3b484eSLakshmi Yadlapati return pcie_slots::SlotTypes::Invalid; 102c49c329dSLakshmi Yadlapati } 103c49c329dSLakshmi Yadlapati 104c49c329dSLakshmi Yadlapati inline std::optional<pcie_device::PCIeTypes> 105c49c329dSLakshmi Yadlapati redfishPcieGenerationFromDbus(const std::string& generationInUse) 106c49c329dSLakshmi Yadlapati { 107c49c329dSLakshmi Yadlapati if (generationInUse == 108c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1") 109c49c329dSLakshmi Yadlapati { 110c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen1; 111c49c329dSLakshmi Yadlapati } 112c49c329dSLakshmi Yadlapati if (generationInUse == 113c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2") 114c49c329dSLakshmi Yadlapati { 115c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen2; 116c49c329dSLakshmi Yadlapati } 117c49c329dSLakshmi Yadlapati if (generationInUse == 118c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3") 119c49c329dSLakshmi Yadlapati { 120c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen3; 121c49c329dSLakshmi Yadlapati } 122c49c329dSLakshmi Yadlapati if (generationInUse == 123c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4") 124c49c329dSLakshmi Yadlapati { 125c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen4; 126c49c329dSLakshmi Yadlapati } 127c49c329dSLakshmi Yadlapati if (generationInUse == 128c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5") 129c49c329dSLakshmi Yadlapati { 130c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen5; 131c49c329dSLakshmi Yadlapati } 132c49c329dSLakshmi Yadlapati if (generationInUse.empty() || 133c49c329dSLakshmi Yadlapati generationInUse == 134c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown") 135c49c329dSLakshmi Yadlapati { 136cf3b484eSLakshmi Yadlapati return std::nullopt; 137c49c329dSLakshmi Yadlapati } 138c49c329dSLakshmi Yadlapati 139cf3b484eSLakshmi Yadlapati return pcie_device::PCIeTypes::Invalid; 140c49c329dSLakshmi Yadlapati } 141c49c329dSLakshmi Yadlapati 142472bd202SLakshmi Yadlapati } // namespace pcie_util 143472bd202SLakshmi Yadlapati } // namespace redfish 144