blob: 77afd0acd68b4392fd02a2f509788baf3ceb054b [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;
Myung Bae703f6742022-11-16 18:40:40 -0500195 const size_t* lanesInUse = nullptr;
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200196
197 const bool success = sdbusplus::unpackPropertiesNoThrow(
198 dbus_utils::UnpackErrorPrinter(), pcieDevProperties,
199 "Manufacturer", manufacturer, "DeviceType", deviceType,
Myung Bae703f6742022-11-16 18:40:40 -0500200 "LanesInUse", lanesInUse, "GenerationInUse", generationInUse);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200201
202 if (!success)
203 {
204 messages::internalError(asyncResp->res);
205 return;
206 }
207
Myung Bae703f6742022-11-16 18:40:40 -0500208 // The default value of LanesInUse is 0, and the field will be
209 // left as off if it is a default value.
210 if (lanesInUse != nullptr && *lanesInUse != 0)
211 {
212 asyncResp->res.jsonValue["PCIeInterface"]["LanesInUse"] =
213 *lanesInUse;
214 }
215
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200216 if (generationInUse != nullptr)
217 {
Ed Tanous0ec8b832022-03-14 14:56:47 -0700218 std::optional<pcie_device::PCIeTypes> redfishGenerationInUse =
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200219 redfishPcieGenerationFromDbus(*generationInUse);
220 if (!redfishGenerationInUse)
221 {
222 messages::internalError(asyncResp->res);
223 return;
224 }
Ed Tanous0ec8b832022-03-14 14:56:47 -0700225 if (*redfishGenerationInUse != pcie_device::PCIeTypes::Invalid)
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200226 {
Tony Leea9f68bb2022-10-20 19:35:38 +0800227 asyncResp->res.jsonValue["PCIeInterface"]["PCIeType"] =
228 *redfishGenerationInUse;
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200229 }
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200230 }
231
232 if (manufacturer != nullptr)
233 {
234 asyncResp->res.jsonValue["Manufacturer"] = *manufacturer;
235 }
236
237 if (deviceType != nullptr)
238 {
239 asyncResp->res.jsonValue["DeviceType"] = *deviceType;
240 }
241
Ed Tanous002d39b2022-05-31 08:59:27 -0700242 asyncResp->res.jsonValue["@odata.type"] =
243 "#PCIeDevice.v1_4_0.PCIeDevice";
244 asyncResp->res.jsonValue["@odata.id"] =
245 "/redfish/v1/Systems/system/PCIeDevices/" + device;
246 asyncResp->res.jsonValue["Name"] = "PCIe Device";
247 asyncResp->res.jsonValue["Id"] = device;
248
249 asyncResp->res.jsonValue["PCIeFunctions"]["@odata.id"] =
250 "/redfish/v1/Systems/system/PCIeDevices/" + device +
251 "/PCIeFunctions";
Ed Tanous002d39b2022-05-31 08:59:27 -0700252 };
253 std::string escapedPath = std::string(pciePath) + "/" + device;
254 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200255 sdbusplus::asio::getAllProperties(
256 *crow::connections::systemBus, pcieService, escapedPath,
257 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700258 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700259}
260
261inline void requestRoutesSystemPCIeFunctionCollection(App& app)
262{
263 /**
264 * Functions triggers appropriate requests on DBus
265 */
266 BMCWEB_ROUTE(app,
267 "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/")
Ed Tanoused398212021-06-09 17:05:54 -0700268 .privileges(redfish::privileges::getPCIeFunctionCollection)
Ed Tanous002d39b2022-05-31 08:59:27 -0700269 .methods(boost::beast::http::verb::get)(
270 [&app](const crow::Request& req,
271 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
272 const std::string& device) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000273 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700274 {
275 return;
276 }
277
278 asyncResp->res.jsonValue["@odata.type"] =
279 "#PCIeFunctionCollection.PCIeFunctionCollection";
280 asyncResp->res.jsonValue["@odata.id"] =
281 "/redfish/v1/Systems/system/PCIeDevices/" + device +
282 "/PCIeFunctions";
283 asyncResp->res.jsonValue["Name"] = "PCIe Function Collection";
284 asyncResp->res.jsonValue["Description"] =
285 "Collection of PCIe Functions for PCIe Device " + device;
286
287 auto getPCIeDeviceCallback =
288 [asyncResp, device](
289 const boost::system::error_code ec,
290 const dbus::utility::DBusPropertiesMap& pcieDevProperties) {
291 if (ec)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700292 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700293 BMCWEB_LOG_DEBUG
294 << "failed to get PCIe Device properties ec: " << ec.value()
295 << ": " << ec.message();
296 if (ec.value() ==
297 boost::system::linux_error::bad_request_descriptor)
298 {
299 messages::resourceNotFound(asyncResp->res, "PCIeDevice",
300 device);
301 }
302 else
303 {
304 messages::internalError(asyncResp->res);
305 }
Ed Tanous45ca1b82022-03-25 13:07:27 -0700306 return;
307 }
Ed Tanous14766872022-03-15 10:44:42 -0700308
Ed Tanous002d39b2022-05-31 08:59:27 -0700309 nlohmann::json& pcieFunctionList =
310 asyncResp->res.jsonValue["Members"];
311 pcieFunctionList = nlohmann::json::array();
312 static constexpr const int maxPciFunctionNum = 8;
313 for (int functionNum = 0; functionNum < maxPciFunctionNum;
314 functionNum++)
315 {
316 // Check if this function exists by looking for a
317 // device ID
318 std::string devIDProperty =
319 "Function" + std::to_string(functionNum) + "DeviceId";
320 const std::string* property = nullptr;
321 for (const auto& propEntry : pcieDevProperties)
322 {
323 if (propEntry.first == devIDProperty)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700324 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700325 property = std::get_if<std::string>(&propEntry.second);
Ed Tanous45ca1b82022-03-25 13:07:27 -0700326 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700327 }
Nan Zhoufb0ecc32022-10-17 19:17:36 +0000328 if (property == nullptr || property->empty())
Ed Tanous002d39b2022-05-31 08:59:27 -0700329 {
Nan Zhoue28ce0e2022-10-13 22:28:36 +0000330 continue;
Ed Tanous002d39b2022-05-31 08:59:27 -0700331 }
332 nlohmann::json::object_t pcieFunction;
333 pcieFunction["@odata.id"] =
334 "/redfish/v1/Systems/system/PCIeDevices/" + device +
335 "/PCIeFunctions/" + std::to_string(functionNum);
336 pcieFunctionList.push_back(std::move(pcieFunction));
337 }
338 asyncResp->res.jsonValue["Members@odata.count"] =
339 pcieFunctionList.size();
340 };
341 std::string escapedPath = std::string(pciePath) + "/" + device;
342 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200343 sdbusplus::asio::getAllProperties(
344 *crow::connections::systemBus, pcieService, escapedPath,
345 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700346 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700347}
348
349inline void requestRoutesSystemPCIeFunction(App& app)
350{
351 BMCWEB_ROUTE(
352 app,
353 "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -0700354 .privileges(redfish::privileges::getPCIeFunction)
Ed Tanous002d39b2022-05-31 08:59:27 -0700355 .methods(boost::beast::http::verb::get)(
356 [&app](const crow::Request& req,
357 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
358 const std::string& device, const std::string& function) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000359 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700360 {
361 return;
362 }
363 auto getPCIeDeviceCallback =
364 [asyncResp, device, function](
365 const boost::system::error_code ec,
366 const dbus::utility::DBusPropertiesMap& pcieDevProperties) {
367 if (ec)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700368 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700369 BMCWEB_LOG_DEBUG
370 << "failed to get PCIe Device properties ec: " << ec.value()
371 << ": " << ec.message();
372 if (ec.value() ==
373 boost::system::linux_error::bad_request_descriptor)
374 {
375 messages::resourceNotFound(asyncResp->res, "PCIeDevice",
376 device);
377 }
378 else
379 {
380 messages::internalError(asyncResp->res);
381 }
Ed Tanous45ca1b82022-03-25 13:07:27 -0700382 return;
383 }
Ed Tanous168e20c2021-12-13 14:39:53 -0800384
Ed Tanous002d39b2022-05-31 08:59:27 -0700385 // Check if this function exists by looking for a device
386 // ID
387 std::string functionName = "Function" + function;
388 std::string devIDProperty = functionName + "DeviceId";
Ed Tanousb9d36b42022-02-26 21:42:46 -0800389
Ed Tanous002d39b2022-05-31 08:59:27 -0700390 const std::string* devIdProperty = nullptr;
391 for (const auto& property : pcieDevProperties)
392 {
393 if (property.first == devIDProperty)
394 {
395 devIdProperty = std::get_if<std::string>(&property.second);
396 continue;
397 }
398 }
Tony Lee973c1352022-11-18 13:48:27 +0800399 if (devIdProperty == nullptr || devIdProperty->empty())
Ed Tanous002d39b2022-05-31 08:59:27 -0700400 {
401 messages::resourceNotFound(asyncResp->res, "PCIeFunction",
402 function);
403 return;
404 }
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -0800405
Ed Tanous002d39b2022-05-31 08:59:27 -0700406 asyncResp->res.jsonValue["@odata.type"] =
407 "#PCIeFunction.v1_2_0.PCIeFunction";
408 asyncResp->res.jsonValue["@odata.id"] =
409 "/redfish/v1/Systems/system/PCIeDevices/" + device +
410 "/PCIeFunctions/" + function;
411 asyncResp->res.jsonValue["Name"] = "PCIe Function";
412 asyncResp->res.jsonValue["Id"] = function;
413 asyncResp->res.jsonValue["FunctionId"] = std::stoi(function);
414 asyncResp->res.jsonValue["Links"]["PCIeDevice"]["@odata.id"] =
415 "/redfish/v1/Systems/system/PCIeDevices/" + device;
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700416
Ed Tanous002d39b2022-05-31 08:59:27 -0700417 for (const auto& property : pcieDevProperties)
418 {
419 const std::string* strProperty =
420 std::get_if<std::string>(&property.second);
421 if (property.first == functionName + "DeviceId")
422 {
423 asyncResp->res.jsonValue["DeviceId"] = *strProperty;
424 }
425 if (property.first == functionName + "VendorId")
426 {
427 asyncResp->res.jsonValue["VendorId"] = *strProperty;
428 }
429 if (property.first == functionName + "FunctionType")
430 {
431 asyncResp->res.jsonValue["FunctionType"] = *strProperty;
432 }
433 if (property.first == functionName + "DeviceClass")
434 {
435 asyncResp->res.jsonValue["DeviceClass"] = *strProperty;
436 }
437 if (property.first == functionName + "ClassCode")
438 {
439 asyncResp->res.jsonValue["ClassCode"] = *strProperty;
440 }
441 if (property.first == functionName + "RevisionId")
442 {
443 asyncResp->res.jsonValue["RevisionId"] = *strProperty;
444 }
445 if (property.first == functionName + "SubsystemId")
446 {
447 asyncResp->res.jsonValue["SubsystemId"] = *strProperty;
448 }
449 if (property.first == functionName + "SubsystemVendorId")
450 {
451 asyncResp->res.jsonValue["SubsystemVendorId"] =
452 *strProperty;
453 }
454 }
455 };
456 std::string escapedPath = std::string(pciePath) + "/" + device;
457 dbus::utility::escapePathForDbus(escapedPath);
Krzysztof Grobelnyd1bde9e2022-09-07 10:40:51 +0200458 sdbusplus::asio::getAllProperties(
459 *crow::connections::systemBus, pcieService, escapedPath,
460 pcieDeviceInterface, std::move(getPCIeDeviceCallback));
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700461 });
462}
Jason M. Billsf5c9f8b2018-12-18 16:51:18 -0800463
464} // namespace redfish