xref: /openbmc/dbus-sensors/src/nvidia-gpu/NvidiaGpuPowerPeakReading.hpp (revision b5e823f73897a8d47087d91f3f936dc07506a6e1)
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 
10 #include <NvidiaGpuMctpVdm.hpp>
11 #include <sdbusplus/asio/object_server.hpp>
12 
13 #include <array>
14 #include <cstdint>
15 #include <memory>
16 #include <string>
17 #include <tuple>
18 #include <vector>
19 
20 constexpr uint8_t gpuPeakPowerSensorId{0};
21 
22 // GPU Power Sensor Averaging Interval in seconds, 0 implies default
23 constexpr uint8_t gpuPowerAveragingIntervalInSec{0};
24 
25 struct NvidiaGpuPowerPeakReading
26 {
27   public:
28     NvidiaGpuPowerPeakReading(mctp::MctpRequester& mctpRequester,
29                               const std::string& name, uint8_t eid,
30                               uint8_t sensorId,
31                               sdbusplus::asio::object_server& objectServer);
32 
33     ~NvidiaGpuPowerPeakReading();
34 
35     void update();
36 
37   private:
38     void processResponse(const std::error_code& ec,
39                          std::span<const uint8_t> buffer);
40 
41     uint8_t eid{};
42 
43     uint8_t sensorId;
44 
45     uint8_t averagingInterval{gpuPowerAveragingIntervalInSec};
46 
47     std::tuple<
48         uint64_t,
49         std::vector<std::tuple<std::string, std::string, double, uint64_t>>>
50         readings;
51 
52     mctp::MctpRequester& mctpRequester;
53 
54     sdbusplus::asio::object_server& objectServer;
55 
56     std::array<uint8_t, sizeof(gpu::GetPowerDrawRequest)> request{};
57 
58     std::shared_ptr<sdbusplus::asio::dbus_interface> telemetryReportInterface;
59 };
60