#pragma once #include "async_resp.hpp" #include "dbus_utility.hpp" #include "error_messages.hpp" #include "generated/enums/pcie_device.hpp" #include "generated/enums/pcie_slots.hpp" #include "http/utility.hpp" #include #include #include #include #include #include #include #include namespace redfish { namespace pcie_util { /** * @brief Populate the PCIe Device list from a GetSubTreePaths search of * inventory * * @param[i,o] asyncResp Async response object * @param[i] Name Key to store the list of PCIe devices in asyncResp * * @return void */ inline void getPCIeDeviceList(const std::shared_ptr& asyncResp, const std::string& name) { static constexpr std::array pcieDeviceInterface = { "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; dbus::utility::getSubTreePaths( "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface, [asyncResp, name](const boost::system::error_code& ec, const dbus::utility::MapperGetSubTreePathsResponse& pcieDevicePaths) { if (ec) { BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: " << ec.message(); // Not an error, system just doesn't have PCIe info return; } nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name]; pcieDeviceList = nlohmann::json::array(); for (const std::string& pcieDevicePath : pcieDevicePaths) { size_t devStart = pcieDevicePath.rfind('/'); if (devStart == std::string::npos) { continue; } std::string devName = pcieDevicePath.substr(devStart + 1); if (devName.empty()) { continue; } nlohmann::json::object_t pcieDevice; pcieDevice["@odata.id"] = boost::urls::format( "/redfish/v1/Systems/system/PCIeDevices/{}", devName); pcieDeviceList.emplace_back(std::move(pcieDevice)); } asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size(); }); } inline std::optional dbusSlotTypeToRf(const std::string& slotType) { if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.FullLength") { return pcie_slots::SlotTypes::FullLength; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.HalfLength") { return pcie_slots::SlotTypes::HalfLength; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.LowProfile") { return pcie_slots::SlotTypes::LowProfile; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Mini") { return pcie_slots::SlotTypes::Mini; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2") { return pcie_slots::SlotTypes::M2; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OEM") { return pcie_slots::SlotTypes::OEM; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Small") { return pcie_slots::SlotTypes::OCP3Small; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.OCP3Large") { return pcie_slots::SlotTypes::OCP3Large; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.U_2") { return pcie_slots::SlotTypes::U2; } if (slotType == "xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.Unknown") { return pcie_slots::SlotTypes::Invalid; } // Unspecified slotType should return an internal error. return std::nullopt; } inline std::optional redfishPcieGenerationFromDbus(const std::string& generationInUse) { if (generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1") { return pcie_device::PCIeTypes::Gen1; } if (generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2") { return pcie_device::PCIeTypes::Gen2; } if (generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3") { return pcie_device::PCIeTypes::Gen3; } if (generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4") { return pcie_device::PCIeTypes::Gen4; } if (generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5") { return pcie_device::PCIeTypes::Gen5; } if (generationInUse.empty() || generationInUse == "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown") { return pcie_device::PCIeTypes::Invalid; } // The value is not unknown or Gen1-5, need return an internal error. return std::nullopt; } } // namespace pcie_util } // namespace redfish