140e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0 240e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3472bd202SLakshmi Yadlapati #pragma once 4472bd202SLakshmi Yadlapati 5d7857201SEd Tanous #include "bmcweb_config.h" 6d7857201SEd Tanous 7472bd202SLakshmi Yadlapati #include "async_resp.hpp" 8c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_device.hpp" 9c49c329dSLakshmi Yadlapati #include "generated/enums/pcie_slots.hpp" 1070c4d545SLakshmi Yadlapati #include "utils/collection.hpp" 11472bd202SLakshmi Yadlapati 12472bd202SLakshmi Yadlapati #include <boost/system/error_code.hpp> 13472bd202SLakshmi Yadlapati #include <boost/url/format.hpp> 14d7857201SEd Tanous #include <boost/url/url.hpp> 15472bd202SLakshmi Yadlapati #include <nlohmann/json.hpp> 16472bd202SLakshmi Yadlapati 17472bd202SLakshmi Yadlapati #include <array> 18472bd202SLakshmi Yadlapati #include <memory> 19c49c329dSLakshmi Yadlapati #include <optional> 20472bd202SLakshmi Yadlapati #include <string> 21472bd202SLakshmi Yadlapati #include <string_view> 22472bd202SLakshmi Yadlapati 23472bd202SLakshmi Yadlapati namespace redfish 24472bd202SLakshmi Yadlapati { 25472bd202SLakshmi Yadlapati namespace pcie_util 26472bd202SLakshmi Yadlapati { 27472bd202SLakshmi Yadlapati 28472bd202SLakshmi Yadlapati /** 29472bd202SLakshmi Yadlapati * @brief Populate the PCIe Device list from a GetSubTreePaths search of 30472bd202SLakshmi Yadlapati * inventory 31472bd202SLakshmi Yadlapati * 32ac106bf6SEd Tanous * @param[i,o] asyncResp Async response object 33ac106bf6SEd Tanous * @param[i] Name Key to store the list of PCIe devices in asyncResp 34472bd202SLakshmi Yadlapati * 35472bd202SLakshmi Yadlapati * @return void 36472bd202SLakshmi Yadlapati */ 37472bd202SLakshmi Yadlapati 38*504af5a0SPatrick Williams inline void getPCIeDeviceList( 39*504af5a0SPatrick Williams const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 4070c4d545SLakshmi Yadlapati const nlohmann::json::json_pointer& jsonKeyName) 41472bd202SLakshmi Yadlapati { 42472bd202SLakshmi Yadlapati static constexpr std::array<std::string_view, 1> pcieDeviceInterface = { 43472bd202SLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; 44253f11b8SEd Tanous const boost::urls::url pcieDeviceUrl = boost::urls::format( 45253f11b8SEd Tanous "/redfish/v1/Systems/{}/PCIeDevices", BMCWEB_REDFISH_SYSTEM_URI_NAME); 46472bd202SLakshmi Yadlapati 4770c4d545SLakshmi Yadlapati collection_util::getCollectionToKey( 4870c4d545SLakshmi Yadlapati asyncResp, pcieDeviceUrl, pcieDeviceInterface, 4970c4d545SLakshmi Yadlapati "/xyz/openbmc_project/inventory", jsonKeyName); 50472bd202SLakshmi Yadlapati } 51472bd202SLakshmi Yadlapati 52*504af5a0SPatrick Williams inline std::optional<pcie_slots::SlotTypes> dbusSlotTypeToRf( 53*504af5a0SPatrick Williams const std::string& slotType) 54c49c329dSLakshmi Yadlapati { 55c49c329dSLakshmi Yadlapati if (slotType == 56c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength") 57c49c329dSLakshmi Yadlapati { 58c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::FullLength; 59c49c329dSLakshmi Yadlapati } 60c49c329dSLakshmi Yadlapati if (slotType == 61c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength") 62c49c329dSLakshmi Yadlapati { 63c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::HalfLength; 64c49c329dSLakshmi Yadlapati } 65c49c329dSLakshmi Yadlapati if (slotType == 66c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile") 67c49c329dSLakshmi Yadlapati { 68c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::LowProfile; 69c49c329dSLakshmi Yadlapati } 70c49c329dSLakshmi Yadlapati if (slotType == 71c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini") 72c49c329dSLakshmi Yadlapati { 73c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::Mini; 74c49c329dSLakshmi Yadlapati } 75c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2") 76c49c329dSLakshmi Yadlapati { 77c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::M2; 78c49c329dSLakshmi Yadlapati } 79c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM") 80c49c329dSLakshmi Yadlapati { 81c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OEM; 82c49c329dSLakshmi Yadlapati } 83c49c329dSLakshmi Yadlapati if (slotType == 84c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small") 85c49c329dSLakshmi Yadlapati { 86c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Small; 87c49c329dSLakshmi Yadlapati } 88c49c329dSLakshmi Yadlapati if (slotType == 89c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large") 90c49c329dSLakshmi Yadlapati { 91c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::OCP3Large; 92c49c329dSLakshmi Yadlapati } 93c49c329dSLakshmi Yadlapati if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2") 94c49c329dSLakshmi Yadlapati { 95c49c329dSLakshmi Yadlapati return pcie_slots::SlotTypes::U2; 96c49c329dSLakshmi Yadlapati } 97c49c329dSLakshmi Yadlapati if (slotType == 98c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown") 99c49c329dSLakshmi Yadlapati { 100cf3b484eSLakshmi Yadlapati return std::nullopt; 101c49c329dSLakshmi Yadlapati } 102c49c329dSLakshmi Yadlapati 103cf3b484eSLakshmi Yadlapati return pcie_slots::SlotTypes::Invalid; 104c49c329dSLakshmi Yadlapati } 105c49c329dSLakshmi Yadlapati 106*504af5a0SPatrick Williams inline std::optional<pcie_device::PCIeTypes> redfishPcieGenerationFromDbus( 107*504af5a0SPatrick Williams const std::string& generationInUse) 108c49c329dSLakshmi Yadlapati { 109c49c329dSLakshmi Yadlapati if (generationInUse == 110c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1") 111c49c329dSLakshmi Yadlapati { 112c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen1; 113c49c329dSLakshmi Yadlapati } 114c49c329dSLakshmi Yadlapati if (generationInUse == 115c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2") 116c49c329dSLakshmi Yadlapati { 117c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen2; 118c49c329dSLakshmi Yadlapati } 119c49c329dSLakshmi Yadlapati if (generationInUse == 120c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3") 121c49c329dSLakshmi Yadlapati { 122c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen3; 123c49c329dSLakshmi Yadlapati } 124c49c329dSLakshmi Yadlapati if (generationInUse == 125c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4") 126c49c329dSLakshmi Yadlapati { 127c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen4; 128c49c329dSLakshmi Yadlapati } 129c49c329dSLakshmi Yadlapati if (generationInUse == 130c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5") 131c49c329dSLakshmi Yadlapati { 132c49c329dSLakshmi Yadlapati return pcie_device::PCIeTypes::Gen5; 133c49c329dSLakshmi Yadlapati } 134c49c329dSLakshmi Yadlapati if (generationInUse.empty() || 135c49c329dSLakshmi Yadlapati generationInUse == 136c49c329dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown") 137c49c329dSLakshmi Yadlapati { 138cf3b484eSLakshmi Yadlapati return std::nullopt; 139c49c329dSLakshmi Yadlapati } 140c49c329dSLakshmi Yadlapati 141cf3b484eSLakshmi Yadlapati return pcie_device::PCIeTypes::Invalid; 142c49c329dSLakshmi Yadlapati } 143c49c329dSLakshmi Yadlapati 144472bd202SLakshmi Yadlapati } // namespace pcie_util 145472bd202SLakshmi Yadlapati } // namespace redfish 146