xref: /openbmc/bmcweb/features/redfish/lib/pcie.hpp (revision 7e860f1550c8686eec42f7a75bc5f2ef51e756ad)
1f5c9f8bdSJason M. Bills /*
2f5c9f8bdSJason M. Bills // Copyright (c) 2018 Intel Corporation
3f5c9f8bdSJason M. Bills //
4f5c9f8bdSJason M. Bills // Licensed under the Apache License, Version 2.0 (the "License");
5f5c9f8bdSJason M. Bills // you may not use this file except in compliance with the License.
6f5c9f8bdSJason M. Bills // You may obtain a copy of the License at
7f5c9f8bdSJason M. Bills //
8f5c9f8bdSJason M. Bills //      http://www.apache.org/licenses/LICENSE-2.0
9f5c9f8bdSJason M. Bills //
10f5c9f8bdSJason M. Bills // Unless required by applicable law or agreed to in writing, software
11f5c9f8bdSJason M. Bills // distributed under the License is distributed on an "AS IS" BASIS,
12f5c9f8bdSJason M. Bills // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5c9f8bdSJason M. Bills // See the License for the specific language governing permissions and
14f5c9f8bdSJason M. Bills // limitations under the License.
15f5c9f8bdSJason M. Bills */
16f5c9f8bdSJason M. Bills 
17f5c9f8bdSJason M. Bills #pragma once
18f5c9f8bdSJason M. Bills 
19*7e860f15SJohn Edward Broadbent #include <app.hpp>
20f5c9f8bdSJason M. Bills #include <boost/system/linux_error.hpp>
21f5c9f8bdSJason M. Bills 
22f5c9f8bdSJason M. Bills namespace redfish
23f5c9f8bdSJason M. Bills {
24f5c9f8bdSJason M. Bills 
25f5c9f8bdSJason M. Bills static constexpr char const* pcieService = "xyz.openbmc_project.PCIe";
26f5c9f8bdSJason M. Bills static constexpr char const* pciePath = "/xyz/openbmc_project/PCIe";
27f5c9f8bdSJason M. Bills static constexpr char const* pcieDeviceInterface =
28f5c9f8bdSJason M. Bills     "xyz.openbmc_project.PCIe.Device";
29f5c9f8bdSJason M. Bills 
30b5a76932SEd Tanous static inline void
318d1b46d7Szhanghch05     getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
32adbe192aSJason M. Bills                       const std::string& name)
33f5c9f8bdSJason M. Bills {
34adbe192aSJason M. Bills     auto getPCIeMapCallback = [asyncResp, name](
35adbe192aSJason M. Bills                                   const boost::system::error_code ec,
36f5c9f8bdSJason M. Bills                                   std::vector<std::string>& pcieDevicePaths) {
37f5c9f8bdSJason M. Bills         if (ec)
38f5c9f8bdSJason M. Bills         {
39a2730f01SAndrew Geissler             BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
40f5c9f8bdSJason M. Bills                              << ec.message();
41a2730f01SAndrew Geissler             // Not an error, system just doesn't have PCIe info
42f5c9f8bdSJason M. Bills             return;
43f5c9f8bdSJason M. Bills         }
44adbe192aSJason M. Bills         nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
45f5c9f8bdSJason M. Bills         pcieDeviceList = nlohmann::json::array();
46f5c9f8bdSJason M. Bills         for (const std::string& pcieDevicePath : pcieDevicePaths)
47f5c9f8bdSJason M. Bills         {
483174e4dfSEd Tanous             size_t devStart = pcieDevicePath.rfind('/');
49f5c9f8bdSJason M. Bills             if (devStart == std::string::npos)
50f5c9f8bdSJason M. Bills             {
51f5c9f8bdSJason M. Bills                 continue;
52f5c9f8bdSJason M. Bills             }
53f5c9f8bdSJason M. Bills 
54f5c9f8bdSJason M. Bills             std::string devName = pcieDevicePath.substr(devStart + 1);
55f5c9f8bdSJason M. Bills             if (devName.empty())
56f5c9f8bdSJason M. Bills             {
57f5c9f8bdSJason M. Bills                 continue;
58f5c9f8bdSJason M. Bills             }
59f5c9f8bdSJason M. Bills             pcieDeviceList.push_back(
60f5c9f8bdSJason M. Bills                 {{"@odata.id",
61f5c9f8bdSJason M. Bills                   "/redfish/v1/Systems/system/PCIeDevices/" + devName}});
62f5c9f8bdSJason M. Bills         }
63adbe192aSJason M. Bills         asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
64f5c9f8bdSJason M. Bills     };
65f5c9f8bdSJason M. Bills     crow::connections::systemBus->async_method_call(
66f5c9f8bdSJason M. Bills         std::move(getPCIeMapCallback), "xyz.openbmc_project.ObjectMapper",
67f5c9f8bdSJason M. Bills         "/xyz/openbmc_project/object_mapper",
68f5c9f8bdSJason M. Bills         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
69f5c9f8bdSJason M. Bills         std::string(pciePath) + "/", 1, std::array<std::string, 0>());
70f5c9f8bdSJason M. Bills }
71f5c9f8bdSJason M. Bills 
72*7e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeDeviceCollection(App& app)
73adbe192aSJason M. Bills {
74adbe192aSJason M. Bills     /**
75adbe192aSJason M. Bills      * Functions triggers appropriate requests on DBus
76adbe192aSJason M. Bills      */
77*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/PCIeDevices/")
78*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
79*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
80*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
81*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
82*7e860f15SJohn Edward Broadbent 
83adbe192aSJason M. Bills             {
84adbe192aSJason M. Bills                 asyncResp->res.jsonValue = {
85*7e860f15SJohn Edward Broadbent                     {"@odata.type",
86*7e860f15SJohn Edward Broadbent                      "#PCIeDeviceCollection.PCIeDeviceCollection"},
87adbe192aSJason M. Bills                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices"},
88adbe192aSJason M. Bills                     {"Name", "PCIe Device Collection"},
89adbe192aSJason M. Bills                     {"Description", "Collection of PCIe Devices"},
90adbe192aSJason M. Bills                     {"Members", nlohmann::json::array()},
91adbe192aSJason M. Bills                     {"Members@odata.count", 0}};
92adbe192aSJason M. Bills                 getPCIeDeviceList(asyncResp, "Members");
93*7e860f15SJohn Edward Broadbent             });
94f5c9f8bdSJason M. Bills }
95f5c9f8bdSJason M. Bills 
96*7e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeDevice(App& app)
97f5c9f8bdSJason M. Bills {
98*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/PCIeDevices/<str>/")
99*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
100*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
101*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
102*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
103*7e860f15SJohn Edward Broadbent                const std::string& device)
104f5c9f8bdSJason M. Bills 
105*7e860f15SJohn Edward Broadbent             {
106*7e860f15SJohn Edward Broadbent                 auto getPCIeDeviceCallback = [asyncResp, device](
107*7e860f15SJohn Edward Broadbent                                                  const boost::system::error_code
108*7e860f15SJohn Edward Broadbent                                                      ec,
109*7e860f15SJohn Edward Broadbent                                                  boost::container::flat_map<
110*7e860f15SJohn Edward Broadbent                                                      std::string,
1111214b7e7SGunnar Mills                                                      std::variant<std::string>>&
1121214b7e7SGunnar Mills                                                      pcieDevProperties) {
113f5c9f8bdSJason M. Bills                     if (ec)
114f5c9f8bdSJason M. Bills                     {
115f5c9f8bdSJason M. Bills                         BMCWEB_LOG_DEBUG
116f5c9f8bdSJason M. Bills                             << "failed to get PCIe Device properties ec: "
117271584abSEd Tanous                             << ec.value() << ": " << ec.message();
118f5c9f8bdSJason M. Bills                         if (ec.value() ==
119f5c9f8bdSJason M. Bills                             boost::system::linux_error::bad_request_descriptor)
120f5c9f8bdSJason M. Bills                         {
121*7e860f15SJohn Edward Broadbent                             messages::resourceNotFound(asyncResp->res,
122*7e860f15SJohn Edward Broadbent                                                        "PCIeDevice", device);
123f5c9f8bdSJason M. Bills                         }
124f5c9f8bdSJason M. Bills                         else
125f5c9f8bdSJason M. Bills                         {
126f5c9f8bdSJason M. Bills                             messages::internalError(asyncResp->res);
127f5c9f8bdSJason M. Bills                         }
128f5c9f8bdSJason M. Bills                         return;
129f5c9f8bdSJason M. Bills                     }
130f5c9f8bdSJason M. Bills 
131f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue = {
132dede6a98SJason M. Bills                         {"@odata.type", "#PCIeDevice.v1_4_0.PCIeDevice"},
133f5c9f8bdSJason M. Bills                         {"@odata.id",
134f5c9f8bdSJason M. Bills                          "/redfish/v1/Systems/system/PCIeDevices/" + device},
135f5c9f8bdSJason M. Bills                         {"Name", "PCIe Device"},
136f5c9f8bdSJason M. Bills                         {"Id", device}};
137f5c9f8bdSJason M. Bills 
1388d78b7a9SPatrick Williams                     if (std::string* property = std::get_if<std::string>(
139f5c9f8bdSJason M. Bills                             &pcieDevProperties["Manufacturer"]);
140f5c9f8bdSJason M. Bills                         property)
141f5c9f8bdSJason M. Bills                     {
142f5c9f8bdSJason M. Bills                         asyncResp->res.jsonValue["Manufacturer"] = *property;
143f5c9f8bdSJason M. Bills                     }
144f5c9f8bdSJason M. Bills 
1458d78b7a9SPatrick Williams                     if (std::string* property = std::get_if<std::string>(
146f5c9f8bdSJason M. Bills                             &pcieDevProperties["DeviceType"]);
147f5c9f8bdSJason M. Bills                         property)
148f5c9f8bdSJason M. Bills                     {
149f5c9f8bdSJason M. Bills                         asyncResp->res.jsonValue["DeviceType"] = *property;
150f5c9f8bdSJason M. Bills                     }
151f5c9f8bdSJason M. Bills 
152dede6a98SJason M. Bills                     asyncResp->res.jsonValue["PCIeFunctions"] = {
153*7e860f15SJohn Edward Broadbent                         {"@odata.id",
154*7e860f15SJohn Edward Broadbent                          "/redfish/v1/Systems/system/PCIeDevices/" + device +
155*7e860f15SJohn Edward Broadbent                              "/PCIeFunctions"}};
156dede6a98SJason M. Bills                 };
157dede6a98SJason M. Bills                 std::string escapedPath = std::string(pciePath) + "/" + device;
158dede6a98SJason M. Bills                 dbus::utility::escapePathForDbus(escapedPath);
159dede6a98SJason M. Bills                 crow::connections::systemBus->async_method_call(
160dede6a98SJason M. Bills                     std::move(getPCIeDeviceCallback), pcieService, escapedPath,
161*7e860f15SJohn Edward Broadbent                     "org.freedesktop.DBus.Properties", "GetAll",
162*7e860f15SJohn Edward Broadbent                     pcieDeviceInterface);
163*7e860f15SJohn Edward Broadbent             });
164dede6a98SJason M. Bills }
165dede6a98SJason M. Bills 
166*7e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeFunctionCollection(App& app)
167*7e860f15SJohn Edward Broadbent {
168dede6a98SJason M. Bills     /**
169dede6a98SJason M. Bills      * Functions triggers appropriate requests on DBus
170dede6a98SJason M. Bills      */
171*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app,
172*7e860f15SJohn Edward Broadbent                  "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/")
173*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
174*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
175*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
176*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
177*7e860f15SJohn Edward Broadbent                const std::string& device)
178*7e860f15SJohn Edward Broadbent 
179dede6a98SJason M. Bills             {
180dede6a98SJason M. Bills                 asyncResp->res.jsonValue = {
181*7e860f15SJohn Edward Broadbent                     {"@odata.type",
182*7e860f15SJohn Edward Broadbent                      "#PCIeFunctionCollection.PCIeFunctionCollection"},
183*7e860f15SJohn Edward Broadbent                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices/" +
184*7e860f15SJohn Edward Broadbent                                       device + "/PCIeFunctions"},
185dede6a98SJason M. Bills                     {"Name", "PCIe Function Collection"},
186dede6a98SJason M. Bills                     {"Description",
187dede6a98SJason M. Bills                      "Collection of PCIe Functions for PCIe Device " + device}};
188dede6a98SJason M. Bills 
189*7e860f15SJohn Edward Broadbent                 auto getPCIeDeviceCallback = [asyncResp, device](
190*7e860f15SJohn Edward Broadbent                                                  const boost::system::error_code
191*7e860f15SJohn Edward Broadbent                                                      ec,
192*7e860f15SJohn Edward Broadbent                                                  boost::container::flat_map<
193*7e860f15SJohn Edward Broadbent                                                      std::string,
194*7e860f15SJohn Edward Broadbent                                                      std::variant<std::string>>&
195*7e860f15SJohn Edward Broadbent                                                      pcieDevProperties) {
196*7e860f15SJohn Edward Broadbent                     if (ec)
197*7e860f15SJohn Edward Broadbent                     {
198*7e860f15SJohn Edward Broadbent                         BMCWEB_LOG_DEBUG
199*7e860f15SJohn Edward Broadbent                             << "failed to get PCIe Device properties ec: "
200*7e860f15SJohn Edward Broadbent                             << ec.value() << ": " << ec.message();
201*7e860f15SJohn Edward Broadbent                         if (ec.value() ==
202*7e860f15SJohn Edward Broadbent                             boost::system::linux_error::bad_request_descriptor)
203*7e860f15SJohn Edward Broadbent                         {
204*7e860f15SJohn Edward Broadbent                             messages::resourceNotFound(asyncResp->res,
205*7e860f15SJohn Edward Broadbent                                                        "PCIeDevice", device);
206*7e860f15SJohn Edward Broadbent                         }
207*7e860f15SJohn Edward Broadbent                         else
208*7e860f15SJohn Edward Broadbent                         {
209*7e860f15SJohn Edward Broadbent                             messages::internalError(asyncResp->res);
210*7e860f15SJohn Edward Broadbent                         }
211*7e860f15SJohn Edward Broadbent                         return;
212*7e860f15SJohn Edward Broadbent                     }
213*7e860f15SJohn Edward Broadbent 
214*7e860f15SJohn Edward Broadbent                     nlohmann::json& pcieFunctionList =
215*7e860f15SJohn Edward Broadbent                         asyncResp->res.jsonValue["Members"];
216*7e860f15SJohn Edward Broadbent                     pcieFunctionList = nlohmann::json::array();
217*7e860f15SJohn Edward Broadbent                     static constexpr const int maxPciFunctionNum = 8;
218*7e860f15SJohn Edward Broadbent                     for (int functionNum = 0; functionNum < maxPciFunctionNum;
219*7e860f15SJohn Edward Broadbent                          functionNum++)
220*7e860f15SJohn Edward Broadbent                     {
221*7e860f15SJohn Edward Broadbent                         // Check if this function exists by looking for a device
222*7e860f15SJohn Edward Broadbent                         // ID
223*7e860f15SJohn Edward Broadbent                         std::string devIDProperty =
224*7e860f15SJohn Edward Broadbent                             "Function" + std::to_string(functionNum) +
225*7e860f15SJohn Edward Broadbent                             "DeviceId";
226*7e860f15SJohn Edward Broadbent                         std::string* property = std::get_if<std::string>(
227*7e860f15SJohn Edward Broadbent                             &pcieDevProperties[devIDProperty]);
228*7e860f15SJohn Edward Broadbent                         if (property && !property->empty())
229*7e860f15SJohn Edward Broadbent                         {
230*7e860f15SJohn Edward Broadbent                             pcieFunctionList.push_back(
231*7e860f15SJohn Edward Broadbent                                 {{"@odata.id",
232*7e860f15SJohn Edward Broadbent                                   "/redfish/v1/Systems/system/PCIeDevices/" +
233*7e860f15SJohn Edward Broadbent                                       device + "/PCIeFunctions/" +
234*7e860f15SJohn Edward Broadbent                                       std::to_string(functionNum)}});
235*7e860f15SJohn Edward Broadbent                         }
236*7e860f15SJohn Edward Broadbent                     }
237*7e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["PCIeFunctions@odata.count"] =
238*7e860f15SJohn Edward Broadbent                         pcieFunctionList.size();
239*7e860f15SJohn Edward Broadbent                 };
240*7e860f15SJohn Edward Broadbent                 std::string escapedPath = std::string(pciePath) + "/" + device;
241*7e860f15SJohn Edward Broadbent                 dbus::utility::escapePathForDbus(escapedPath);
242*7e860f15SJohn Edward Broadbent                 crow::connections::systemBus->async_method_call(
243*7e860f15SJohn Edward Broadbent                     std::move(getPCIeDeviceCallback), pcieService, escapedPath,
244*7e860f15SJohn Edward Broadbent                     "org.freedesktop.DBus.Properties", "GetAll",
245*7e860f15SJohn Edward Broadbent                     pcieDeviceInterface);
246*7e860f15SJohn Edward Broadbent             });
247*7e860f15SJohn Edward Broadbent }
248*7e860f15SJohn Edward Broadbent 
249*7e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeFunction(App& app)
250*7e860f15SJohn Edward Broadbent {
251*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(
252*7e860f15SJohn Edward Broadbent         app,
253*7e860f15SJohn Edward Broadbent         "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/<str>/")
254*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
255*7e860f15SJohn Edward Broadbent         .methods(
256*7e860f15SJohn Edward Broadbent             boost::beast::http::verb::get)([](const crow::Request&,
257*7e860f15SJohn Edward Broadbent                                               const std::shared_ptr<
258*7e860f15SJohn Edward Broadbent                                                   bmcweb::AsyncResp>& asyncResp,
259*7e860f15SJohn Edward Broadbent                                               const std::string& device,
260*7e860f15SJohn Edward Broadbent                                               const std::string& function) {
261*7e860f15SJohn Edward Broadbent             auto getPCIeDeviceCallback = [asyncResp, device, function](
262*7e860f15SJohn Edward Broadbent                                              const boost::system::error_code ec,
263*7e860f15SJohn Edward Broadbent                                              boost::container::flat_map<
264*7e860f15SJohn Edward Broadbent                                                  std::string,
2651214b7e7SGunnar Mills                                                  std::variant<std::string>>&
2661214b7e7SGunnar Mills                                                  pcieDevProperties) {
267dede6a98SJason M. Bills                 if (ec)
268dede6a98SJason M. Bills                 {
269dede6a98SJason M. Bills                     BMCWEB_LOG_DEBUG
270dede6a98SJason M. Bills                         << "failed to get PCIe Device properties ec: "
271dede6a98SJason M. Bills                         << ec.value() << ": " << ec.message();
272dede6a98SJason M. Bills                     if (ec.value() ==
273dede6a98SJason M. Bills                         boost::system::linux_error::bad_request_descriptor)
274dede6a98SJason M. Bills                     {
275dede6a98SJason M. Bills                         messages::resourceNotFound(asyncResp->res, "PCIeDevice",
276dede6a98SJason M. Bills                                                    device);
277dede6a98SJason M. Bills                     }
278dede6a98SJason M. Bills                     else
279dede6a98SJason M. Bills                     {
280dede6a98SJason M. Bills                         messages::internalError(asyncResp->res);
281dede6a98SJason M. Bills                     }
282dede6a98SJason M. Bills                     return;
283dede6a98SJason M. Bills                 }
284dede6a98SJason M. Bills 
285f5c9f8bdSJason M. Bills                 // Check if this function exists by looking for a device ID
286f5c9f8bdSJason M. Bills                 std::string devIDProperty = "Function" + function + "DeviceId";
287*7e860f15SJohn Edward Broadbent                 if (std::string* property = std::get_if<std::string>(
288*7e860f15SJohn Edward Broadbent                         &pcieDevProperties[devIDProperty]);
289f5c9f8bdSJason M. Bills                     property && property->empty())
290f5c9f8bdSJason M. Bills                 {
291f5c9f8bdSJason M. Bills                     messages::resourceNotFound(asyncResp->res, "PCIeFunction",
292f5c9f8bdSJason M. Bills                                                function);
293f5c9f8bdSJason M. Bills                     return;
294f5c9f8bdSJason M. Bills                 }
295f5c9f8bdSJason M. Bills 
296f5c9f8bdSJason M. Bills                 asyncResp->res.jsonValue = {
297f5c9f8bdSJason M. Bills                     {"@odata.type", "#PCIeFunction.v1_2_0.PCIeFunction"},
298f5c9f8bdSJason M. Bills                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices/" +
299f5c9f8bdSJason M. Bills                                       device + "/PCIeFunctions/" + function},
300f5c9f8bdSJason M. Bills                     {"Name", "PCIe Function"},
301f5c9f8bdSJason M. Bills                     {"Id", function},
302f5c9f8bdSJason M. Bills                     {"FunctionId", std::stoi(function)},
303f5c9f8bdSJason M. Bills                     {"Links",
304f5c9f8bdSJason M. Bills                      {{"PCIeDevice",
305f5c9f8bdSJason M. Bills                        {{"@odata.id",
306*7e860f15SJohn Edward Broadbent                          "/redfish/v1/Systems/system/PCIeDevices/" +
307*7e860f15SJohn Edward Broadbent                              device}}}}}};
308f5c9f8bdSJason M. Bills 
3098d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3108d78b7a9SPatrick Williams                         &pcieDevProperties["Function" + function + "DeviceId"]);
311f5c9f8bdSJason M. Bills                     property)
312f5c9f8bdSJason M. Bills                 {
313f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["DeviceId"] = *property;
314f5c9f8bdSJason M. Bills                 }
315f5c9f8bdSJason M. Bills 
3168d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3178d78b7a9SPatrick Williams                         &pcieDevProperties["Function" + function + "VendorId"]);
318f5c9f8bdSJason M. Bills                     property)
319f5c9f8bdSJason M. Bills                 {
320f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["VendorId"] = *property;
321f5c9f8bdSJason M. Bills                 }
322f5c9f8bdSJason M. Bills 
3238d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
324*7e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
325*7e860f15SJohn Edward Broadbent                                            "FunctionType"]);
326f5c9f8bdSJason M. Bills                     property)
327f5c9f8bdSJason M. Bills                 {
328f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["FunctionType"] = *property;
329f5c9f8bdSJason M. Bills                 }
330f5c9f8bdSJason M. Bills 
3318d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
332*7e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
333*7e860f15SJohn Edward Broadbent                                            "DeviceClass"]);
334f5c9f8bdSJason M. Bills                     property)
335f5c9f8bdSJason M. Bills                 {
336f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["DeviceClass"] = *property;
337f5c9f8bdSJason M. Bills                 }
338f5c9f8bdSJason M. Bills 
3398d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
340*7e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
341*7e860f15SJohn Edward Broadbent                                            "ClassCode"]);
342f5c9f8bdSJason M. Bills                     property)
343f5c9f8bdSJason M. Bills                 {
344f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["ClassCode"] = *property;
345f5c9f8bdSJason M. Bills                 }
346f5c9f8bdSJason M. Bills 
3478d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
348*7e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
349*7e860f15SJohn Edward Broadbent                                            "RevisionId"]);
350f5c9f8bdSJason M. Bills                     property)
351f5c9f8bdSJason M. Bills                 {
352f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["RevisionId"] = *property;
353f5c9f8bdSJason M. Bills                 }
354f5c9f8bdSJason M. Bills 
3558d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
356*7e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
357*7e860f15SJohn Edward Broadbent                                            "SubsystemId"]);
358f5c9f8bdSJason M. Bills                     property)
359f5c9f8bdSJason M. Bills                 {
360f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["SubsystemId"] = *property;
361f5c9f8bdSJason M. Bills                 }
362f5c9f8bdSJason M. Bills 
3638d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
364f5c9f8bdSJason M. Bills                         &pcieDevProperties["Function" + function +
365f5c9f8bdSJason M. Bills                                            "SubsystemVendorId"]);
366f5c9f8bdSJason M. Bills                     property)
367f5c9f8bdSJason M. Bills                 {
368f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["SubsystemVendorId"] = *property;
369f5c9f8bdSJason M. Bills                 }
370f5c9f8bdSJason M. Bills             };
371f5c9f8bdSJason M. Bills             std::string escapedPath = std::string(pciePath) + "/" + device;
372f5c9f8bdSJason M. Bills             dbus::utility::escapePathForDbus(escapedPath);
373f5c9f8bdSJason M. Bills             crow::connections::systemBus->async_method_call(
374f5c9f8bdSJason M. Bills                 std::move(getPCIeDeviceCallback), pcieService, escapedPath,
375*7e860f15SJohn Edward Broadbent                 "org.freedesktop.DBus.Properties", "GetAll",
376*7e860f15SJohn Edward Broadbent                 pcieDeviceInterface);
377*7e860f15SJohn Edward Broadbent         });
378f5c9f8bdSJason M. Bills }
379f5c9f8bdSJason M. Bills 
380f5c9f8bdSJason M. Bills } // namespace redfish
381