xref: /openbmc/dbus-sensors/src/nvidia-gpu/NvidiaPcieDevice.hpp (revision 7427aeef4225bf23715539b195a23bce10865265)
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