xref: /openbmc/bmcweb/features/redfish/include/utils/pcie_util.hpp (revision 70c4d545817d83819f7f0cd571e0160bacb51d11)
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