xref: /openbmc/dbus-sensors/src/nvidia-gpu/NvidiaGpuPowerPeakReading.hpp (revision d0125c9cdf0f0ae7f1943f773c99fc512db0a68e)
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION &
3  * AFFILIATES. All rights reserved.
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #pragma once
8 
9 #include "MctpRequester.hpp"
10 
11 #include <NvidiaGpuMctpVdm.hpp>
12 #include <sdbusplus/asio/object_server.hpp>
13 
14 #include <array>
15 #include <cstdint>
16 #include <memory>
17 #include <string>
18 #include <tuple>
19 #include <vector>
20 
21 constexpr uint8_t gpuPeakPowerSensorId{0};
22 
23 // GPU Power Sensor Averaging Interval in seconds, 0 implies default
24 constexpr uint8_t gpuPowerAveragingIntervalInSec{0};
25 
26 struct NvidiaGpuPowerPeakReading
27 {
28   public:
29     NvidiaGpuPowerPeakReading(mctp::MctpRequester& mctpRequester,
30                               const std::string& name, uint8_t eid,
31                               uint8_t sensorId,
32                               sdbusplus::asio::object_server& objectServer);
33 
34     ~NvidiaGpuPowerPeakReading();
35 
36     void update();
37 
38   private:
39     void processResponse(const std::error_code& ec,
40                          std::span<const uint8_t> buffer);
41 
42     uint8_t eid{};
43 
44     uint8_t sensorId;
45 
46     uint8_t averagingInterval{gpuPowerAveragingIntervalInSec};
47 
48     std::tuple<
49         uint64_t,
50         std::vector<std::tuple<std::string, std::string, double, uint64_t>>>
51         readings;
52 
53     mctp::MctpRequester& mctpRequester;
54 
55     sdbusplus::asio::object_server& objectServer;
56 
57     std::array<uint8_t, sizeof(gpu::GetPowerDrawRequest)> request{};
58 
59     std::shared_ptr<sdbusplus::asio::dbus_interface> telemetryReportInterface;
60 };
61