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