blob: c91e52dd48caed635c8cad75850f6bc3f90cc28d [file] [log] [blame]
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -08001/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#pragma once
18
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080019#include "app.hpp"
George Liu7a1dbc42022-12-07 16:03:22 +080020#include "dbus_utility.hpp"
Ed Tanous0ec8b832022-03-14 14:56:47 -070021#include "generated/enums/pcie_device.hpp"
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080022#include "query.hpp"
23#include "registries/privilege_registry.hpp"
24#include "utils/dbus_utils.hpp"
Ed Tanous0ec8b832022-03-14 14:56:47 -070025
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080026#include <boost/system/linux_error.hpp>
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +020027#include <sdbusplus/asio/property.hpp>
28#include <sdbusplus/unpack_properties.hpp>
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080029
30namespace redfish
31{
32
Gunnar Mills1214b7e2020-06-04 10:11:30 -050033static constexpr char const* pcieService = "xyz.openbmc_project.PCIe";
34static constexpr char const* pciePath = "/xyz/openbmc_project/PCIe";
35static constexpr char const* pcieDeviceInterface =
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080036 "xyz.openbmc_project.PCIe.Device";
37
Ed Tanousb5a76932020-09-29 16:16:58 -070038static inline void
zhanghch058d1b46d2021-04-01 11:18:24 +080039 getPCIeDeviceList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanousb5a76932020-09-29 16:16:58 -070040 const std::string& name)
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080041{
George Liu7a1dbc42022-12-07 16:03:22 +080042 dbus::utility::getSubTreePaths(
43 pciePath, 1, {},
44 [asyncResp, name](const boost::system::error_code& ec,
Ed Tanousb9d36b42022-02-26 21:42:46 -080045 const dbus::utility::MapperGetSubTreePathsResponse&
46 pcieDevicePaths) {
Ed Tanous002d39b2022-05-31 08:59:27 -070047 if (ec)
48 {
49 BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: "
50 << ec.message();
51 // Not an error, system just doesn't have PCIe info
52 return;
53 }
54 nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name];
55 pcieDeviceList = nlohmann::json::array();
56 for (const std::string& pcieDevicePath : pcieDevicePaths)
57 {
58 size_t devStart = pcieDevicePath.rfind('/');
59 if (devStart == std::string::npos)
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080060 {
Ed Tanous002d39b2022-05-31 08:59:27 -070061 continue;
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080062 }
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080063
Ed Tanous002d39b2022-05-31 08:59:27 -070064 std::string devName = pcieDevicePath.substr(devStart + 1);
65 if (devName.empty())
66 {
67 continue;
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080068 }
Ed Tanous002d39b2022-05-31 08:59:27 -070069 nlohmann::json::object_t pcieDevice;
70 pcieDevice["@odata.id"] =
71 "/redfish/v1/Systems/system/PCIeDevices/" + devName;
72 pcieDeviceList.push_back(std::move(pcieDevice));
73 }
74 asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size();
George Liu7a1dbc42022-12-07 16:03:22 +080075 });
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -080076}
77
John Edward Broadbent7e860f12021-04-08 15:57:16 -070078inline void requestRoutesSystemPCIeDeviceCollection(App& app)
Jason M. Billsadbe1922019-10-14 15:44:35 -070079{
Jason M. Billsadbe1922019-10-14 15:44:35 -070080 /**
81 * Functions triggers appropriate requests on DBus
82 */
Ed Tanous22d268c2022-05-19 09:39:07 -070083 BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/PCIeDevices/")
Ed Tanoused398212021-06-09 17:05:54 -070084 .privileges(redfish::privileges::getPCIeDeviceCollection)
John Edward Broadbent7e860f12021-04-08 15:57:16 -070085 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -070086 [&app](const crow::Request& req,
Ed Tanous22d268c2022-05-19 09:39:07 -070087 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
88 const std::string& systemName) {
Carson Labrado3ba00072022-06-06 19:40:56 +000089 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -070090 {
91 return;
92 }
Ed Tanous22d268c2022-05-19 09:39:07 -070093 if (systemName != "system")
94 {
95 messages::resourceNotFound(asyncResp->res, "ComputerSystem",
96 systemName);
97 return;
98 }
Ed Tanous14766872022-03-15 10:44:42 -070099
Ed Tanous002d39b2022-05-31 08:59:27 -0700100 asyncResp->res.jsonValue["@odata.type"] =
101 "#PCIeDeviceCollection.PCIeDeviceCollection";
102 asyncResp->res.jsonValue["@odata.id"] =
103 "/redfish/v1/Systems/system/PCIeDevices";
104 asyncResp->res.jsonValue["Name"] = "PCIe Device Collection";
105 asyncResp->res.jsonValue["Description"] = "Collection of PCIe Devices";
106 asyncResp->res.jsonValue["Members"] = nlohmann::json::array();
107 asyncResp->res.jsonValue["Members@odata.count"] = 0;
108 getPCIeDeviceList(asyncResp, "Members");
109 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700110}
111
Ed Tanous0ec8b832022-03-14 14:56:47 -0700112inline std::optional<pcie_device::PCIeTypes>
Spencer Ku62cd45a2021-11-22 16:41:25 +0800113 redfishPcieGenerationFromDbus(const std::string& generationInUse)
114{
115 if (generationInUse ==
116 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen1")
117 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700118 return pcie_device::PCIeTypes::Gen1;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800119 }
120 if (generationInUse ==
121 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen2")
122 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700123 return pcie_device::PCIeTypes::Gen2;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800124 }
125 if (generationInUse ==
126 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen3")
127 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700128 return pcie_device::PCIeTypes::Gen3;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800129 }
130 if (generationInUse ==
131 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen4")
132 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700133 return pcie_device::PCIeTypes::Gen4;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800134 }
135 if (generationInUse ==
136 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Gen5")
137 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700138 return pcie_device::PCIeTypes::Gen5;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800139 }
Ed Tanouse825cbc2022-06-17 11:39:22 -0700140 if (generationInUse.empty() ||
141 generationInUse ==
142 "xyz.openbmc_project.Inventory.Item.PCIeSlot.Generations.Unknown")
Spencer Ku62cd45a2021-11-22 16:41:25 +0800143 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700144 return pcie_device::PCIeTypes::Invalid;
Spencer Ku62cd45a2021-11-22 16:41:25 +0800145 }
146
147 // The value is not unknown or Gen1-5, need return an internal error.
148 return std::nullopt;
149}
150
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700151inline void requestRoutesSystemPCIeDevice(App& app)
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -0800152{
Ed Tanous22d268c2022-05-19 09:39:07 -0700153 BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/PCIeDevices/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -0700154 .privileges(redfish::privileges::getPCIeDevice)
Ed Tanous002d39b2022-05-31 08:59:27 -0700155 .methods(boost::beast::http::verb::get)(
156 [&app](const crow::Request& req,
157 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous22d268c2022-05-19 09:39:07 -0700158 const std::string& systemName, const std::string& device) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000159 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700160 {
161 return;
162 }
Ed Tanous22d268c2022-05-19 09:39:07 -0700163 if (systemName != "system")
164 {
165 messages::resourceNotFound(asyncResp->res, "ComputerSystem",
166 systemName);
167 return;
168 }
169
Ed Tanous002d39b2022-05-31 08:59:27 -0700170 auto getPCIeDeviceCallback =
171 [asyncResp, device](
172 const boost::system::error_code ec,
173 const dbus::utility::DBusPropertiesMap& pcieDevProperties) {
174 if (ec)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700175 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700176 BMCWEB_LOG_DEBUG
177 << "failed to get PCIe Device properties ec: " << ec.value()
178 << ": " << ec.message();
179 if (ec.value() ==
180 boost::system::linux_error::bad_request_descriptor)
181 {
182 messages::resourceNotFound(asyncResp->res, "PCIeDevice",
183 device);
184 }
185 else
186 {
187 messages::internalError(asyncResp->res);
188 }
Ed Tanous45ca1b82022-03-25 13:07:27 -0700189 return;
190 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700191
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200192 const std::string* manufacturer = nullptr;
193 const std::string* deviceType = nullptr;
194 const std::string* generationInUse = nullptr;
195
196 const bool success = sdbusplus::unpackPropertiesNoThrow(
197 dbus_utils::UnpackErrorPrinter(), pcieDevProperties,
198 "Manufacturer", manufacturer, "DeviceType", deviceType,
199 "GenerationInUse", generationInUse);
200
201 if (!success)
202 {
203 messages::internalError(asyncResp->res);
204 return;
205 }
206
207 if (generationInUse != nullptr)
208 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700209 std::optional<pcie_device::PCIeTypes> redfishGenerationInUse =
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200210 redfishPcieGenerationFromDbus(*generationInUse);
211 if (!redfishGenerationInUse)
212 {
213 messages::internalError(asyncResp->res);
214 return;
215 }
Ed Tanous0ec8b832022-03-14 14:56:47 -0700216 if (*redfishGenerationInUse != pcie_device::PCIeTypes::Invalid)
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200217 {
Tony Leea9f68bb2022-10-20 19:35:38 +0800218 asyncResp->res.jsonValue["PCIeInterface"]["PCIeType"] =
219 *redfishGenerationInUse;
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200220 }
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200221 }
222
223 if (manufacturer != nullptr)
224 {
225 asyncResp->res.jsonValue["Manufacturer"] = *manufacturer;
226 }
227
228 if (deviceType != nullptr)
229 {
230 asyncResp->res.jsonValue["DeviceType"] = *deviceType;
231 }
232
Ed Tanous002d39b2022-05-31 08:59:27 -0700233 asyncResp->res.jsonValue["@odata.type"] =
234 "#PCIeDevice.v1_4_0.PCIeDevice";
235 asyncResp->res.jsonValue["@odata.id"] =
236 "/redfish/v1/Systems/system/PCIeDevices/" + device;
237 asyncResp->res.jsonValue["Name"] = "PCIe Device";
238 asyncResp->res.jsonValue["Id"] = device;
239
240 asyncResp->res.jsonValue["PCIeFunctions"]["@odata.id"] =
241 "/redfish/v1/Systems/system/PCIeDevices/" + device +
242 "/PCIeFunctions";
Ed Tanous002d39b2022-05-31 08:59:27 -0700243 };
244 std::string escapedPath = std::string(pciePath) + "/" + device;
245 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200246 sdbusplus::asio::getAllProperties(
247 *crow::connections::systemBus, pcieService, escapedPath,
248 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700249 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700250}
251
252inline void requestRoutesSystemPCIeFunctionCollection(App& app)
253{
254 /**
255 * Functions triggers appropriate requests on DBus
256 */
257 BMCWEB_ROUTE(app,
258 "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/")
Ed Tanoused398212021-06-09 17:05:54 -0700259 .privileges(redfish::privileges::getPCIeFunctionCollection)
Ed Tanous002d39b2022-05-31 08:59:27 -0700260 .methods(boost::beast::http::verb::get)(
261 [&app](const crow::Request& req,
262 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
263 const std::string& device) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000264 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700265 {
266 return;
267 }
268
269 asyncResp->res.jsonValue["@odata.type"] =
270 "#PCIeFunctionCollection.PCIeFunctionCollection";
271 asyncResp->res.jsonValue["@odata.id"] =
272 "/redfish/v1/Systems/system/PCIeDevices/" + device +
273 "/PCIeFunctions";
274 asyncResp->res.jsonValue["Name"] = "PCIe Function Collection";
275 asyncResp->res.jsonValue["Description"] =
276 "Collection of PCIe Functions for PCIe Device " + device;
277
278 auto getPCIeDeviceCallback =
279 [asyncResp, device](
280 const boost::system::error_code ec,
281 const dbus::utility::DBusPropertiesMap& pcieDevProperties) {
282 if (ec)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700283 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700284 BMCWEB_LOG_DEBUG
285 << "failed to get PCIe Device properties ec: " << ec.value()
286 << ": " << ec.message();
287 if (ec.value() ==
288 boost::system::linux_error::bad_request_descriptor)
289 {
290 messages::resourceNotFound(asyncResp->res, "PCIeDevice",
291 device);
292 }
293 else
294 {
295 messages::internalError(asyncResp->res);
296 }
Ed Tanous45ca1b82022-03-25 13:07:27 -0700297 return;
298 }
Ed Tanous14766872022-03-15 10:44:42 -0700299
Ed Tanous002d39b2022-05-31 08:59:27 -0700300 nlohmann::json& pcieFunctionList =
301 asyncResp->res.jsonValue["Members"];
302 pcieFunctionList = nlohmann::json::array();
303 static constexpr const int maxPciFunctionNum = 8;
304 for (int functionNum = 0; functionNum < maxPciFunctionNum;
305 functionNum++)
306 {
307 // Check if this function exists by looking for a
308 // device ID
309 std::string devIDProperty =
310 "Function" + std::to_string(functionNum) + "DeviceId";
311 const std::string* property = nullptr;
312 for (const auto& propEntry : pcieDevProperties)
313 {
314 if (propEntry.first == devIDProperty)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700315 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700316 property = std::get_if<std::string>(&propEntry.second);
Ed Tanous45ca1b82022-03-25 13:07:27 -0700317 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700318 }
Nan Zhoufb0ecc32022-10-17 19:17:36 +0000319 if (property == nullptr || property->empty())
Ed Tanous002d39b2022-05-31 08:59:27 -0700320 {
Nan Zhoue28ce0e2022-10-13 22:28:36 +0000321 continue;
Ed Tanous002d39b2022-05-31 08:59:27 -0700322 }
323 nlohmann::json::object_t pcieFunction;
324 pcieFunction["@odata.id"] =
325 "/redfish/v1/Systems/system/PCIeDevices/" + device +
326 "/PCIeFunctions/" + std::to_string(functionNum);
327 pcieFunctionList.push_back(std::move(pcieFunction));
328 }
329 asyncResp->res.jsonValue["Members@odata.count"] =
330 pcieFunctionList.size();
331 };
332 std::string escapedPath = std::string(pciePath) + "/" + device;
333 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200334 sdbusplus::asio::getAllProperties(
335 *crow::connections::systemBus, pcieService, escapedPath,
336 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700337 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700338}
339
340inline void requestRoutesSystemPCIeFunction(App& app)
341{
342 BMCWEB_ROUTE(
343 app,
344 "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -0700345 .privileges(redfish::privileges::getPCIeFunction)
Ed Tanous002d39b2022-05-31 08:59:27 -0700346 .methods(boost::beast::http::verb::get)(
347 [&app](const crow::Request& req,
348 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
349 const std::string& device, const std::string& function) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000350 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700351 {
352 return;
353 }
354 auto getPCIeDeviceCallback =
355 [asyncResp, device, function](
356 const boost::system::error_code ec,
357 const dbus::utility::DBusPropertiesMap& pcieDevProperties) {
358 if (ec)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700359 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700360 BMCWEB_LOG_DEBUG
361 << "failed to get PCIe Device properties ec: " << ec.value()
362 << ": " << ec.message();
363 if (ec.value() ==
364 boost::system::linux_error::bad_request_descriptor)
365 {
366 messages::resourceNotFound(asyncResp->res, "PCIeDevice",
367 device);
368 }
369 else
370 {
371 messages::internalError(asyncResp->res);
372 }
Ed Tanous45ca1b82022-03-25 13:07:27 -0700373 return;
374 }
Ed Tanous168e20c2021-12-13 14:39:53 -0800375
Ed Tanous002d39b2022-05-31 08:59:27 -0700376 // Check if this function exists by looking for a device
377 // ID
378 std::string functionName = "Function" + function;
379 std::string devIDProperty = functionName + "DeviceId";
Ed Tanousb9d36b42022-02-26 21:42:46 -0800380
Ed Tanous002d39b2022-05-31 08:59:27 -0700381 const std::string* devIdProperty = nullptr;
382 for (const auto& property : pcieDevProperties)
383 {
384 if (property.first == devIDProperty)
385 {
386 devIdProperty = std::get_if<std::string>(&property.second);
387 continue;
388 }
389 }
Tony Lee973c1352022-11-18 13:48:27 +0800390 if (devIdProperty == nullptr || devIdProperty->empty())
Ed Tanous002d39b2022-05-31 08:59:27 -0700391 {
392 messages::resourceNotFound(asyncResp->res, "PCIeFunction",
393 function);
394 return;
395 }
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -0800396
Ed Tanous002d39b2022-05-31 08:59:27 -0700397 asyncResp->res.jsonValue["@odata.type"] =
398 "#PCIeFunction.v1_2_0.PCIeFunction";
399 asyncResp->res.jsonValue["@odata.id"] =
400 "/redfish/v1/Systems/system/PCIeDevices/" + device +
401 "/PCIeFunctions/" + function;
402 asyncResp->res.jsonValue["Name"] = "PCIe Function";
403 asyncResp->res.jsonValue["Id"] = function;
404 asyncResp->res.jsonValue["FunctionId"] = std::stoi(function);
405 asyncResp->res.jsonValue["Links"]["PCIeDevice"]["@odata.id"] =
406 "/redfish/v1/Systems/system/PCIeDevices/" + device;
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700407
Ed Tanous002d39b2022-05-31 08:59:27 -0700408 for (const auto& property : pcieDevProperties)
409 {
410 const std::string* strProperty =
411 std::get_if<std::string>(&property.second);
412 if (property.first == functionName + "DeviceId")
413 {
414 asyncResp->res.jsonValue["DeviceId"] = *strProperty;
415 }
416 if (property.first == functionName + "VendorId")
417 {
418 asyncResp->res.jsonValue["VendorId"] = *strProperty;
419 }
420 if (property.first == functionName + "FunctionType")
421 {
422 asyncResp->res.jsonValue["FunctionType"] = *strProperty;
423 }
424 if (property.first == functionName + "DeviceClass")
425 {
426 asyncResp->res.jsonValue["DeviceClass"] = *strProperty;
427 }
428 if (property.first == functionName + "ClassCode")
429 {
430 asyncResp->res.jsonValue["ClassCode"] = *strProperty;
431 }
432 if (property.first == functionName + "RevisionId")
433 {
434 asyncResp->res.jsonValue["RevisionId"] = *strProperty;
435 }
436 if (property.first == functionName + "SubsystemId")
437 {
438 asyncResp->res.jsonValue["SubsystemId"] = *strProperty;
439 }
440 if (property.first == functionName + "SubsystemVendorId")
441 {
442 asyncResp->res.jsonValue["SubsystemVendorId"] =
443 *strProperty;
444 }
445 }
446 };
447 std::string escapedPath = std::string(pciePath) + "/" + device;
448 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200449 sdbusplus::asio::getAllProperties(
450 *crow::connections::systemBus, pcieService, escapedPath,
451 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700452 });
453}
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -0800454
455} // namespace redfish