1 /* 2 * SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 * SPDX-License-Identifier: Apache-2.0 4 */ 5 6 #pragma once 7 8 #include "MctpRequester.hpp" 9 #include "NvidiaDeviceDiscovery.hpp" 10 #include "NvidiaGpuMctpVdm.hpp" 11 #include "NvidiaPcieInterface.hpp" 12 13 #include <NvidiaEthPort.hpp> 14 #include <NvidiaPciePort.hpp> 15 #include <NvidiaPciePortMetrics.hpp> 16 #include <boost/asio/io_context.hpp> 17 #include <boost/asio/steady_timer.hpp> 18 #include <sdbusplus/asio/connection.hpp> 19 #include <sdbusplus/asio/object_server.hpp> 20 21 #include <chrono> 22 #include <cstdint> 23 #include <memory> 24 #include <string> 25 #include <vector> 26 27 constexpr const char* pcieDevicePathPrefix = "/xyz/openbmc_project/inventory/"; 28 29 constexpr const char* nicPathPrefix = "/xyz/openbmc_project/inventory/"; 30 31 struct PcieDeviceInfo 32 { 33 uint16_t numUpstreamPorts{}; 34 std::vector<uint8_t> numDownstreamPorts; 35 }; 36 37 class PcieDevice : public std::enable_shared_from_this<PcieDevice> 38 { 39 public: 40 PcieDevice(const SensorConfigs& configs, const std::string& name, 41 const std::string& path, 42 const std::shared_ptr<sdbusplus::asio::connection>& conn, 43 uint8_t eid, boost::asio::io_context& io, 44 mctp::MctpRequester& mctpRequester, 45 sdbusplus::asio::object_server& objectServer); 46 getPath() const47 const std::string& getPath() const 48 { 49 return path; 50 } 51 52 void init(); 53 54 private: 55 void makeSensors(); 56 57 void read(); 58 59 void getPciePortCounts(); 60 61 void processPciePortCountsResponse(const std::error_code& ec, 62 std::span<const uint8_t> response); 63 64 void getNetworkPortAddresses(uint16_t portNumber); 65 66 void processGetNetworkPortAddressesResponse( 67 uint16_t portNumber, const std::error_code& ec, 68 std::span<const uint8_t> response); 69 70 PcieDeviceInfo pcieDeviceInfo; 71 72 uint8_t eid{}; 73 74 std::chrono::milliseconds sensorPollMs; 75 76 boost::asio::steady_timer waitTimer; 77 78 mctp::MctpRequester& mctpRequester; 79 80 std::shared_ptr<sdbusplus::asio::connection> conn; 81 82 sdbusplus::asio::object_server& objectServer; 83 84 SensorConfigs configs; 85 86 std::string name; 87 88 std::string path; 89 90 std::array<uint8_t, sizeof(ocp::accelerator_management::CommonRequest)> 91 getPciePortCountsRequest{}; 92 93 std::array<uint8_t, sizeof(gpu::GetPortNetworkAddressesRequest)> 94 getPortNetworkAddressesRequest{}; 95 96 std::shared_ptr<NvidiaPcieInterface> pcieInterface; 97 98 std::vector<std::shared_ptr<NvidiaPciePortInfo>> pciePorts; 99 std::vector<std::shared_ptr<NvidiaPciePortMetrics>> pciePortMetrics; 100 101 std::shared_ptr<sdbusplus::asio::dbus_interface> networkAdapterInterface; 102 std::shared_ptr<sdbusplus::asio::dbus_interface> 103 networkAdapterAssociationInterface; 104 std::vector<std::shared_ptr<NvidiaEthPortMetrics>> ethPortMetrics; 105 }; 106