xref: /openbmc/bmcweb/features/redfish/lib/pcie.hpp (revision ed3982131dcef2b499da36e674d2d21b2289ef29)
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 
197e860f15SJohn Edward Broadbent #include <app.hpp>
20f5c9f8bdSJason M. Bills #include <boost/system/linux_error.hpp>
21*ed398213SEd Tanous #include <registries/privilege_registry.hpp>
22f5c9f8bdSJason M. Bills 
23f5c9f8bdSJason M. Bills namespace redfish
24f5c9f8bdSJason M. Bills {
25f5c9f8bdSJason M. Bills 
26f5c9f8bdSJason M. Bills static constexpr char const* pcieService = "xyz.openbmc_project.PCIe";
27f5c9f8bdSJason M. Bills static constexpr char const* pciePath = "/xyz/openbmc_project/PCIe";
28f5c9f8bdSJason M. Bills static constexpr char const* pcieDeviceInterface =
29f5c9f8bdSJason M. Bills     "xyz.openbmc_project.PCIe.Device";
30f5c9f8bdSJason M. Bills 
31b5a76932SEd Tanous static inline void
328d1b46d7Szhanghch05     getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
33adbe192aSJason M. Bills                       const std::string& name)
34f5c9f8bdSJason M. Bills {
35adbe192aSJason M. Bills     auto getPCIeMapCallback = [asyncResp, name](
36adbe192aSJason M. Bills                                   const boost::system::error_code ec,
37f5c9f8bdSJason M. Bills                                   std::vector<std::string>& pcieDevicePaths) {
38f5c9f8bdSJason M. Bills         if (ec)
39f5c9f8bdSJason M. Bills         {
40a2730f01SAndrew Geissler             BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
41f5c9f8bdSJason M. Bills                              << ec.message();
42a2730f01SAndrew Geissler             // Not an error, system just doesn't have PCIe info
43f5c9f8bdSJason M. Bills             return;
44f5c9f8bdSJason M. Bills         }
45adbe192aSJason M. Bills         nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
46f5c9f8bdSJason M. Bills         pcieDeviceList = nlohmann::json::array();
47f5c9f8bdSJason M. Bills         for (const std::string& pcieDevicePath : pcieDevicePaths)
48f5c9f8bdSJason M. Bills         {
493174e4dfSEd Tanous             size_t devStart = pcieDevicePath.rfind('/');
50f5c9f8bdSJason M. Bills             if (devStart == std::string::npos)
51f5c9f8bdSJason M. Bills             {
52f5c9f8bdSJason M. Bills                 continue;
53f5c9f8bdSJason M. Bills             }
54f5c9f8bdSJason M. Bills 
55f5c9f8bdSJason M. Bills             std::string devName = pcieDevicePath.substr(devStart + 1);
56f5c9f8bdSJason M. Bills             if (devName.empty())
57f5c9f8bdSJason M. Bills             {
58f5c9f8bdSJason M. Bills                 continue;
59f5c9f8bdSJason M. Bills             }
60f5c9f8bdSJason M. Bills             pcieDeviceList.push_back(
61f5c9f8bdSJason M. Bills                 {{"@odata.id",
62f5c9f8bdSJason M. Bills                   "/redfish/v1/Systems/system/PCIeDevices/" + devName}});
63f5c9f8bdSJason M. Bills         }
64adbe192aSJason M. Bills         asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
65f5c9f8bdSJason M. Bills     };
66f5c9f8bdSJason M. Bills     crow::connections::systemBus->async_method_call(
67f5c9f8bdSJason M. Bills         std::move(getPCIeMapCallback), "xyz.openbmc_project.ObjectMapper",
68f5c9f8bdSJason M. Bills         "/xyz/openbmc_project/object_mapper",
69f5c9f8bdSJason M. Bills         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
70f5c9f8bdSJason M. Bills         std::string(pciePath) + "/", 1, std::array<std::string, 0>());
71f5c9f8bdSJason M. Bills }
72f5c9f8bdSJason M. Bills 
737e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeDeviceCollection(App& app)
74adbe192aSJason M. Bills {
75adbe192aSJason M. Bills     /**
76adbe192aSJason M. Bills      * Functions triggers appropriate requests on DBus
77adbe192aSJason M. Bills      */
787e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/PCIeDevices/")
79*ed398213SEd Tanous         .privileges(redfish::privileges::getPCIeDeviceCollection)
807e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
817e860f15SJohn Edward Broadbent             [](const crow::Request&,
827e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
837e860f15SJohn Edward Broadbent 
84adbe192aSJason M. Bills             {
85adbe192aSJason M. Bills                 asyncResp->res.jsonValue = {
867e860f15SJohn Edward Broadbent                     {"@odata.type",
877e860f15SJohn Edward Broadbent                      "#PCIeDeviceCollection.PCIeDeviceCollection"},
88adbe192aSJason M. Bills                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices"},
89adbe192aSJason M. Bills                     {"Name", "PCIe Device Collection"},
90adbe192aSJason M. Bills                     {"Description", "Collection of PCIe Devices"},
91adbe192aSJason M. Bills                     {"Members", nlohmann::json::array()},
92adbe192aSJason M. Bills                     {"Members@odata.count", 0}};
93adbe192aSJason M. Bills                 getPCIeDeviceList(asyncResp, "Members");
947e860f15SJohn Edward Broadbent             });
95f5c9f8bdSJason M. Bills }
96f5c9f8bdSJason M. Bills 
977e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeDevice(App& app)
98f5c9f8bdSJason M. Bills {
997e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/PCIeDevices/<str>/")
100*ed398213SEd Tanous         .privileges(redfish::privileges::getPCIeDevice)
1017e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
1027e860f15SJohn Edward Broadbent             [](const crow::Request&,
1037e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1047e860f15SJohn Edward Broadbent                const std::string& device)
105f5c9f8bdSJason M. Bills 
1067e860f15SJohn Edward Broadbent             {
1077e860f15SJohn Edward Broadbent                 auto getPCIeDeviceCallback = [asyncResp, device](
1087e860f15SJohn Edward Broadbent                                                  const boost::system::error_code
1097e860f15SJohn Edward Broadbent                                                      ec,
1107e860f15SJohn Edward Broadbent                                                  boost::container::flat_map<
1117e860f15SJohn Edward Broadbent                                                      std::string,
1121214b7e7SGunnar Mills                                                      std::variant<std::string>>&
1131214b7e7SGunnar Mills                                                      pcieDevProperties) {
114f5c9f8bdSJason M. Bills                     if (ec)
115f5c9f8bdSJason M. Bills                     {
116f5c9f8bdSJason M. Bills                         BMCWEB_LOG_DEBUG
117f5c9f8bdSJason M. Bills                             << "failed to get PCIe Device properties ec: "
118271584abSEd Tanous                             << ec.value() << ": " << ec.message();
119f5c9f8bdSJason M. Bills                         if (ec.value() ==
120f5c9f8bdSJason M. Bills                             boost::system::linux_error::bad_request_descriptor)
121f5c9f8bdSJason M. Bills                         {
1227e860f15SJohn Edward Broadbent                             messages::resourceNotFound(asyncResp->res,
1237e860f15SJohn Edward Broadbent                                                        "PCIeDevice", device);
124f5c9f8bdSJason M. Bills                         }
125f5c9f8bdSJason M. Bills                         else
126f5c9f8bdSJason M. Bills                         {
127f5c9f8bdSJason M. Bills                             messages::internalError(asyncResp->res);
128f5c9f8bdSJason M. Bills                         }
129f5c9f8bdSJason M. Bills                         return;
130f5c9f8bdSJason M. Bills                     }
131f5c9f8bdSJason M. Bills 
132f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue = {
133dede6a98SJason M. Bills                         {"@odata.type", "#PCIeDevice.v1_4_0.PCIeDevice"},
134f5c9f8bdSJason M. Bills                         {"@odata.id",
135f5c9f8bdSJason M. Bills                          "/redfish/v1/Systems/system/PCIeDevices/" + device},
136f5c9f8bdSJason M. Bills                         {"Name", "PCIe Device"},
137f5c9f8bdSJason M. Bills                         {"Id", device}};
138f5c9f8bdSJason M. Bills 
1398d78b7a9SPatrick Williams                     if (std::string* property = std::get_if<std::string>(
140f5c9f8bdSJason M. Bills                             &pcieDevProperties["Manufacturer"]);
141f5c9f8bdSJason M. Bills                         property)
142f5c9f8bdSJason M. Bills                     {
143f5c9f8bdSJason M. Bills                         asyncResp->res.jsonValue["Manufacturer"] = *property;
144f5c9f8bdSJason M. Bills                     }
145f5c9f8bdSJason M. Bills 
1468d78b7a9SPatrick Williams                     if (std::string* property = std::get_if<std::string>(
147f5c9f8bdSJason M. Bills                             &pcieDevProperties["DeviceType"]);
148f5c9f8bdSJason M. Bills                         property)
149f5c9f8bdSJason M. Bills                     {
150f5c9f8bdSJason M. Bills                         asyncResp->res.jsonValue["DeviceType"] = *property;
151f5c9f8bdSJason M. Bills                     }
152f5c9f8bdSJason M. Bills 
153dede6a98SJason M. Bills                     asyncResp->res.jsonValue["PCIeFunctions"] = {
1547e860f15SJohn Edward Broadbent                         {"@odata.id",
1557e860f15SJohn Edward Broadbent                          "/redfish/v1/Systems/system/PCIeDevices/" + device +
1567e860f15SJohn Edward Broadbent                              "/PCIeFunctions"}};
157dede6a98SJason M. Bills                 };
158dede6a98SJason M. Bills                 std::string escapedPath = std::string(pciePath) + "/" + device;
159dede6a98SJason M. Bills                 dbus::utility::escapePathForDbus(escapedPath);
160dede6a98SJason M. Bills                 crow::connections::systemBus->async_method_call(
161dede6a98SJason M. Bills                     std::move(getPCIeDeviceCallback), pcieService, escapedPath,
1627e860f15SJohn Edward Broadbent                     "org.freedesktop.DBus.Properties", "GetAll",
1637e860f15SJohn Edward Broadbent                     pcieDeviceInterface);
1647e860f15SJohn Edward Broadbent             });
165dede6a98SJason M. Bills }
166dede6a98SJason M. Bills 
1677e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeFunctionCollection(App& app)
1687e860f15SJohn Edward Broadbent {
169dede6a98SJason M. Bills     /**
170dede6a98SJason M. Bills      * Functions triggers appropriate requests on DBus
171dede6a98SJason M. Bills      */
1727e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app,
1737e860f15SJohn Edward Broadbent                  "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/")
174*ed398213SEd Tanous         .privileges(redfish::privileges::getPCIeFunctionCollection)
1757e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
1767e860f15SJohn Edward Broadbent             [](const crow::Request&,
1777e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1787e860f15SJohn Edward Broadbent                const std::string& device)
1797e860f15SJohn Edward Broadbent 
180dede6a98SJason M. Bills             {
181dede6a98SJason M. Bills                 asyncResp->res.jsonValue = {
1827e860f15SJohn Edward Broadbent                     {"@odata.type",
1837e860f15SJohn Edward Broadbent                      "#PCIeFunctionCollection.PCIeFunctionCollection"},
1847e860f15SJohn Edward Broadbent                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices/" +
1857e860f15SJohn Edward Broadbent                                       device + "/PCIeFunctions"},
186dede6a98SJason M. Bills                     {"Name", "PCIe Function Collection"},
187dede6a98SJason M. Bills                     {"Description",
188dede6a98SJason M. Bills                      "Collection of PCIe Functions for PCIe Device " + device}};
189dede6a98SJason M. Bills 
1907e860f15SJohn Edward Broadbent                 auto getPCIeDeviceCallback = [asyncResp, device](
1917e860f15SJohn Edward Broadbent                                                  const boost::system::error_code
1927e860f15SJohn Edward Broadbent                                                      ec,
1937e860f15SJohn Edward Broadbent                                                  boost::container::flat_map<
1947e860f15SJohn Edward Broadbent                                                      std::string,
1957e860f15SJohn Edward Broadbent                                                      std::variant<std::string>>&
1967e860f15SJohn Edward Broadbent                                                      pcieDevProperties) {
1977e860f15SJohn Edward Broadbent                     if (ec)
1987e860f15SJohn Edward Broadbent                     {
1997e860f15SJohn Edward Broadbent                         BMCWEB_LOG_DEBUG
2007e860f15SJohn Edward Broadbent                             << "failed to get PCIe Device properties ec: "
2017e860f15SJohn Edward Broadbent                             << ec.value() << ": " << ec.message();
2027e860f15SJohn Edward Broadbent                         if (ec.value() ==
2037e860f15SJohn Edward Broadbent                             boost::system::linux_error::bad_request_descriptor)
2047e860f15SJohn Edward Broadbent                         {
2057e860f15SJohn Edward Broadbent                             messages::resourceNotFound(asyncResp->res,
2067e860f15SJohn Edward Broadbent                                                        "PCIeDevice", device);
2077e860f15SJohn Edward Broadbent                         }
2087e860f15SJohn Edward Broadbent                         else
2097e860f15SJohn Edward Broadbent                         {
2107e860f15SJohn Edward Broadbent                             messages::internalError(asyncResp->res);
2117e860f15SJohn Edward Broadbent                         }
2127e860f15SJohn Edward Broadbent                         return;
2137e860f15SJohn Edward Broadbent                     }
2147e860f15SJohn Edward Broadbent 
2157e860f15SJohn Edward Broadbent                     nlohmann::json& pcieFunctionList =
2167e860f15SJohn Edward Broadbent                         asyncResp->res.jsonValue["Members"];
2177e860f15SJohn Edward Broadbent                     pcieFunctionList = nlohmann::json::array();
2187e860f15SJohn Edward Broadbent                     static constexpr const int maxPciFunctionNum = 8;
2197e860f15SJohn Edward Broadbent                     for (int functionNum = 0; functionNum < maxPciFunctionNum;
2207e860f15SJohn Edward Broadbent                          functionNum++)
2217e860f15SJohn Edward Broadbent                     {
2227e860f15SJohn Edward Broadbent                         // Check if this function exists by looking for a device
2237e860f15SJohn Edward Broadbent                         // ID
2247e860f15SJohn Edward Broadbent                         std::string devIDProperty =
2257e860f15SJohn Edward Broadbent                             "Function" + std::to_string(functionNum) +
2267e860f15SJohn Edward Broadbent                             "DeviceId";
2277e860f15SJohn Edward Broadbent                         std::string* property = std::get_if<std::string>(
2287e860f15SJohn Edward Broadbent                             &pcieDevProperties[devIDProperty]);
2297e860f15SJohn Edward Broadbent                         if (property && !property->empty())
2307e860f15SJohn Edward Broadbent                         {
2317e860f15SJohn Edward Broadbent                             pcieFunctionList.push_back(
2327e860f15SJohn Edward Broadbent                                 {{"@odata.id",
2337e860f15SJohn Edward Broadbent                                   "/redfish/v1/Systems/system/PCIeDevices/" +
2347e860f15SJohn Edward Broadbent                                       device + "/PCIeFunctions/" +
2357e860f15SJohn Edward Broadbent                                       std::to_string(functionNum)}});
2367e860f15SJohn Edward Broadbent                         }
2377e860f15SJohn Edward Broadbent                     }
2387e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["PCIeFunctions@odata.count"] =
2397e860f15SJohn Edward Broadbent                         pcieFunctionList.size();
2407e860f15SJohn Edward Broadbent                 };
2417e860f15SJohn Edward Broadbent                 std::string escapedPath = std::string(pciePath) + "/" + device;
2427e860f15SJohn Edward Broadbent                 dbus::utility::escapePathForDbus(escapedPath);
2437e860f15SJohn Edward Broadbent                 crow::connections::systemBus->async_method_call(
2447e860f15SJohn Edward Broadbent                     std::move(getPCIeDeviceCallback), pcieService, escapedPath,
2457e860f15SJohn Edward Broadbent                     "org.freedesktop.DBus.Properties", "GetAll",
2467e860f15SJohn Edward Broadbent                     pcieDeviceInterface);
2477e860f15SJohn Edward Broadbent             });
2487e860f15SJohn Edward Broadbent }
2497e860f15SJohn Edward Broadbent 
2507e860f15SJohn Edward Broadbent inline void requestRoutesSystemPCIeFunction(App& app)
2517e860f15SJohn Edward Broadbent {
2527e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(
2537e860f15SJohn Edward Broadbent         app,
2547e860f15SJohn Edward Broadbent         "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/<str>/")
255*ed398213SEd Tanous         .privileges(redfish::privileges::getPCIeFunction)
2567e860f15SJohn Edward Broadbent         .methods(
2577e860f15SJohn Edward Broadbent             boost::beast::http::verb::get)([](const crow::Request&,
2587e860f15SJohn Edward Broadbent                                               const std::shared_ptr<
2597e860f15SJohn Edward Broadbent                                                   bmcweb::AsyncResp>& asyncResp,
2607e860f15SJohn Edward Broadbent                                               const std::string& device,
2617e860f15SJohn Edward Broadbent                                               const std::string& function) {
2627e860f15SJohn Edward Broadbent             auto getPCIeDeviceCallback = [asyncResp, device, function](
2637e860f15SJohn Edward Broadbent                                              const boost::system::error_code ec,
2647e860f15SJohn Edward Broadbent                                              boost::container::flat_map<
2657e860f15SJohn Edward Broadbent                                                  std::string,
2661214b7e7SGunnar Mills                                                  std::variant<std::string>>&
2671214b7e7SGunnar Mills                                                  pcieDevProperties) {
268dede6a98SJason M. Bills                 if (ec)
269dede6a98SJason M. Bills                 {
270dede6a98SJason M. Bills                     BMCWEB_LOG_DEBUG
271dede6a98SJason M. Bills                         << "failed to get PCIe Device properties ec: "
272dede6a98SJason M. Bills                         << ec.value() << ": " << ec.message();
273dede6a98SJason M. Bills                     if (ec.value() ==
274dede6a98SJason M. Bills                         boost::system::linux_error::bad_request_descriptor)
275dede6a98SJason M. Bills                     {
276dede6a98SJason M. Bills                         messages::resourceNotFound(asyncResp->res, "PCIeDevice",
277dede6a98SJason M. Bills                                                    device);
278dede6a98SJason M. Bills                     }
279dede6a98SJason M. Bills                     else
280dede6a98SJason M. Bills                     {
281dede6a98SJason M. Bills                         messages::internalError(asyncResp->res);
282dede6a98SJason M. Bills                     }
283dede6a98SJason M. Bills                     return;
284dede6a98SJason M. Bills                 }
285dede6a98SJason M. Bills 
286f5c9f8bdSJason M. Bills                 // Check if this function exists by looking for a device ID
287f5c9f8bdSJason M. Bills                 std::string devIDProperty = "Function" + function + "DeviceId";
2887e860f15SJohn Edward Broadbent                 if (std::string* property = std::get_if<std::string>(
2897e860f15SJohn Edward Broadbent                         &pcieDevProperties[devIDProperty]);
290f5c9f8bdSJason M. Bills                     property && property->empty())
291f5c9f8bdSJason M. Bills                 {
292f5c9f8bdSJason M. Bills                     messages::resourceNotFound(asyncResp->res, "PCIeFunction",
293f5c9f8bdSJason M. Bills                                                function);
294f5c9f8bdSJason M. Bills                     return;
295f5c9f8bdSJason M. Bills                 }
296f5c9f8bdSJason M. Bills 
297f5c9f8bdSJason M. Bills                 asyncResp->res.jsonValue = {
298f5c9f8bdSJason M. Bills                     {"@odata.type", "#PCIeFunction.v1_2_0.PCIeFunction"},
299f5c9f8bdSJason M. Bills                     {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices/" +
300f5c9f8bdSJason M. Bills                                       device + "/PCIeFunctions/" + function},
301f5c9f8bdSJason M. Bills                     {"Name", "PCIe Function"},
302f5c9f8bdSJason M. Bills                     {"Id", function},
303f5c9f8bdSJason M. Bills                     {"FunctionId", std::stoi(function)},
304f5c9f8bdSJason M. Bills                     {"Links",
305f5c9f8bdSJason M. Bills                      {{"PCIeDevice",
306f5c9f8bdSJason M. Bills                        {{"@odata.id",
3077e860f15SJohn Edward Broadbent                          "/redfish/v1/Systems/system/PCIeDevices/" +
3087e860f15SJohn Edward Broadbent                              device}}}}}};
309f5c9f8bdSJason M. Bills 
3108d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3118d78b7a9SPatrick Williams                         &pcieDevProperties["Function" + function + "DeviceId"]);
312f5c9f8bdSJason M. Bills                     property)
313f5c9f8bdSJason M. Bills                 {
314f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["DeviceId"] = *property;
315f5c9f8bdSJason M. Bills                 }
316f5c9f8bdSJason M. Bills 
3178d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3188d78b7a9SPatrick Williams                         &pcieDevProperties["Function" + function + "VendorId"]);
319f5c9f8bdSJason M. Bills                     property)
320f5c9f8bdSJason M. Bills                 {
321f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["VendorId"] = *property;
322f5c9f8bdSJason M. Bills                 }
323f5c9f8bdSJason M. Bills 
3248d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3257e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
3267e860f15SJohn Edward Broadbent                                            "FunctionType"]);
327f5c9f8bdSJason M. Bills                     property)
328f5c9f8bdSJason M. Bills                 {
329f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["FunctionType"] = *property;
330f5c9f8bdSJason M. Bills                 }
331f5c9f8bdSJason M. Bills 
3328d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3337e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
3347e860f15SJohn Edward Broadbent                                            "DeviceClass"]);
335f5c9f8bdSJason M. Bills                     property)
336f5c9f8bdSJason M. Bills                 {
337f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["DeviceClass"] = *property;
338f5c9f8bdSJason M. Bills                 }
339f5c9f8bdSJason M. Bills 
3408d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3417e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
3427e860f15SJohn Edward Broadbent                                            "ClassCode"]);
343f5c9f8bdSJason M. Bills                     property)
344f5c9f8bdSJason M. Bills                 {
345f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["ClassCode"] = *property;
346f5c9f8bdSJason M. Bills                 }
347f5c9f8bdSJason M. Bills 
3488d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3497e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
3507e860f15SJohn Edward Broadbent                                            "RevisionId"]);
351f5c9f8bdSJason M. Bills                     property)
352f5c9f8bdSJason M. Bills                 {
353f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["RevisionId"] = *property;
354f5c9f8bdSJason M. Bills                 }
355f5c9f8bdSJason M. Bills 
3568d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
3577e860f15SJohn Edward Broadbent                         &pcieDevProperties["Function" + function +
3587e860f15SJohn Edward Broadbent                                            "SubsystemId"]);
359f5c9f8bdSJason M. Bills                     property)
360f5c9f8bdSJason M. Bills                 {
361f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["SubsystemId"] = *property;
362f5c9f8bdSJason M. Bills                 }
363f5c9f8bdSJason M. Bills 
3648d78b7a9SPatrick Williams                 if (std::string* property = std::get_if<std::string>(
365f5c9f8bdSJason M. Bills                         &pcieDevProperties["Function" + function +
366f5c9f8bdSJason M. Bills                                            "SubsystemVendorId"]);
367f5c9f8bdSJason M. Bills                     property)
368f5c9f8bdSJason M. Bills                 {
369f5c9f8bdSJason M. Bills                     asyncResp->res.jsonValue["SubsystemVendorId"] = *property;
370f5c9f8bdSJason M. Bills                 }
371f5c9f8bdSJason M. Bills             };
372f5c9f8bdSJason M. Bills             std::string escapedPath = std::string(pciePath) + "/" + device;
373f5c9f8bdSJason M. Bills             dbus::utility::escapePathForDbus(escapedPath);
374f5c9f8bdSJason M. Bills             crow::connections::systemBus->async_method_call(
375f5c9f8bdSJason M. Bills                 std::move(getPCIeDeviceCallback), pcieService, escapedPath,
3767e860f15SJohn Edward Broadbent                 "org.freedesktop.DBus.Properties", "GetAll",
3777e860f15SJohn Edward Broadbent                 pcieDeviceInterface);
3787e860f15SJohn Edward Broadbent         });
379f5c9f8bdSJason M. Bills }
380f5c9f8bdSJason M. Bills 
381f5c9f8bdSJason M. Bills } // namespace redfish
382