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