1#![allow(deprecated)]
2
3use std::{cmp::max, mem};
4
5use crate::{device::Device, gpu_instance::GpuInstance};
6use num_enum::{IntoPrimitive, TryFromPrimitive};
7use singe_core::{
8 copy_string_to_c_chars, impl_enum_conversion, string_from_c_chars, string_from_c_ptr,
9 try_enum_from_raw,
10};
11use singe_nvml_sys as sys;
12
13use crate::{
14 error::{Error, Result},
15 utility::{mask255_bits, option_u64_from_not_available},
16};
17
18pub(crate) fn try_from_nvml_enum<T>(name: &'static str, value: u32) -> Result<T>
19where
20 T: TryFrom<u32>,
21{
22 try_enum_from_raw(name, value).map_err(|error| Error::UnknownEnumValue {
23 name: error.name.into(),
24 value: error.value,
25 })
26}
27
28bitflags::bitflags! {
29 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
30 pub struct InitFlags: u32 {
31 const NO_GPUS = sys::NVML_INIT_FLAG_NO_GPUS;
32 const NO_ATTACH = sys::NVML_INIT_FLAG_NO_ATTACH;
33 const FORCE_INIT = sys::NVML_INIT_FLAG_FORCE_INIT;
34 }
35}
36
37bitflags::bitflags! {
38 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
39 pub struct EventTypes: u64 {
40 const NONE = sys::nvmlEventTypeNone as u64;
41 const SINGLE_BIT_ECC_ERROR = sys::nvmlEventTypeSingleBitEccError as u64;
42 const DOUBLE_BIT_ECC_ERROR = sys::nvmlEventTypeDoubleBitEccError as u64;
43 const PSTATE = sys::nvmlEventTypePState as u64;
44 const XID_CRITICAL_ERROR = sys::nvmlEventTypeXidCriticalError as u64;
45 const CLOCK = sys::nvmlEventTypeClock as u64;
46 const POWER_SOURCE_CHANGE = sys::nvmlEventTypePowerSourceChange as u64;
47 const MIG_CONFIG_CHANGE = sys::nvmlEventMigConfigChange as u64;
48 const SINGLE_BIT_ECC_ERROR_STORM = sys::nvmlEventTypeSingleBitEccErrorStorm as u64;
49 const DRAM_RETIREMENT_EVENT = sys::nvmlEventTypeDramRetirementEvent as u64;
50 const DRAM_RETIREMENT_FAILURE = sys::nvmlEventTypeDramRetirementFailure as u64;
51 const NON_FATAL_POISON_ERROR = sys::nvmlEventTypeNonFatalPoisonError as u64;
52 const FATAL_POISON_ERROR = sys::nvmlEventTypeFatalPoisonError as u64;
53 const GPU_UNAVAILABLE_ERROR = sys::nvmlEventTypeGpuUnavailableError as u64;
54 const GPU_RECOVERY_ACTION = sys::nvmlEventTypeGpuRecoveryAction as u64;
55 const ALL = sys::nvmlEventTypeAll as u64;
56 }
57}
58
59bitflags::bitflags! {
60 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
61 pub struct SystemEventTypes: u64 {
62 const GPU_DRIVER_UNBIND = sys::nvmlSystemEventTypeGpuDriverUnbind as u64;
63 const GPU_DRIVER_BIND = sys::nvmlSystemEventTypeGpuDriverBind as u64;
64 }
65}
66
67bitflags::bitflags! {
68 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
69 pub struct DeviceCapabilities: u32 {
70 const EGM = sys::NVML_DEV_CAP_EGM;
71 }
72}
73
74bitflags::bitflags! {
75 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
76 pub struct DriverModelFlags: u32 {
77 const DEFAULT = sys::nvmlFlagDefault;
78 const FORCE = sys::nvmlFlagForce;
79 }
80}
81
82bitflags::bitflags! {
83 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
84 pub struct GpuInstanceProfileCapabilities: u32 {
85 const P2P = sys::NVML_GPU_INSTANCE_PROFILE_CAPS_P2P;
86 const GFX = sys::NVML_GPU_INSTANCE_PROFILE_CAPS_GFX;
87 }
88}
89
90bitflags::bitflags! {
91 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
92 pub struct ComputeInstanceProfileCapabilities: u32 {
93 const GFX = sys::NVML_COMPUTE_INSTANCE_PROFILE_CAPS_GFX;
94 }
95}
96
97bitflags::bitflags! {
98 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
99 pub struct NvLinkPacketTypes: u32 {
100 const NOP = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_NOP as _;
101 const READ = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_READ as _;
102 const WRITE = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_WRITE as _;
103 const RATOM = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_RATOM as _;
104 const NRATOM = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_NRATOM as _;
105 const FLUSH = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_FLUSH as _;
106 const RESPDATA = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA as _;
107 const RESPNODATA = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA as _;
108 const ALL = sys::nvmlNvLinkUtilizationCountPktTypes_t::NVML_NVLINK_COUNTER_PKTFILTER_ALL as _;
109 }
110}
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
113pub struct CudaDriverVersion {
114 pub raw: i32,
115 pub major: i32,
116 pub minor: i32,
117}
118
119impl CudaDriverVersion {
120 pub const fn from_raw(raw: i32) -> Self {
121 Self {
122 raw,
123 major: raw / 1000,
124 minor: (raw % 1000) / 10,
125 }
126 }
127}
128
129#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
130pub struct Pid(pub u32);
131
132#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
133pub struct FieldId(pub u32);
134
135impl FieldId {
136 pub const ECC_CURRENT: Self = Self(sys::NVML_FI_DEV_ECC_CURRENT);
137 pub const ECC_PENDING: Self = Self(sys::NVML_FI_DEV_ECC_PENDING);
138 pub const RETIRED_SBE: Self = Self(sys::NVML_FI_DEV_RETIRED_SBE);
139 pub const RETIRED_DBE: Self = Self(sys::NVML_FI_DEV_RETIRED_DBE);
140 pub const RETIRED_PENDING: Self = Self(sys::NVML_FI_DEV_RETIRED_PENDING);
141 pub const MEMORY_TEMP: Self = Self(sys::NVML_FI_DEV_MEMORY_TEMP);
142 pub const TOTAL_ENERGY_CONSUMPTION: Self = Self(sys::NVML_FI_DEV_TOTAL_ENERGY_CONSUMPTION);
143 pub const PCIE_REPLAY_COUNTER: Self = Self(sys::NVML_FI_DEV_PCIE_REPLAY_COUNTER);
144 pub const REMAPPED_CORRECTED_ROWS: Self = Self(sys::NVML_FI_DEV_REMAPPED_COR);
145 pub const REMAPPED_UNCORRECTED_ROWS: Self = Self(sys::NVML_FI_DEV_REMAPPED_UNC);
146 pub const REMAPPED_PENDING: Self = Self(sys::NVML_FI_DEV_REMAPPED_PENDING);
147 pub const REMAPPED_FAILURE: Self = Self(sys::NVML_FI_DEV_REMAPPED_FAILURE);
148 pub const POWER_AVERAGE: Self = Self(sys::NVML_FI_DEV_POWER_AVERAGE);
149 pub const POWER_INSTANT: Self = Self(sys::NVML_FI_DEV_POWER_INSTANT);
150 pub const POWER_MIN_LIMIT: Self = Self(sys::NVML_FI_DEV_POWER_MIN_LIMIT);
151 pub const POWER_MAX_LIMIT: Self = Self(sys::NVML_FI_DEV_POWER_MAX_LIMIT);
152 pub const POWER_DEFAULT_LIMIT: Self = Self(sys::NVML_FI_DEV_POWER_DEFAULT_LIMIT);
153 pub const POWER_CURRENT_LIMIT: Self = Self(sys::NVML_FI_DEV_POWER_CURRENT_LIMIT);
154 pub const ENERGY: Self = Self(sys::NVML_FI_DEV_ENERGY);
155 pub const POWER_REQUESTED_LIMIT: Self = Self(sys::NVML_FI_DEV_POWER_REQUESTED_LIMIT);
156 pub const PCIE_TX_BYTES: Self = Self(sys::NVML_FI_DEV_PCIE_COUNT_TX_BYTES);
157 pub const PCIE_RX_BYTES: Self = Self(sys::NVML_FI_DEV_PCIE_COUNT_RX_BYTES);
158 pub const NVLINK_THROUGHPUT_DATA_TX: Self = Self(sys::NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX);
159 pub const NVLINK_THROUGHPUT_DATA_RX: Self = Self(sys::NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX);
160 pub const NVLINK_THROUGHPUT_RAW_TX: Self = Self(sys::NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX);
161 pub const NVLINK_THROUGHPUT_RAW_RX: Self = Self(sys::NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX);
162 pub const PERF_POLICY_POWER: Self = Self(sys::NVML_FI_DEV_PERF_POLICY_POWER);
163 pub const PERF_POLICY_THERMAL: Self = Self(sys::NVML_FI_DEV_PERF_POLICY_THERMAL);
164 pub const PERF_POLICY_SYNC_BOOST: Self = Self(sys::NVML_FI_DEV_PERF_POLICY_SYNC_BOOST);
165 pub const PERF_POLICY_BOARD_LIMIT: Self = Self(sys::NVML_FI_DEV_PERF_POLICY_BOARD_LIMIT);
166 pub const PERF_POLICY_LOW_UTILIZATION: Self =
167 Self(sys::NVML_FI_DEV_PERF_POLICY_LOW_UTILIZATION);
168 pub const PERF_POLICY_RELIABILITY: Self = Self(sys::NVML_FI_DEV_PERF_POLICY_RELIABILITY);
169 pub const PERF_POLICY_TOTAL_APP_CLOCKS: Self =
170 Self(sys::NVML_FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS);
171 pub const PERF_POLICY_TOTAL_BASE_CLOCKS: Self =
172 Self(sys::NVML_FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS);
173 pub const TEMPERATURE_SHUTDOWN_TLIMIT: Self =
174 Self(sys::NVML_FI_DEV_TEMPERATURE_SHUTDOWN_TLIMIT);
175 pub const TEMPERATURE_SLOWDOWN_TLIMIT: Self =
176 Self(sys::NVML_FI_DEV_TEMPERATURE_SLOWDOWN_TLIMIT);
177 pub const TEMPERATURE_MEMORY_MAX_TLIMIT: Self =
178 Self(sys::NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT);
179 pub const TEMPERATURE_GPU_MAX_TLIMIT: Self = Self(sys::NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT);
180}
181
182#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
183pub struct GpmMetricId(pub u32);
184
185impl GpmMetricId {
186 pub const GRAPHICS_UTIL: Self =
187 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_GRAPHICS_UTIL as _);
188 pub const SM_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_SM_UTIL as _);
189 pub const SM_OCCUPANCY: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_SM_OCCUPANCY as _);
190 pub const INTEGER_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_INTEGER_UTIL as _);
191 pub const ANY_TENSOR_UTIL: Self =
192 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_ANY_TENSOR_UTIL as _);
193 pub const DFMA_TENSOR_UTIL: Self =
194 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_DFMA_TENSOR_UTIL as _);
195 pub const HMMA_TENSOR_UTIL: Self =
196 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_HMMA_TENSOR_UTIL as _);
197 pub const IMMA_TENSOR_UTIL: Self =
198 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_IMMA_TENSOR_UTIL as _);
199 pub const DRAM_BW_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_DRAM_BW_UTIL as _);
200 pub const FP64_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP64_UTIL as _);
201 pub const FP32_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP32_UTIL as _);
202 pub const FP16_UTIL: Self = Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP16_UTIL as _);
203 pub const PCIE_TX_PER_SEC: Self =
204 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_PCIE_TX_PER_SEC as _);
205 pub const PCIE_RX_PER_SEC: Self =
206 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_PCIE_RX_PER_SEC as _);
207 pub const NVLINK_TOTAL_RX_PER_SEC: Self =
208 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC as _);
209 pub const NVLINK_TOTAL_TX_PER_SEC: Self =
210 Self(sys::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC as _);
211}
212
213#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
214pub struct VgpuTypeId(pub u32);
215
216#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
217pub struct VgpuInstanceId(pub u32);
218
219#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
220pub struct VgpuPlacementId(pub u32);
221
222#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
223pub struct VgpuVersion {
224 pub min: u32,
225 pub max: u32,
226}
227
228#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
229pub struct VgpuVersionRange {
230 pub supported: VgpuVersion,
231 pub current: VgpuVersion,
232}
233
234#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
235#[repr(u32)]
236pub enum VgpuGuestInfoState {
237 Uninitialized =
238 sys::nvmlVgpuGuestInfoState_t::NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED as _,
239 Initialized =
240 sys::nvmlVgpuGuestInfoState_t::NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED as _,
241}
242
243impl_enum_conversion!(u32, sys::nvmlVgpuGuestInfoState_t, VgpuGuestInfoState);
244
245bitflags::bitflags! {
246 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
247 pub struct VgpuVmCompatibility: u32 {
248 const NONE = sys::nvmlVgpuVmCompatibility_t::NVML_VGPU_VM_COMPATIBILITY_NONE as u32;
249 const COLD = sys::nvmlVgpuVmCompatibility_t::NVML_VGPU_VM_COMPATIBILITY_COLD as u32;
250 const HIBERNATE = sys::nvmlVgpuVmCompatibility_t::NVML_VGPU_VM_COMPATIBILITY_HIBERNATE as u32;
251 const SLEEP = sys::nvmlVgpuVmCompatibility_t::NVML_VGPU_VM_COMPATIBILITY_SLEEP as u32;
252 const LIVE = sys::nvmlVgpuVmCompatibility_t::NVML_VGPU_VM_COMPATIBILITY_LIVE as u32;
253 }
254}
255
256bitflags::bitflags! {
257 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
258 pub struct VgpuPgpuCompatibilityLimitCode: u32 {
259 const NONE = sys::nvmlVgpuPgpuCompatibilityLimitCode_t::NVML_VGPU_COMPATIBILITY_LIMIT_NONE as u32;
260 const HOST_DRIVER = sys::nvmlVgpuPgpuCompatibilityLimitCode_t::NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER as u32;
261 const GUEST_DRIVER = sys::nvmlVgpuPgpuCompatibilityLimitCode_t::NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER as u32;
262 const GPU = sys::nvmlVgpuPgpuCompatibilityLimitCode_t::NVML_VGPU_COMPATIBILITY_LIMIT_GPU as u32;
263 const OTHER = sys::nvmlVgpuPgpuCompatibilityLimitCode_t::NVML_VGPU_COMPATIBILITY_LIMIT_OTHER as u32;
264 }
265}
266
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
268pub struct VgpuCompatibility {
269 pub vm_compatibility: VgpuVmCompatibility,
270 pub limit_code: VgpuPgpuCompatibilityLimitCode,
271}
272
273#[derive(Debug, Clone, PartialEq, Eq, Hash)]
274pub struct VgpuMetadata {
275 pub version: u32,
276 pub revision: u32,
277 pub guest_info_state: VgpuGuestInfoState,
278 pub guest_driver_version: String,
279 pub host_driver_version: String,
280 pub virtualization_caps: u32,
281 pub guest_vgpu_version: u32,
282 pub opaque_data: Vec<u8>,
283}
284
285#[derive(Debug, Clone, PartialEq, Eq, Hash)]
286pub struct PgpuMetadata {
287 pub version: u32,
288 pub revision: u32,
289 pub host_driver_version: String,
290 pub virtualization_caps: u32,
291 pub host_supported_vgpu_range: VgpuVersion,
292 pub opaque_data: Vec<u8>,
293}
294
295#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
296#[repr(u32)]
297pub enum VgpuPlacementMode {
298 Heterogeneous = sys::NVML_VGPU_PGPU_HETEROGENEOUS_MODE,
299 Homogeneous = sys::NVML_VGPU_PGPU_HOMOGENEOUS_MODE,
300}
301
302#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
303pub struct VgpuTypeDeviceId {
304 pub device_id: u64,
305 pub subsystem_id: u64,
306}
307
308#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
309pub struct VgpuTypeResolution {
310 pub x: u32,
311 pub y: u32,
312}
313
314#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
315pub struct VgpuTypeBar1Info {
316 pub bar1_size: u64,
317}
318
319#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
320pub struct FieldQuery {
321 pub field: FieldId,
322 pub scope_id: u32,
323}
324
325impl FieldQuery {
326 pub const fn new(field: FieldId) -> Self {
327 Self { field, scope_id: 0 }
328 }
329
330 pub const fn with_scope(field: FieldId, scope_id: u32) -> Self {
331 Self { field, scope_id }
332 }
333}
334
335#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
336#[repr(u32)]
337pub enum EnableState {
338 Disabled = sys::nvmlEnableState_t::NVML_FEATURE_DISABLED as _,
339 Enabled = sys::nvmlEnableState_t::NVML_FEATURE_ENABLED as _,
340}
341
342impl_enum_conversion!(u32, sys::nvmlEnableState_t, EnableState);
343
344#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
345pub enum Brand {
346 Unknown,
347 Quadro,
348 Tesla,
349 Nvs,
350 Grid,
351 GeForce,
352 Titan,
353 NvidiaVApps,
354 NvidiaVpc,
355 NvidiaVcs,
356 NvidiaVws,
357 NvidiaCloudGaming,
358 QuadroRtx,
359 NvidiaRtx,
360 Nvidia,
361 GeForceRtx,
362 TitanRtx,
363 Other(u32),
364}
365
366impl Brand {
367 pub const fn from_raw(value: u32) -> Self {
368 match value {
369 value if value == sys::nvmlBrandType_t::NVML_BRAND_UNKNOWN as u32 => Self::Unknown,
370 value if value == sys::nvmlBrandType_t::NVML_BRAND_QUADRO as u32 => Self::Quadro,
371 value if value == sys::nvmlBrandType_t::NVML_BRAND_TESLA as u32 => Self::Tesla,
372 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVS as u32 => Self::Nvs,
373 value if value == sys::nvmlBrandType_t::NVML_BRAND_GRID as u32 => Self::Grid,
374 value if value == sys::nvmlBrandType_t::NVML_BRAND_GEFORCE as u32 => Self::GeForce,
375 value if value == sys::nvmlBrandType_t::NVML_BRAND_TITAN as u32 => Self::Titan,
376 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_VAPPS as u32 => {
377 Self::NvidiaVApps
378 }
379 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_VPC as u32 => Self::NvidiaVpc,
380 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_VCS as u32 => Self::NvidiaVcs,
381 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_VWS as u32 => Self::NvidiaVws,
382 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_CLOUD_GAMING as u32 => {
383 Self::NvidiaCloudGaming
384 }
385 value if value == sys::nvmlBrandType_t::NVML_BRAND_QUADRO_RTX as u32 => Self::QuadroRtx,
386 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA_RTX as u32 => Self::NvidiaRtx,
387 value if value == sys::nvmlBrandType_t::NVML_BRAND_NVIDIA as u32 => Self::Nvidia,
388 value if value == sys::nvmlBrandType_t::NVML_BRAND_GEFORCE_RTX as u32 => {
389 Self::GeForceRtx
390 }
391 value if value == sys::nvmlBrandType_t::NVML_BRAND_TITAN_RTX as u32 => Self::TitanRtx,
392 raw => Self::Other(raw),
393 }
394 }
395}
396
397#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
398#[repr(u32)]
399pub enum TemperatureSensor {
400 Gpu = sys::nvmlTemperatureSensors_t::NVML_TEMPERATURE_GPU as _,
401}
402
403impl_enum_conversion!(u32, sys::nvmlTemperatureSensors_t, TemperatureSensor);
404
405#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
406#[repr(u32)]
407pub enum TemperatureThreshold {
408 Shutdown = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_SHUTDOWN as _,
409 Slowdown = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_SLOWDOWN as _,
410 MemoryMax = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_MEM_MAX as _,
411 GpuMax = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_GPU_MAX as _,
412 AcousticMin = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN as _,
413 AcousticCurrent =
414 sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR as _,
415 AcousticMax = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX as _,
416 GpuCurrent = sys::nvmlTemperatureThresholds_t::NVML_TEMPERATURE_THRESHOLD_GPS_CURR as _,
417}
418
419impl_enum_conversion!(u32, sys::nvmlTemperatureThresholds_t, TemperatureThreshold);
420
421#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
422#[repr(u32)]
423pub enum ComputeMode {
424 Default = sys::nvmlComputeMode_t::NVML_COMPUTEMODE_DEFAULT as _,
425 ExclusiveThread = sys::nvmlComputeMode_t::NVML_COMPUTEMODE_EXCLUSIVE_THREAD as _,
426 Prohibited = sys::nvmlComputeMode_t::NVML_COMPUTEMODE_PROHIBITED as _,
427 ExclusiveProcess = sys::nvmlComputeMode_t::NVML_COMPUTEMODE_EXCLUSIVE_PROCESS as _,
428}
429
430impl_enum_conversion!(u32, sys::nvmlComputeMode_t, ComputeMode);
431
432#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
433pub enum Architecture {
434 Kepler,
435 Maxwell,
436 Pascal,
437 Volta,
438 Turing,
439 Ampere,
440 Ada,
441 Hopper,
442 Blackwell,
443 Other(u32),
444}
445
446impl Architecture {
447 pub const fn from_raw(value: u32) -> Self {
448 match value {
449 sys::NVML_DEVICE_ARCH_KEPLER => Self::Kepler,
450 sys::NVML_DEVICE_ARCH_MAXWELL => Self::Maxwell,
451 sys::NVML_DEVICE_ARCH_PASCAL => Self::Pascal,
452 sys::NVML_DEVICE_ARCH_VOLTA => Self::Volta,
453 sys::NVML_DEVICE_ARCH_TURING => Self::Turing,
454 sys::NVML_DEVICE_ARCH_AMPERE => Self::Ampere,
455 sys::NVML_DEVICE_ARCH_ADA => Self::Ada,
456 sys::NVML_DEVICE_ARCH_HOPPER => Self::Hopper,
457 sys::NVML_DEVICE_ARCH_BLACKWELL => Self::Blackwell,
458 raw => Self::Other(raw),
459 }
460 }
461}
462
463#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
464#[repr(u32)]
465pub enum ClockType {
466 Graphics = sys::nvmlClockType_t::NVML_CLOCK_GRAPHICS as _,
467 Sm = sys::nvmlClockType_t::NVML_CLOCK_SM as _,
468 Memory = sys::nvmlClockType_t::NVML_CLOCK_MEM as _,
469 Video = sys::nvmlClockType_t::NVML_CLOCK_VIDEO as _,
470}
471
472impl_enum_conversion!(u32, sys::nvmlClockType_t, ClockType);
473
474#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
475#[repr(u32)]
476pub enum NvLinkUtilizationCountUnits {
477 Cycles = sys::nvmlNvLinkUtilizationCountUnits_t::NVML_NVLINK_COUNTER_UNIT_CYCLES as _,
478 Packets = sys::nvmlNvLinkUtilizationCountUnits_t::NVML_NVLINK_COUNTER_UNIT_PACKETS as _,
479 Bytes = sys::nvmlNvLinkUtilizationCountUnits_t::NVML_NVLINK_COUNTER_UNIT_BYTES as _,
480 Reserved = sys::nvmlNvLinkUtilizationCountUnits_t::NVML_NVLINK_COUNTER_UNIT_RESERVED as _,
481 Count = sys::nvmlNvLinkUtilizationCountUnits_t::NVML_NVLINK_COUNTER_UNIT_COUNT as _,
482}
483
484impl_enum_conversion!(
485 u32,
486 sys::nvmlNvLinkUtilizationCountUnits_t,
487 NvLinkUtilizationCountUnits
488);
489
490#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
491#[repr(u32)]
492pub enum NvLinkCapability {
493 P2pSupported = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_P2P_SUPPORTED as _,
494 SysmemAccess = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_SYSMEM_ACCESS as _,
495 P2pAtomics = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_P2P_ATOMICS as _,
496 SysmemAtomics = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_SYSMEM_ATOMICS as _,
497 SliBridge = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_SLI_BRIDGE as _,
498 Valid = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_VALID as _,
499 Count = sys::nvmlNvLinkCapability_t::NVML_NVLINK_CAP_COUNT as _,
500}
501
502impl_enum_conversion!(u32, sys::nvmlNvLinkCapability_t, NvLinkCapability);
503
504#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
505#[repr(u32)]
506pub enum NvLinkErrorCounter {
507 DlReplay = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_DL_REPLAY as _,
508 DlRecovery = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_DL_RECOVERY as _,
509 DlCrcFlit = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_DL_CRC_FLIT as _,
510 DlCrcData = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_DL_CRC_DATA as _,
511 DlEccData = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_DL_ECC_DATA as _,
512 Count = sys::nvmlNvLinkErrorCounter_t::NVML_NVLINK_ERROR_COUNT as _,
513}
514
515impl_enum_conversion!(u32, sys::nvmlNvLinkErrorCounter_t, NvLinkErrorCounter);
516
517#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
518#[repr(u32)]
519pub enum NvLinkRemoteDeviceType {
520 Gpu = sys::nvmlIntNvLinkDeviceType_t::NVML_NVLINK_DEVICE_TYPE_GPU as _,
521 IbmNpu = sys::nvmlIntNvLinkDeviceType_t::NVML_NVLINK_DEVICE_TYPE_IBMNPU as _,
522 Switch = sys::nvmlIntNvLinkDeviceType_t::NVML_NVLINK_DEVICE_TYPE_SWITCH as _,
523 Unknown = sys::nvmlIntNvLinkDeviceType_t::NVML_NVLINK_DEVICE_TYPE_UNKNOWN as _,
524}
525
526impl_enum_conversion!(u32, sys::nvmlIntNvLinkDeviceType_t, NvLinkRemoteDeviceType);
527
528#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
529#[repr(u32)]
530pub enum NvLinkVersion {
531 Invalid = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_INVALID as _,
532 V1_0 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_1_0 as _,
533 V2_0 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_2_0 as _,
534 V2_2 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_2_2 as _,
535 V3_0 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_3_0 as _,
536 V3_1 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_3_1 as _,
537 V4_0 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_4_0 as _,
538 V5_0 = sys::nvmlNvlinkVersion_t::NVML_NVLINK_VERSION_5_0 as _,
539}
540
541impl_enum_conversion!(u32, sys::nvmlNvlinkVersion_t, NvLinkVersion);
542
543#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
544#[repr(u32)]
545pub enum PowerProfileType {
546 MaxP = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX_P as _,
547 MaxQ = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX_Q as _,
548 Compute = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_COMPUTE as _,
549 MemoryBound = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MEMORY_BOUND as _,
550 Network = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_NETWORK as _,
551 Balanced = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_BALANCED as _,
552 LlmInference = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_LLM_INFERENCE as _,
553 LlmTraining = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_LLM_TRAINING as _,
554 Rbm = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_RBM as _,
555 Dcpcie = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_DCPCIE as _,
556 HmmaSparse = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HMMA_SPARSE as _,
557 HmmaDense = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HMMA_DENSE as _,
558 SyncBalanced = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_SYNC_BALANCED as _,
559 Hpc = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HPC as _,
560 Mig = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MIG as _,
561 Max = sys::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX as _,
562}
563
564impl_enum_conversion!(u32, sys::nvmlPowerProfileType_t, PowerProfileType);
565
566#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
567#[repr(u32)]
568pub enum PowerMizerMode {
569 Adaptive = sys::NVML_POWER_MIZER_MODE_ADAPTIVE,
570 PreferMaximumPerformance = sys::NVML_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE,
571 Auto = sys::NVML_POWER_MIZER_MODE_AUTO,
572 PreferConsistentPerformance = sys::NVML_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE,
573}
574
575#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
576pub struct PowerMizerModes {
577 pub current_mode: u32,
578 pub mode: u32,
579 pub supported_modes: u32,
580}
581
582#[derive(Debug, Clone, PartialEq, Eq, Hash)]
583pub struct WorkloadPowerProfileInfo {
584 pub profile_id: u32,
585 pub priority: u32,
586 pub conflicting_profiles: Vec<u32>,
587}
588
589#[derive(Debug, Clone, PartialEq, Eq, Hash)]
590pub struct WorkloadPowerProfilesInfo {
591 pub supported_profiles: Vec<u32>,
592 pub profiles: Vec<WorkloadPowerProfileInfo>,
593}
594
595#[derive(Debug, Clone, PartialEq, Eq, Hash)]
596pub struct WorkloadPowerCurrentProfiles {
597 pub supported_profiles: Vec<u32>,
598 pub requested_profiles: Vec<u32>,
599 pub enforced_profiles: Vec<u32>,
600}
601
602#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
603pub struct DramEncryptionInfo {
604 pub encryption_state: EnableState,
605}
606
607#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
608pub struct ConfComputeSystemCaps {
609 pub cpu_caps: u32,
610 pub gpus_caps: u32,
611}
612
613#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
614pub struct ConfComputeSystemState {
615 pub environment: u32,
616 pub cc_feature: u32,
617 pub dev_tools_mode: u32,
618}
619
620#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
621pub struct ConfComputeSystemSettings {
622 pub environment: u32,
623 pub cc_feature: u32,
624 pub dev_tools_mode: u32,
625 pub multi_gpu_mode: u32,
626}
627
628#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
629pub struct ConfComputeMemSizeInfo {
630 pub protected_mem_size_kib: u64,
631 pub unprotected_mem_size_kib: u64,
632}
633
634#[derive(Debug, Clone, PartialEq, Eq, Hash)]
635pub struct ConfComputeGpuCertificate {
636 pub cert_chain: Vec<u8>,
637 pub attestation_cert_chain: Vec<u8>,
638}
639
640#[derive(Debug, Clone, PartialEq, Eq, Hash)]
641pub struct ConfComputeGpuAttestationReport {
642 pub cec_attestation_report_present: bool,
643 pub nonce: [u8; 32],
644 pub attestation_report: Vec<u8>,
645 pub cec_attestation_report: Vec<u8>,
646}
647
648#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
649pub struct ConfComputeKeyRotationThreshold {
650 pub attacker_advantage: u64,
651}
652
653#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
654#[repr(u32)]
655pub enum ClockId {
656 Current = sys::nvmlClockId_t::NVML_CLOCK_ID_CURRENT as _,
657 #[deprecated]
658 AppClockTarget = sys::nvmlClockId_t::NVML_CLOCK_ID_APP_CLOCK_TARGET as _,
659 #[deprecated]
660 AppClockDefault = sys::nvmlClockId_t::NVML_CLOCK_ID_APP_CLOCK_DEFAULT as _,
661 CustomerBoostMax = sys::nvmlClockId_t::NVML_CLOCK_ID_CUSTOMER_BOOST_MAX as _,
662}
663
664impl_enum_conversion!(u32, sys::nvmlClockId_t, ClockId);
665
666#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
668#[repr(i32)]
669pub enum ThermalTarget {
670 None = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_NONE as _,
671 Gpu = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_GPU as _,
673 Memory = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_MEMORY as _,
675 PowerSupply = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_POWER_SUPPLY as _,
677 Board = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_BOARD as _,
679 VcdBoard = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_BOARD as _,
681 VcdInlet = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_INLET as _,
683 VcdOutlet = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_OUTLET as _,
685 All = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_ALL as _,
686 Unknown = sys::nvmlThermalTarget_t::NVML_THERMAL_TARGET_UNKNOWN as _,
687}
688
689impl_enum_conversion!(i32, sys::nvmlThermalTarget_t, ThermalTarget);
690
691#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
693#[repr(i32)]
694pub enum ThermalController {
695 None = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NONE as _,
696 GpuInternal = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_GPU_INTERNAL as _,
697 Adm1032 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADM1032 as _,
698 Adt7461 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7461 as _,
699 Max6649 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX6649 as _,
700 Max1617 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX1617 as _,
701 Lm99 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM99 as _,
702 Lm89 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM89 as _,
703 Lm64 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM64 as _,
704 G781 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_G781 as _,
705 Adt7473 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7473 as _,
706 Sbmax6649 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_SBMAX6649 as _,
707 VbiosEvt = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_VBIOSEVT as _,
708 Os = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_OS as _,
709 NvsysconCanoas = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS as _,
710 NvsysconE551 = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NVSYSCON_E551 as _,
711 Max6649r = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX6649R as _,
712 Adt7473s = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7473S as _,
713 Unknown = sys::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_UNKNOWN as _,
714}
715
716impl_enum_conversion!(i32, sys::nvmlThermalController_t, ThermalController);
717
718#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
720#[repr(u32)]
721pub enum DeviceAddressingMode {
722 None = sys::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_NONE as _,
724 Hmm = sys::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_HMM as _,
726 Ats = sys::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_ATS as _,
728}
729
730impl_enum_conversion!(
731 u32,
732 sys::nvmlDeviceAddressingModeType_t,
733 DeviceAddressingMode
734);
735
736#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
737#[repr(u32)]
738pub enum BridgeChipType {
739 Plx = sys::nvmlBridgeChipType_t::NVML_BRIDGE_CHIP_PLX as _,
740 Bro4 = sys::nvmlBridgeChipType_t::NVML_BRIDGE_CHIP_BRO4 as _,
741}
742
743impl_enum_conversion!(u32, sys::nvmlBridgeChipType_t, BridgeChipType);
744
745#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
746#[repr(u32)]
747pub enum PerformanceState {
748 P0 = sys::nvmlPstates_t::NVML_PSTATE_0 as _,
749 P1 = sys::nvmlPstates_t::NVML_PSTATE_1 as _,
750 P2 = sys::nvmlPstates_t::NVML_PSTATE_2 as _,
751 P3 = sys::nvmlPstates_t::NVML_PSTATE_3 as _,
752 P4 = sys::nvmlPstates_t::NVML_PSTATE_4 as _,
753 P5 = sys::nvmlPstates_t::NVML_PSTATE_5 as _,
754 P6 = sys::nvmlPstates_t::NVML_PSTATE_6 as _,
755 P7 = sys::nvmlPstates_t::NVML_PSTATE_7 as _,
756 P8 = sys::nvmlPstates_t::NVML_PSTATE_8 as _,
757 P9 = sys::nvmlPstates_t::NVML_PSTATE_9 as _,
758 P10 = sys::nvmlPstates_t::NVML_PSTATE_10 as _,
759 P11 = sys::nvmlPstates_t::NVML_PSTATE_11 as _,
760 P12 = sys::nvmlPstates_t::NVML_PSTATE_12 as _,
761 P13 = sys::nvmlPstates_t::NVML_PSTATE_13 as _,
762 P14 = sys::nvmlPstates_t::NVML_PSTATE_14 as _,
763 P15 = sys::nvmlPstates_t::NVML_PSTATE_15 as _,
764 Unknown = sys::nvmlPstates_t::NVML_PSTATE_UNKNOWN as _,
765}
766
767impl_enum_conversion!(u32, sys::nvmlPstates_t, PerformanceState);
768
769#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
770#[repr(u32)]
771pub enum PcieUtilCounter {
772 TxBytes = sys::nvmlPcieUtilCounter_t::NVML_PCIE_UTIL_TX_BYTES as _,
773 RxBytes = sys::nvmlPcieUtilCounter_t::NVML_PCIE_UTIL_RX_BYTES as _,
774}
775
776impl_enum_conversion!(u32, sys::nvmlPcieUtilCounter_t, PcieUtilCounter);
777
778#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
779#[repr(u32)]
780pub enum TopologyLevel {
781 Internal = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_INTERNAL as _,
782 Single = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_SINGLE as _,
783 Multiple = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_MULTIPLE as _,
784 HostBridge = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_HOSTBRIDGE as _,
785 Node = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_NODE as _,
786 System = sys::nvmlGpuTopologyLevel_t::NVML_TOPOLOGY_SYSTEM as _,
787}
788
789impl_enum_conversion!(u32, sys::nvmlGpuTopologyLevel_t, TopologyLevel);
790
791#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
792#[repr(u32)]
793pub enum P2pCapabilityIndex {
794 Read = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_READ as _,
795 Write = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_WRITE as _,
796 Nvlink = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_NVLINK as _,
797 Atomics = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_ATOMICS as _,
798 Prop = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_PROP as _,
799 Unknown = sys::nvmlGpuP2PCapsIndex_t::NVML_P2P_CAPS_INDEX_UNKNOWN as _,
800}
801
802impl_enum_conversion!(u32, sys::nvmlGpuP2PCapsIndex_t, P2pCapabilityIndex);
803
804#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
805#[repr(u32)]
806pub enum P2pStatus {
807 Ok = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_OK as _,
808 ChipsetNotSupported = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_CHIPSET_NOT_SUPPORTED as _,
809 GpuNotSupported = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_GPU_NOT_SUPPORTED as _,
810 IoHubNotSupported = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED as _,
811 DisabledByRegKey = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_DISABLED_BY_REGKEY as _,
812 NotSupported = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_NOT_SUPPORTED as _,
813 Unknown = sys::nvmlGpuP2PStatus_t::NVML_P2P_STATUS_UNKNOWN as _,
814}
815
816impl_enum_conversion!(u32, sys::nvmlGpuP2PStatus_t, P2pStatus);
817
818#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
819#[repr(u32)]
820pub enum InforomObject {
821 Oem = sys::nvmlInforomObject_t::NVML_INFOROM_OEM as _,
822 Ecc = sys::nvmlInforomObject_t::NVML_INFOROM_ECC as _,
823 Power = sys::nvmlInforomObject_t::NVML_INFOROM_POWER as _,
824 Den = sys::nvmlInforomObject_t::NVML_INFOROM_DEN as _,
825}
826
827impl_enum_conversion!(u32, sys::nvmlInforomObject_t, InforomObject);
828
829#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
830#[repr(u32)]
831pub enum MemoryErrorType {
832 Corrected = sys::nvmlMemoryErrorType_t::NVML_MEMORY_ERROR_TYPE_CORRECTED as _,
833 Uncorrected = sys::nvmlMemoryErrorType_t::NVML_MEMORY_ERROR_TYPE_UNCORRECTED as _,
834}
835
836impl_enum_conversion!(u32, sys::nvmlMemoryErrorType_t, MemoryErrorType);
837
838#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
839#[repr(u32)]
840pub enum EccCounterType {
841 Volatile = sys::nvmlEccCounterType_t::NVML_VOLATILE_ECC as _,
842 Aggregate = sys::nvmlEccCounterType_t::NVML_AGGREGATE_ECC as _,
843}
844
845impl_enum_conversion!(u32, sys::nvmlEccCounterType_t, EccCounterType);
846
847#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
848#[repr(u32)]
849pub enum MemoryLocation {
850 L1Cache = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_L1_CACHE as _,
851 L2Cache = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_L2_CACHE as _,
852 Dram = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_DRAM as _,
853 RegisterFile = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_REGISTER_FILE as _,
854 TextureMemory = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_TEXTURE_MEMORY as _,
855 TextureShm = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_TEXTURE_SHM as _,
856 Cbu = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_CBU as _,
857 Sram = sys::nvmlMemoryLocation_t::NVML_MEMORY_LOCATION_SRAM as _,
858}
859
860impl_enum_conversion!(u32, sys::nvmlMemoryLocation_t, MemoryLocation);
861
862#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
863#[repr(u32)]
864pub enum PerfPolicyType {
865 Power = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_POWER as _,
866 Thermal = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_THERMAL as _,
867 SyncBoost = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_SYNC_BOOST as _,
868 BoardLimit = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_BOARD_LIMIT as _,
869 LowUtilization = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_LOW_UTILIZATION as _,
870 Reliability = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_RELIABILITY as _,
871 TotalAppClocks = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_TOTAL_APP_CLOCKS as _,
872 TotalBaseClocks = sys::nvmlPerfPolicyType_t::NVML_PERF_POLICY_TOTAL_BASE_CLOCKS as _,
873}
874
875impl_enum_conversion!(u32, sys::nvmlPerfPolicyType_t, PerfPolicyType);
876
877#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
878#[repr(u32)]
879pub enum PageRetirementCause {
880 MultipleSingleBitEccErrors =
881 sys::nvmlPageRetirementCause_t::NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS
882 as _,
883 DoubleBitEccError =
884 sys::nvmlPageRetirementCause_t::NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR as _,
885}
886
887impl_enum_conversion!(u32, sys::nvmlPageRetirementCause_t, PageRetirementCause);
888
889#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
890#[repr(u32)]
891pub enum FieldValueType {
892 Double = sys::nvmlValueType_t::NVML_VALUE_TYPE_DOUBLE as _,
893 UnsignedInt = sys::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_INT as _,
894 UnsignedLong = sys::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_LONG as _,
895 UnsignedLongLong = sys::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_LONG_LONG as _,
896 SignedLongLong = sys::nvmlValueType_t::NVML_VALUE_TYPE_SIGNED_LONG_LONG as _,
897 SignedInt = sys::nvmlValueType_t::NVML_VALUE_TYPE_SIGNED_INT as _,
898 UnsignedShort = sys::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_SHORT as _,
899}
900
901impl_enum_conversion!(u32, sys::nvmlValueType_t, FieldValueType);
902
903#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
904#[repr(u32)]
905pub enum SamplingType {
906 TotalPower = sys::nvmlSamplingType_t::NVML_TOTAL_POWER_SAMPLES as _,
907 GpuUtilization = sys::nvmlSamplingType_t::NVML_GPU_UTILIZATION_SAMPLES as _,
908 MemoryUtilization = sys::nvmlSamplingType_t::NVML_MEMORY_UTILIZATION_SAMPLES as _,
909 EncoderUtilization = sys::nvmlSamplingType_t::NVML_ENC_UTILIZATION_SAMPLES as _,
910 DecoderUtilization = sys::nvmlSamplingType_t::NVML_DEC_UTILIZATION_SAMPLES as _,
911 ProcessorClock = sys::nvmlSamplingType_t::NVML_PROCESSOR_CLK_SAMPLES as _,
912 MemoryClock = sys::nvmlSamplingType_t::NVML_MEMORY_CLK_SAMPLES as _,
913 ModulePower = sys::nvmlSamplingType_t::NVML_MODULE_POWER_SAMPLES as _,
914 JpgUtilization = sys::nvmlSamplingType_t::NVML_JPG_UTILIZATION_SAMPLES as _,
915 OfaUtilization = sys::nvmlSamplingType_t::NVML_OFA_UTILIZATION_SAMPLES as _,
916}
917
918impl_enum_conversion!(u32, sys::nvmlSamplingType_t, SamplingType);
919
920#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
921#[repr(u32)]
922pub enum ProcessMode {
923 Compute = 0,
924 Graphics = 1,
925 MpsCompute = 2,
926}
927
928#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
929#[repr(u32)]
930pub enum AffinityScope {
931 Node = sys::NVML_AFFINITY_SCOPE_NODE,
932 Socket = sys::NVML_AFFINITY_SCOPE_SOCKET,
933}
934
935#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
936pub enum BusType {
937 Unknown,
938 Pci,
939 Pcie,
940 Fpci,
941 Agp,
942 Other(u32),
943}
944
945impl BusType {
946 pub const fn from_raw(value: u32) -> Self {
947 match value {
948 sys::NVML_BUS_TYPE_UNKNOWN => Self::Unknown,
949 sys::NVML_BUS_TYPE_PCI => Self::Pci,
950 sys::NVML_BUS_TYPE_PCIE => Self::Pcie,
951 sys::NVML_BUS_TYPE_FPCI => Self::Fpci,
952 sys::NVML_BUS_TYPE_AGP => Self::Agp,
953 raw => Self::Other(raw),
954 }
955 }
956}
957
958#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
959pub enum PowerSource {
960 Ac,
961 Battery,
962 Undersized,
963 Other(u32),
964}
965
966impl PowerSource {
967 pub const fn from_raw(value: u32) -> Self {
968 match value {
969 sys::NVML_POWER_SOURCE_AC => Self::Ac,
970 sys::NVML_POWER_SOURCE_BATTERY => Self::Battery,
971 sys::NVML_POWER_SOURCE_UNDERSIZED => Self::Undersized,
972 raw => Self::Other(raw),
973 }
974 }
975}
976
977#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
978#[repr(u32)]
979pub enum EncoderType {
980 H264 = sys::nvmlEncoderType_t::NVML_ENCODER_QUERY_H264 as _,
981 Hevc = sys::nvmlEncoderType_t::NVML_ENCODER_QUERY_HEVC as _,
982 Av1 = sys::nvmlEncoderType_t::NVML_ENCODER_QUERY_AV1 as _,
983 Unknown = sys::nvmlEncoderType_t::NVML_ENCODER_QUERY_UNKNOWN as _,
984}
985
986impl_enum_conversion!(u32, sys::nvmlEncoderType_t, EncoderType);
987
988#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
989#[repr(u32)]
990pub enum RestrictedApi {
991 #[deprecated]
992 SetApplicationsClocks =
993 sys::nvmlRestrictedAPI_t::NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS as _,
994 SetAutoBoostedClocks =
995 sys::nvmlRestrictedAPI_t::NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS as _,
996 Count = sys::nvmlRestrictedAPI_t::NVML_RESTRICTED_API_COUNT as _,
997}
998
999impl_enum_conversion!(u32, sys::nvmlRestrictedAPI_t, RestrictedApi);
1000
1001#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1002#[repr(u32)]
1003pub enum AdaptiveClockInfoStatus {
1004 Disabled = sys::NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED,
1005 Enabled = sys::NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED,
1006}
1007
1008#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1009#[repr(u32)]
1010pub enum FanPolicy {
1011 TemperatureContinuousSw = sys::NVML_FAN_POLICY_TEMPERATURE_CONTINOUS_SW,
1012 Manual = sys::NVML_FAN_POLICY_MANUAL,
1013}
1014
1015#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1016#[repr(u32)]
1017pub enum FanState {
1018 Normal = sys::nvmlFanState_t::NVML_FAN_NORMAL as _,
1019 Failed = sys::nvmlFanState_t::NVML_FAN_FAILED as _,
1020}
1021
1022impl_enum_conversion!(u32, sys::nvmlFanState_t, FanState);
1023
1024#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1025#[repr(u32)]
1026pub enum CoolerControl {
1027 None = sys::nvmlCoolerControl_t::NVML_THERMAL_COOLER_SIGNAL_NONE as _,
1028 Toggle = sys::nvmlCoolerControl_t::NVML_THERMAL_COOLER_SIGNAL_TOGGLE as _,
1029 Variable = sys::nvmlCoolerControl_t::NVML_THERMAL_COOLER_SIGNAL_VARIABLE as _,
1030 Count = sys::nvmlCoolerControl_t::NVML_THERMAL_COOLER_SIGNAL_COUNT as _,
1031}
1032
1033impl_enum_conversion!(u32, sys::nvmlCoolerControl_t, CoolerControl);
1034
1035#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1036#[repr(u32)]
1037pub enum CoolerTarget {
1038 None = sys::nvmlCoolerTarget_t::NVML_THERMAL_COOLER_TARGET_NONE as _,
1039 Gpu = sys::nvmlCoolerTarget_t::NVML_THERMAL_COOLER_TARGET_GPU as _,
1040 Memory = sys::nvmlCoolerTarget_t::NVML_THERMAL_COOLER_TARGET_MEMORY as _,
1041 PowerSupply = sys::nvmlCoolerTarget_t::NVML_THERMAL_COOLER_TARGET_POWER_SUPPLY as _,
1042 GpuRelated = sys::nvmlCoolerTarget_t::NVML_THERMAL_COOLER_TARGET_GPU_RELATED as _,
1043}
1044
1045impl_enum_conversion!(u32, sys::nvmlCoolerTarget_t, CoolerTarget);
1046
1047#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1048#[repr(u32)]
1049pub enum FbcSessionType {
1050 Unknown = sys::nvmlFBCSessionType_t::NVML_FBC_SESSION_TYPE_UNKNOWN as _,
1051 ToSys = sys::nvmlFBCSessionType_t::NVML_FBC_SESSION_TYPE_TOSYS as _,
1052 Cuda = sys::nvmlFBCSessionType_t::NVML_FBC_SESSION_TYPE_CUDA as _,
1053 Vid = sys::nvmlFBCSessionType_t::NVML_FBC_SESSION_TYPE_VID as _,
1054 HwEnc = sys::nvmlFBCSessionType_t::NVML_FBC_SESSION_TYPE_HWENC as _,
1055}
1056
1057impl_enum_conversion!(u32, sys::nvmlFBCSessionType_t, FbcSessionType);
1058
1059#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1060#[repr(u32)]
1061pub enum DriverModel {
1062 Wddm = sys::nvmlDriverModel_t::NVML_DRIVER_WDDM as _,
1063 #[deprecated]
1064 Wdm = sys::nvmlDriverModel_t::NVML_DRIVER_WDM as _,
1065 Mcdm = sys::nvmlDriverModel_t::NVML_DRIVER_MCDM as _,
1066}
1067
1068impl_enum_conversion!(u32, sys::nvmlDriverModel_t, DriverModel);
1069
1070#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1071#[repr(u32)]
1072pub enum GpuOperationMode {
1073 AllOn = sys::nvmlGpuOperationMode_t::NVML_GOM_ALL_ON as _,
1074 Compute = sys::nvmlGpuOperationMode_t::NVML_GOM_COMPUTE as _,
1075 LowDp = sys::nvmlGpuOperationMode_t::NVML_GOM_LOW_DP as _,
1076}
1077
1078impl_enum_conversion!(u32, sys::nvmlGpuOperationMode_t, GpuOperationMode);
1079
1080#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1081#[repr(u32)]
1082pub enum MigMode {
1083 Disabled = sys::NVML_DEVICE_MIG_DISABLE,
1084 Enabled = sys::NVML_DEVICE_MIG_ENABLE,
1085}
1086
1087#[derive(Debug, Clone, PartialEq, Eq)]
1088pub struct MigModeActivation {
1089 pub status: Result<()>,
1090}
1091
1092impl MigModeActivation {
1093 pub fn from_raw(status: sys::nvmlReturn_t) -> Self {
1094 Self {
1095 status: if status == sys::nvmlReturn_t::NVML_SUCCESS {
1096 Ok(())
1097 } else {
1098 Err(status.into())
1099 },
1100 }
1101 }
1102}
1103
1104#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1105pub enum VirtualizationMode {
1106 None,
1107 Passthrough,
1108 Vgpu,
1109 HostVgpu,
1110 HostVsga,
1111 Other(u32),
1112}
1113
1114impl VirtualizationMode {
1115 pub const fn from_raw(value: u32) -> Self {
1116 match value {
1117 value
1118 if value
1119 == sys::nvmlGpuVirtualizationMode_t::NVML_GPU_VIRTUALIZATION_MODE_NONE
1120 as u32 =>
1121 {
1122 Self::None
1123 }
1124 value
1125 if value
1126 == sys::nvmlGpuVirtualizationMode_t::NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH
1127 as u32 =>
1128 {
1129 Self::Passthrough
1130 }
1131 value
1132 if value
1133 == sys::nvmlGpuVirtualizationMode_t::NVML_GPU_VIRTUALIZATION_MODE_VGPU
1134 as u32 =>
1135 {
1136 Self::Vgpu
1137 }
1138 value
1139 if value
1140 == sys::nvmlGpuVirtualizationMode_t::NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU
1141 as u32 =>
1142 {
1143 Self::HostVgpu
1144 }
1145 value
1146 if value
1147 == sys::nvmlGpuVirtualizationMode_t::NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA
1148 as u32 =>
1149 {
1150 Self::HostVsga
1151 }
1152 raw => Self::Other(raw),
1153 }
1154 }
1155}
1156
1157#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1158#[repr(u32)]
1159pub enum HostVgpuMode {
1160 NonSriov = sys::nvmlHostVgpuMode_t::NVML_HOST_VGPU_MODE_NON_SRIOV as _,
1161 Sriov = sys::nvmlHostVgpuMode_t::NVML_HOST_VGPU_MODE_SRIOV as _,
1162}
1163
1164impl_enum_conversion!(u32, sys::nvmlHostVgpuMode_t, HostVgpuMode);
1165
1166#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1167#[repr(u32)]
1168pub enum VgpuDriverCapability {
1169 HeterogeneousMultiVgpu =
1170 sys::nvmlVgpuDriverCapability_t::NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU as _,
1171 WarmUpdate = sys::nvmlVgpuDriverCapability_t::NVML_VGPU_DRIVER_CAP_WARM_UPDATE as _,
1172}
1173
1174impl_enum_conversion!(u32, sys::nvmlVgpuDriverCapability_t, VgpuDriverCapability);
1175
1176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1177#[repr(u32)]
1178pub enum VgpuVmIdType {
1179 DomainId = sys::nvmlVgpuVmIdType_t::NVML_VGPU_VM_ID_DOMAIN_ID as _,
1180 Uuid = sys::nvmlVgpuVmIdType_t::NVML_VGPU_VM_ID_UUID as _,
1181}
1182
1183impl_enum_conversion!(u32, sys::nvmlVgpuVmIdType_t, VgpuVmIdType);
1184
1185#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1186pub struct VgpuVmId {
1187 pub value: String,
1188 pub kind: VgpuVmIdType,
1189}
1190
1191#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1192pub struct VgpuLicenseExpiry {
1193 pub year: u32,
1194 pub month: u16,
1195 pub day: u16,
1196 pub hour: u16,
1197 pub minute: u16,
1198 pub second: u16,
1199 pub status: u8,
1200}
1201
1202#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1203pub struct VgpuLicenseInfo {
1204 pub is_licensed: bool,
1205 pub expiry: VgpuLicenseExpiry,
1206 pub current_state: u32,
1207}
1208
1209#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1210pub struct VgpuRuntimeState {
1211 pub size: u64,
1212}
1213
1214#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1215#[repr(u32)]
1216pub enum VgpuSchedulerPolicy {
1217 BestEffort = sys::NVML_VGPU_SCHEDULER_POLICY_BEST_EFFORT,
1218 EqualShare = sys::NVML_VGPU_SCHEDULER_POLICY_EQUAL_SHARE,
1219 FixedShare = sys::NVML_VGPU_SCHEDULER_POLICY_FIXED_SHARE,
1220}
1221
1222#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1223#[repr(u32)]
1224pub enum VgpuSchedulerArrMode {
1225 Default = sys::NVML_VGPU_SCHEDULER_ARR_DEFAULT,
1226 Disabled = sys::NVML_VGPU_SCHEDULER_ARR_DISABLE,
1227 Enabled = sys::NVML_VGPU_SCHEDULER_ARR_ENABLE,
1228}
1229
1230#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1231#[repr(u32)]
1232pub enum VgpuSchedulerEngine {
1233 Graphics = sys::NVML_VGPU_SCHEDULER_ENGINE_TYPE_GRAPHICS,
1234}
1235
1236#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1237pub struct VgpuSchedulerParams {
1238 pub timeslice: u32,
1239 pub avg_factor: Option<u32>,
1240}
1241
1242#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1243pub struct VgpuSchedulerState {
1244 pub engine: VgpuSchedulerEngine,
1245 pub policy: VgpuSchedulerPolicy,
1246 pub arr_mode: VgpuSchedulerArrMode,
1247 pub params: VgpuSchedulerParams,
1248}
1249
1250#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1251pub struct VgpuSchedulerLogEntry {
1252 pub timestamp: u64,
1253 pub time_run_total: u64,
1254 pub time_run: u64,
1255 pub sw_runlist_id: u32,
1256 pub target_time_slice: u64,
1257 pub cumulative_preemption_time: u64,
1258}
1259
1260#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1261pub struct VgpuSchedulerLog {
1262 pub state: VgpuSchedulerState,
1263 pub entries: Vec<VgpuSchedulerLogEntry>,
1264}
1265
1266#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1267pub struct DeviceVgpuCapability(sys::nvmlDeviceVgpuCapability_t);
1268
1269impl From<DeviceVgpuCapability> for sys::nvmlDeviceVgpuCapability_t {
1270 fn from(value: DeviceVgpuCapability) -> Self {
1271 value.0
1272 }
1273}
1274
1275impl DeviceVgpuCapability {
1276 pub const DEVICE_STREAMING: Self =
1277 Self(sys::nvmlDeviceVgpuCapability_t::NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING);
1278 pub const WARM_UPDATE: Self =
1279 Self(sys::nvmlDeviceVgpuCapability_t::NVML_DEVICE_VGPU_CAP_WARM_UPDATE);
1280}
1281
1282#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1283pub struct VgpuTypeCapability(sys::nvmlVgpuCapability_t);
1284
1285impl From<VgpuTypeCapability> for sys::nvmlVgpuCapability_t {
1286 fn from(value: VgpuTypeCapability) -> Self {
1287 value.0
1288 }
1289}
1290
1291impl VgpuTypeCapability {
1292 pub const NVLINK_P2P: Self = Self(sys::nvmlVgpuCapability_t::NVML_VGPU_CAP_NVLINK_P2P);
1293 pub const GPUDIRECT: Self = Self(sys::nvmlVgpuCapability_t::NVML_VGPU_CAP_GPUDIRECT);
1294}
1295
1296#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1297#[repr(u32)]
1298pub enum ComputeInstanceEngineProfile {
1299 Shared = sys::NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED,
1300 Count = sys::NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT,
1301}
1302
1303#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1304pub struct CurrentPending<T> {
1305 pub current: T,
1306 pub pending: T,
1307}
1308
1309#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1310pub struct GspFirmwareMode {
1311 pub enabled: bool,
1312 pub default_mode: bool,
1313}
1314
1315#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1316pub struct AutoBoostClocks {
1317 pub enabled: EnableState,
1318 pub default_enabled: EnableState,
1319}
1320
1321#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1322pub struct ComputeCapability {
1323 pub major: i32,
1324 pub minor: i32,
1325}
1326
1327#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1328pub struct Utilization {
1329 pub gpu: u32,
1330 pub memory: u32,
1331}
1332
1333#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1334pub struct MemoryInfo {
1335 pub total: u64,
1336 pub reserved: u64,
1337 pub free: u64,
1338 pub used: u64,
1339}
1340
1341#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1342pub struct PciInfo {
1343 pub bus_id_legacy: String,
1344 pub bus_id: String,
1345 pub domain: u32,
1346 pub bus: u32,
1347 pub device: u32,
1348 pub pci_device_id: u32,
1349 pub pci_subsystem_id: u32,
1350}
1351
1352#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1353pub struct PciInfoExt {
1354 pub bus_id: String,
1355 pub domain: u32,
1356 pub bus: u32,
1357 pub device: u32,
1358 pub pci_device_id: u32,
1359 pub pci_subsystem_id: u32,
1360 pub base_class: u32,
1361 pub sub_class: u32,
1362}
1363
1364#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1365pub struct ExcludedDeviceInfo {
1366 pub pci_info: PciInfo,
1367 pub uuid: String,
1368}
1369
1370#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1371pub struct HwbcEntry {
1372 pub hwbc_id: u32,
1373 pub firmware_version: String,
1374}
1375
1376#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1377pub struct GpmSupport {
1378 pub is_supported_device: bool,
1379}
1380
1381#[derive(Debug, Clone, PartialEq)]
1382pub struct GpmMetric {
1383 pub metric_id: GpmMetricId,
1384 pub result: Result<f64>,
1385 pub short_name: String,
1386 pub long_name: String,
1387 pub unit: String,
1388}
1389
1390#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1391#[repr(u32)]
1392pub enum LedColor {
1393 Green = sys::nvmlLedColor_t::NVML_LED_COLOR_GREEN as _,
1394 Amber = sys::nvmlLedColor_t::NVML_LED_COLOR_AMBER as _,
1395}
1396
1397impl_enum_conversion!(u32, sys::nvmlLedColor_t, LedColor);
1398
1399#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1400pub struct LedState {
1401 pub cause: String,
1402 pub color: LedColor,
1403}
1404
1405#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1406pub struct UnitInfo {
1407 pub name: String,
1408 pub id: String,
1409 pub serial: String,
1410 pub firmware_version: String,
1411}
1412
1413#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1414pub struct PsuInfo {
1415 pub state: String,
1416 pub current: u32,
1417 pub voltage: u32,
1418 pub power: u32,
1419}
1420
1421#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1422pub struct UnitFanInfo {
1423 pub speed: u32,
1424 pub state: FanState,
1425}
1426
1427#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1428pub struct UnitFanSpeeds {
1429 pub fans: Vec<UnitFanInfo>,
1430}
1431
1432#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1433#[repr(u32)]
1434pub enum UnitTemperatureType {
1435 Intake = 0,
1436 Exhaust = 1,
1437 Board = 2,
1438}
1439
1440#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1441pub struct UnitTemperature {
1442 pub kind: UnitTemperatureType,
1443 pub temperature: u32,
1444}
1445
1446#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1447pub struct PowerLimits {
1448 pub min: u32,
1449 pub max: u32,
1450}
1451
1452#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1453#[deprecated]
1454pub struct EccErrorCounts {
1455 pub l1_cache: u64,
1456 pub l2_cache: u64,
1457 pub device_memory: u64,
1458 pub register_file: u64,
1459}
1460
1461#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1462pub struct ViolationTime {
1463 pub reference_time: u64,
1464 pub violation_time: u64,
1465}
1466
1467#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1468pub struct RetiredPage {
1469 pub address: u64,
1470 pub timestamp: Option<u64>,
1471}
1472
1473#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1474pub struct RemappedRows {
1475 pub corrected: u32,
1476 pub uncorrected: u32,
1477 pub pending: bool,
1478 pub failure_occurred: bool,
1479}
1480
1481#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1482pub struct RowRemapperHistogram {
1483 pub max: u32,
1484 pub high: u32,
1485 pub partial: u32,
1486 pub low: u32,
1487 pub none: u32,
1488}
1489
1490#[derive(Debug, Clone, Copy, PartialEq)]
1491pub enum FieldValue {
1492 Double(f64),
1493 UnsignedInt(u32),
1494 UnsignedLong(u64),
1495 UnsignedLongLong(u64),
1496 SignedLongLong(i64),
1497 SignedInt(i32),
1498 UnsignedShort(u16),
1499}
1500
1501#[derive(Debug, Clone, PartialEq)]
1502pub struct FieldSample {
1503 pub field: FieldId,
1504 pub scope_id: u32,
1505 pub timestamp: i64,
1506 pub latency_usec: i64,
1507 pub result: Result<FieldValue>,
1508}
1509
1510#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1511pub struct AccountingStats {
1512 pub gpu_utilization: u32,
1513 pub memory_utilization: u32,
1514 pub max_memory_usage: u64,
1515 pub time: u64,
1516 pub start_time: u64,
1517 pub is_running: bool,
1518}
1519
1520#[derive(Debug, Clone, Copy, PartialEq)]
1521pub struct Sample {
1522 pub timestamp: u64,
1523 pub value: FieldValue,
1524}
1525
1526#[derive(Debug, Clone, PartialEq)]
1527pub struct Samples {
1528 pub value_type: FieldValueType,
1529 pub samples: Vec<Sample>,
1530}
1531
1532#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1533pub struct ProcessDetail {
1534 pub pid: Pid,
1535 pub used_gpu_memory: Option<u64>,
1536 pub gpu_instance_id: u32,
1537 pub compute_instance_id: u32,
1538 pub used_gpu_cc_protected_memory: Option<u64>,
1539}
1540
1541#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1542pub struct EventData {
1543 pub device: Option<Device>,
1544 pub event_types: EventTypes,
1545 pub event_data: u64,
1546 pub gpu_instance_id: u32,
1547 pub compute_instance_id: u32,
1548}
1549
1550#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1551pub struct SystemEventData {
1552 pub event_types: SystemEventTypes,
1553 pub gpu_id: u32,
1554}
1555
1556#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1557pub struct Bar1MemoryInfo {
1558 pub total: u64,
1559 pub free: u64,
1560 pub used: u64,
1561}
1562
1563#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1564pub struct UtilizationCounter {
1565 pub utilization: u32,
1566 pub sampling_period_us: u32,
1567}
1568
1569#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1570pub struct CurrentClockFreqs {
1571 pub value: String,
1572}
1573
1574#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1575pub struct PerformanceModes {
1576 pub value: String,
1577}
1578
1579#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1580pub struct ClockRange {
1581 pub min: u32,
1582 pub max: u32,
1583}
1584
1585#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1586pub struct ClockRangeI32 {
1587 pub min: i32,
1588 pub max: i32,
1589}
1590
1591#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1592pub struct ClockOffset {
1593 pub kind: ClockType,
1594 pub pstate: PerformanceState,
1595 pub clock_offset_mhz: i32,
1596 pub min_clock_offset_mhz: i32,
1597 pub max_clock_offset_mhz: i32,
1598}
1599
1600#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1601pub struct MarginTemperature {
1602 pub value: i32,
1603}
1604
1605#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1606pub struct BbxFlushTime {
1607 pub timestamp: u64,
1608 pub duration_us: u64,
1609}
1610
1611#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1612pub struct DeviceAttributes {
1613 pub multiprocessor_count: u32,
1614 pub shared_copy_engine_count: u32,
1615 pub shared_decoder_count: u32,
1616 pub shared_encoder_count: u32,
1617 pub shared_jpeg_count: u32,
1618 pub shared_ofa_count: u32,
1619 pub gpu_instance_slice_count: u32,
1620 pub compute_instance_slice_count: u32,
1621 pub memory_size_mb: u64,
1622}
1623
1624#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1625pub struct PlatformInfo {
1626 pub ib_guid: [u8; 16],
1627 pub chassis_serial_number: [u8; 16],
1628 pub slot_number: u8,
1629 pub tray_index: u8,
1630 pub host_id: u8,
1631 pub peer_type: u8,
1632 pub module_id: u8,
1633}
1634
1635#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1636pub struct Pdi {
1637 pub value: u64,
1638}
1639
1640#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1641pub struct C2cModeInfo {
1642 pub enabled: bool,
1643}
1644
1645#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1646pub struct ClkMonFaultInfo {
1647 pub clock_api_domain: u32,
1648 pub clock_domain_fault_mask: u32,
1649}
1650
1651#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1652pub struct ClkMonStatus {
1653 pub global_status: bool,
1654 pub faults: Vec<ClkMonFaultInfo>,
1655}
1656
1657#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1658pub struct EccSramErrorStatus {
1659 pub aggregate_unc_parity: u64,
1660 pub aggregate_unc_secded: u64,
1661 pub aggregate_corrected: u64,
1662 pub volatile_unc_parity: u64,
1663 pub volatile_unc_secded: u64,
1664 pub volatile_corrected: u64,
1665 pub aggregate_unc_bucket_l2: u64,
1666 pub aggregate_unc_bucket_sm: u64,
1667 pub aggregate_unc_bucket_pcie: u64,
1668 pub aggregate_unc_bucket_mcu: u64,
1669 pub aggregate_unc_bucket_other: u64,
1670 pub threshold_exceeded: bool,
1671}
1672
1673#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1674pub struct EccSramUniqueUncorrectedErrorEntry {
1675 pub unit: u32,
1676 pub location: u32,
1677 pub sublocation: u32,
1678 pub extlocation: u32,
1679 pub address: u32,
1680 pub is_parity: bool,
1681 pub count: u32,
1682}
1683
1684#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1685pub struct EccSramUniqueUncorrectedErrorCounts {
1686 pub entries: Vec<EccSramUniqueUncorrectedErrorEntry>,
1687}
1688
1689#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1690pub struct ThermalSensorSetting {
1691 pub controller: ThermalController,
1692 pub default_min_temp: i32,
1693 pub default_max_temp: i32,
1694 pub current_temp: i32,
1695 pub target: ThermalTarget,
1696}
1697
1698#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1699pub struct ThermalSettings {
1700 pub sensors: Vec<ThermalSensorSetting>,
1701}
1702
1703#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1704pub struct BridgeChipInfo {
1705 pub kind: BridgeChipType,
1706 pub firmware_version: u32,
1707}
1708
1709#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1710pub struct BridgeChipHierarchy {
1711 pub bridge_chips: Vec<BridgeChipInfo>,
1712}
1713
1714#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1715pub struct RepairStatus {
1716 pub channel_repair_pending: bool,
1717 pub tpc_repair_pending: bool,
1718}
1719
1720#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1721#[repr(u32)]
1722pub enum GpuFabricState {
1723 NotSupported = sys::NVML_GPU_FABRIC_STATE_NOT_SUPPORTED,
1724 NotStarted = sys::NVML_GPU_FABRIC_STATE_NOT_STARTED,
1725 InProgress = sys::NVML_GPU_FABRIC_STATE_IN_PROGRESS,
1726 Completed = sys::NVML_GPU_FABRIC_STATE_COMPLETED,
1727}
1728
1729#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1730#[repr(u32)]
1731pub enum GpuFabricHealthSummary {
1732 NotSupported = sys::NVML_GPU_FABRIC_HEALTH_SUMMARY_NOT_SUPPORTED,
1733 Healthy = sys::NVML_GPU_FABRIC_HEALTH_SUMMARY_HEALTHY,
1734 Unhealthy = sys::NVML_GPU_FABRIC_HEALTH_SUMMARY_UNHEALTHY,
1735 LimitedCapacity = sys::NVML_GPU_FABRIC_HEALTH_SUMMARY_LIMITED_CAPACITY,
1736}
1737
1738#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1739#[repr(u32)]
1740pub enum GpuFabricBooleanState {
1741 NotSupported = sys::NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED,
1742 True = sys::NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE,
1743 False = sys::NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE,
1744}
1745
1746#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
1747#[repr(u32)]
1748pub enum GpuFabricIncorrectConfiguration {
1749 NotSupported = sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NOT_SUPPORTED,
1750 None = sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NONE,
1751 IncorrectSysguid = sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_SYSGUID,
1752 IncorrectChassisSerialNumber =
1753 sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_CHASSIS_SN,
1754 NoPartition = sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NO_PARTITION,
1755 InsufficientNvlinks =
1756 sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INSUFFICIENT_NVLINKS,
1757 IncompatibleGpuFirmware =
1758 sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCOMPATIBLE_GPU_FW,
1759 InvalidLocation = sys::NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INVALID_LOCATION,
1760}
1761
1762#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1763pub struct GpuFabricHealth {
1764 pub degraded_bandwidth: GpuFabricBooleanState,
1765 pub route_recovery: GpuFabricBooleanState,
1766 pub route_unhealthy: GpuFabricBooleanState,
1767 pub access_timeout_recovery: GpuFabricBooleanState,
1768 pub incorrect_configuration: GpuFabricIncorrectConfiguration,
1769 pub raw_mask: u32,
1770}
1771
1772#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1773pub struct GpuFabricInfo {
1774 pub cluster_uuid: [u8; sys::NVML_GPU_FABRIC_UUID_LEN as usize],
1775 pub status_code: u32,
1776 pub clique_id: u32,
1777 pub state: GpuFabricState,
1778 pub health: GpuFabricHealth,
1779 pub health_summary: GpuFabricHealthSummary,
1780}
1781
1782#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1783pub struct DynamicPstateInfo {
1784 pub domain: u32,
1785 pub percentage: u32,
1786 pub increase_threshold: u32,
1787 pub decrease_threshold: u32,
1788}
1789
1790#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1791pub struct DynamicPstatesInfo {
1792 pub flags: u32,
1793 pub utilization: Vec<DynamicPstateInfo>,
1794}
1795
1796#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1797pub struct NvLinkUtilizationControl {
1798 pub units: NvLinkUtilizationCountUnits,
1799 pub packet_filter: NvLinkPacketTypes,
1800}
1801
1802#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1803pub struct NvLinkUtilizationCounter {
1804 pub rx: u64,
1805 pub tx: u64,
1806}
1807
1808#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1809pub struct NvLinkFirmwareVersion {
1810 pub ucode_type: u8,
1811 pub major: u32,
1812 pub minor: u32,
1813 pub sub_minor: u32,
1814}
1815
1816#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1817pub struct NvLinkInfo {
1818 pub nvle_enabled: bool,
1819 pub firmware_versions: Vec<NvLinkFirmwareVersion>,
1820}
1821
1822#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1823pub struct NvLinkBwMode {
1824 pub is_best: bool,
1825 pub mode: u8,
1826}
1827
1828#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1829pub struct NvLinkSupportedBwModes {
1830 pub modes: Vec<u8>,
1831}
1832
1833#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1834pub struct EncoderStats {
1835 pub session_count: u32,
1836 pub average_fps: u32,
1837 pub average_latency_us: u32,
1838}
1839
1840#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1841pub struct FanSpeedInfo {
1842 pub fan: u32,
1843 pub speed: u32,
1844}
1845
1846#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1847pub struct MinMaxFanSpeed {
1848 pub min: u32,
1849 pub max: u32,
1850}
1851
1852#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1853pub struct TemperatureInfo {
1854 pub sensor: TemperatureSensor,
1855 pub temperature: i32,
1856}
1857
1858#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1859pub struct CoolerInfo {
1860 pub index: u32,
1861 pub signal_type: CoolerControl,
1862 pub target: CoolerTarget,
1863}
1864
1865#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1866pub struct GpuInstanceProfileInfo {
1867 pub id: u32,
1868 pub slice_count: u32,
1869 pub instance_count: u32,
1870 pub multiprocessor_count: u32,
1871 pub copy_engine_count: u32,
1872 pub decoder_count: u32,
1873 pub encoder_count: u32,
1874 pub jpeg_count: u32,
1875 pub ofa_count: u32,
1876 pub memory_size_mb: u64,
1877 pub name: String,
1878 pub capabilities: GpuInstanceProfileCapabilities,
1879}
1880
1881#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1883pub struct GpuInstanceInfo {
1884 pub device: Device,
1886 pub id: u32,
1888 pub profile_id: u32,
1890 pub placement: GpuInstancePlacement,
1892}
1893
1894#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1895pub struct GpuInstancePlacement {
1896 pub start: u32,
1897 pub size: u32,
1898}
1899
1900#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1901pub struct ComputeInstanceProfileInfo {
1902 pub id: u32,
1903 pub slice_count: u32,
1904 pub instance_count: u32,
1905 pub multiprocessor_count: u32,
1906 pub shared_copy_engine_count: u32,
1907 pub shared_decoder_count: u32,
1908 pub shared_encoder_count: u32,
1909 pub shared_jpeg_count: u32,
1910 pub shared_ofa_count: u32,
1911 pub name: String,
1912 pub capabilities: ComputeInstanceProfileCapabilities,
1913}
1914
1915#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1917pub struct ComputeInstanceInfo {
1918 pub device: Device,
1920 pub gpu_instance: GpuInstance,
1922 pub id: u32,
1924 pub profile_id: u32,
1926 pub placement: ComputeInstancePlacement,
1928}
1929
1930#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1931pub struct ComputeInstancePlacement {
1932 pub start: u32,
1933 pub size: u32,
1934}
1935
1936#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1937pub struct EncoderSessionInfo {
1938 pub session_id: u32,
1939 pub pid: Pid,
1940 pub vgpu_instance: u32,
1941 pub codec_type: EncoderType,
1942 pub horizontal_resolution: u32,
1943 pub vertical_resolution: u32,
1944 pub average_fps: u32,
1945 pub average_latency_us: u32,
1946}
1947
1948#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1949pub struct FbcStats {
1950 pub session_count: u32,
1951 pub average_fps: u32,
1952 pub average_latency_us: u32,
1953}
1954
1955#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1956pub struct FbcSessionInfo {
1957 pub session_id: u32,
1958 pub pid: Pid,
1959 pub vgpu_instance: u32,
1960 pub display_ordinal: u32,
1961 pub session_type: FbcSessionType,
1962 pub session_flags: u32,
1963 pub max_horizontal_resolution: u32,
1964 pub max_vertical_resolution: u32,
1965 pub horizontal_resolution: u32,
1966 pub vertical_resolution: u32,
1967 pub average_fps: u32,
1968 pub average_latency_us: u32,
1969}
1970
1971#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1972pub struct ProcessInfo {
1973 pub pid: Pid,
1974 pub used_gpu_memory: Option<u64>,
1975 pub gpu_instance_id: u32,
1976 pub compute_instance_id: u32,
1977}
1978
1979#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1980pub struct ProcessUtilizationSample {
1981 pub pid: Pid,
1982 pub timestamp: u64,
1983 pub sm_utilization: u32,
1984 pub memory_utilization: u32,
1985 pub encoder_utilization: u32,
1986 pub decoder_utilization: u32,
1987}
1988
1989#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1990pub struct ProcessUtilizationInfo {
1991 pub timestamp: u64,
1992 pub pid: Pid,
1993 pub sm_utilization: u32,
1994 pub memory_utilization: u32,
1995 pub encoder_utilization: u32,
1996 pub decoder_utilization: u32,
1997 pub jpg_utilization: u32,
1998 pub ofa_utilization: u32,
1999}
2000
2001impl From<sys::nvmlUtilization_t> for Utilization {
2002 fn from(value: sys::nvmlUtilization_t) -> Self {
2003 Self {
2004 gpu: value.gpu,
2005 memory: value.memory,
2006 }
2007 }
2008}
2009
2010impl From<sys::nvmlMemory_v2_t> for MemoryInfo {
2011 fn from(value: sys::nvmlMemory_v2_t) -> Self {
2012 Self {
2013 total: value.total,
2014 reserved: value.reserved,
2015 free: value.free,
2016 used: value.used,
2017 }
2018 }
2019}
2020
2021impl From<sys::nvmlPciInfo_t> for PciInfo {
2022 fn from(value: sys::nvmlPciInfo_t) -> Self {
2023 Self {
2024 bus_id_legacy: string_from_c_chars(&value.busIdLegacy),
2025 bus_id: string_from_c_chars(&value.busId),
2026 domain: value.domain,
2027 bus: value.bus,
2028 device: value.device,
2029 pci_device_id: value.pciDeviceId,
2030 pci_subsystem_id: value.pciSubSystemId,
2031 }
2032 }
2033}
2034
2035impl From<sys::nvmlPciInfoExt_t> for PciInfoExt {
2036 fn from(value: sys::nvmlPciInfoExt_t) -> Self {
2037 Self {
2038 bus_id: string_from_c_chars(&value.busId),
2039 domain: value.domain,
2040 bus: value.bus,
2041 device: value.device,
2042 pci_device_id: value.pciDeviceId,
2043 pci_subsystem_id: value.pciSubSystemId,
2044 base_class: value.baseClass,
2045 sub_class: value.subClass,
2046 }
2047 }
2048}
2049
2050impl From<sys::nvmlExcludedDeviceInfo_t> for ExcludedDeviceInfo {
2051 fn from(value: sys::nvmlExcludedDeviceInfo_t) -> Self {
2052 Self {
2053 pci_info: value.pciInfo.into(),
2054 uuid: string_from_c_chars(&value.uuid),
2055 }
2056 }
2057}
2058
2059impl From<sys::nvmlHwbcEntry_t> for HwbcEntry {
2060 fn from(value: sys::nvmlHwbcEntry_t) -> Self {
2061 Self {
2062 hwbc_id: value.hwbcId,
2063 firmware_version: string_from_c_chars(&value.firmwareVersion),
2064 }
2065 }
2066}
2067
2068impl From<sys::nvmlGpuInstanceProfileInfo_v3_t> for GpuInstanceProfileInfo {
2069 fn from(value: sys::nvmlGpuInstanceProfileInfo_v3_t) -> Self {
2070 Self {
2071 id: value.id,
2072 slice_count: value.sliceCount,
2073 instance_count: value.instanceCount,
2074 multiprocessor_count: value.multiprocessorCount,
2075 copy_engine_count: value.copyEngineCount,
2076 decoder_count: value.decoderCount,
2077 encoder_count: value.encoderCount,
2078 jpeg_count: value.jpegCount,
2079 ofa_count: value.ofaCount,
2080 memory_size_mb: value.memorySizeMB,
2081 name: string_from_c_chars(&value.name),
2082 capabilities: GpuInstanceProfileCapabilities::from_bits_retain(value.capabilities),
2083 }
2084 }
2085}
2086
2087impl From<sys::nvmlGpuInstanceInfo_t> for GpuInstanceInfo {
2088 fn from(value: sys::nvmlGpuInstanceInfo_t) -> Self {
2089 Self {
2090 device: unsafe { Device::from_raw(value.device) },
2091 id: value.id,
2092 profile_id: value.profileId,
2093 placement: value.placement.into(),
2094 }
2095 }
2096}
2097
2098impl From<sys::nvmlGpuInstancePlacement_t> for GpuInstancePlacement {
2099 fn from(value: sys::nvmlGpuInstancePlacement_t) -> Self {
2100 Self {
2101 start: value.start,
2102 size: value.size,
2103 }
2104 }
2105}
2106
2107impl From<GpuInstancePlacement> for sys::nvmlGpuInstancePlacement_t {
2108 fn from(value: GpuInstancePlacement) -> Self {
2109 Self {
2110 start: value.start,
2111 size: value.size,
2112 }
2113 }
2114}
2115
2116impl From<sys::nvmlComputeInstanceProfileInfo_v3_t> for ComputeInstanceProfileInfo {
2117 fn from(value: sys::nvmlComputeInstanceProfileInfo_v3_t) -> Self {
2118 Self {
2119 id: value.id,
2120 slice_count: value.sliceCount,
2121 instance_count: value.instanceCount,
2122 multiprocessor_count: value.multiprocessorCount,
2123 shared_copy_engine_count: value.sharedCopyEngineCount,
2124 shared_decoder_count: value.sharedDecoderCount,
2125 shared_encoder_count: value.sharedEncoderCount,
2126 shared_jpeg_count: value.sharedJpegCount,
2127 shared_ofa_count: value.sharedOfaCount,
2128 name: string_from_c_chars(&value.name),
2129 capabilities: ComputeInstanceProfileCapabilities::from_bits_retain(value.capabilities),
2130 }
2131 }
2132}
2133
2134impl From<sys::nvmlComputeInstanceInfo_t> for ComputeInstanceInfo {
2135 fn from(value: sys::nvmlComputeInstanceInfo_t) -> Self {
2136 Self {
2137 device: unsafe { Device::from_raw(value.device) },
2138 gpu_instance: unsafe { GpuInstance::from_raw(value.gpuInstance) },
2139 id: value.id,
2140 profile_id: value.profileId,
2141 placement: value.placement.into(),
2142 }
2143 }
2144}
2145
2146impl From<sys::nvmlComputeInstancePlacement_t> for ComputeInstancePlacement {
2147 fn from(value: sys::nvmlComputeInstancePlacement_t) -> Self {
2148 Self {
2149 start: value.start,
2150 size: value.size,
2151 }
2152 }
2153}
2154
2155impl From<ComputeInstancePlacement> for sys::nvmlComputeInstancePlacement_t {
2156 fn from(value: ComputeInstancePlacement) -> Self {
2157 Self {
2158 start: value.start,
2159 size: value.size,
2160 }
2161 }
2162}
2163
2164impl From<sys::nvmlVgpuPlacementId_t> for VgpuPlacementId {
2165 fn from(value: sys::nvmlVgpuPlacementId_t) -> Self {
2166 Self(value.placementId)
2167 }
2168}
2169
2170impl From<sys::nvmlVgpuVersion_t> for VgpuVersion {
2171 fn from(value: sys::nvmlVgpuVersion_t) -> Self {
2172 Self {
2173 min: value.minVersion,
2174 max: value.maxVersion,
2175 }
2176 }
2177}
2178
2179impl From<VgpuVersion> for sys::nvmlVgpuVersion_t {
2180 fn from(value: VgpuVersion) -> Self {
2181 Self {
2182 minVersion: value.min,
2183 maxVersion: value.max,
2184 }
2185 }
2186}
2187
2188impl From<sys::nvmlVgpuPgpuCompatibility_t> for VgpuCompatibility {
2189 fn from(value: sys::nvmlVgpuPgpuCompatibility_t) -> Self {
2190 Self {
2191 vm_compatibility: VgpuVmCompatibility::from_bits_retain(
2192 value.vgpuVmCompatibility as u32,
2193 ),
2194 limit_code: VgpuPgpuCompatibilityLimitCode::from_bits_retain(
2195 value.compatibilityLimitCode as u32,
2196 ),
2197 }
2198 }
2199}
2200
2201impl VgpuMetadata {
2202 pub(crate) fn from_raw(raw: &sys::nvmlVgpuMetadata_t, opaque_data: Vec<u8>) -> Self {
2203 Self {
2204 version: raw.version,
2205 revision: raw.revision,
2206 guest_info_state: raw.guestInfoState.into(),
2207 guest_driver_version: string_from_c_chars(&raw.guestDriverVersion),
2208 host_driver_version: string_from_c_chars(&raw.hostDriverVersion),
2209 virtualization_caps: raw.vgpuVirtualizationCaps,
2210 guest_vgpu_version: raw.guestVgpuVersion,
2211 opaque_data,
2212 }
2213 }
2214
2215 pub(crate) fn encode_raw(&self) -> Vec<u8> {
2216 let opaque_offset = mem::offset_of!(sys::nvmlVgpuMetadata_t, opaqueData);
2217 let len = max(
2218 size_of::<sys::nvmlVgpuMetadata_t>(),
2219 opaque_offset.saturating_add(self.opaque_data.len()),
2220 );
2221 let mut raw = vec![0u8; len];
2222 let metadata = unsafe { &mut *raw.as_mut_ptr().cast::<sys::nvmlVgpuMetadata_t>() };
2223 metadata.version = self.version;
2224 metadata.revision = self.revision;
2225 metadata.guestInfoState = self.guest_info_state.into();
2226 metadata.vgpuVirtualizationCaps = self.virtualization_caps;
2227 metadata.guestVgpuVersion = self.guest_vgpu_version;
2228 metadata.opaqueDataSize = self.opaque_data.len() as u32;
2229
2230 copy_string_to_c_chars(&mut metadata.guestDriverVersion, &self.guest_driver_version);
2231 copy_string_to_c_chars(&mut metadata.hostDriverVersion, &self.host_driver_version);
2232 raw[opaque_offset..opaque_offset + self.opaque_data.len()]
2233 .copy_from_slice(&self.opaque_data);
2234 raw
2235 }
2236}
2237
2238impl PgpuMetadata {
2239 pub(crate) fn from_raw(raw: &sys::nvmlVgpuPgpuMetadata_t, opaque_data: Vec<u8>) -> Self {
2240 Self {
2241 version: raw.version,
2242 revision: raw.revision,
2243 host_driver_version: string_from_c_chars(&raw.hostDriverVersion),
2244 virtualization_caps: raw.pgpuVirtualizationCaps,
2245 host_supported_vgpu_range: raw.hostSupportedVgpuRange.into(),
2246 opaque_data,
2247 }
2248 }
2249
2250 pub(crate) fn encode_raw(&self) -> Vec<u8> {
2251 let opaque_offset = mem::offset_of!(sys::nvmlVgpuPgpuMetadata_t, opaqueData);
2252 let len = max(
2253 size_of::<sys::nvmlVgpuPgpuMetadata_t>(),
2254 opaque_offset.saturating_add(self.opaque_data.len()),
2255 );
2256 let mut raw = vec![0u8; len];
2257 let metadata = unsafe { &mut *raw.as_mut_ptr().cast::<sys::nvmlVgpuPgpuMetadata_t>() };
2258 metadata.version = self.version;
2259 metadata.revision = self.revision;
2260 metadata.pgpuVirtualizationCaps = self.virtualization_caps;
2261 metadata.hostSupportedVgpuRange = self.host_supported_vgpu_range.into();
2262 metadata.opaqueDataSize = self.opaque_data.len() as u32;
2263
2264 copy_string_to_c_chars(&mut metadata.hostDriverVersion, &self.host_driver_version);
2265 raw[opaque_offset..opaque_offset + self.opaque_data.len()]
2266 .copy_from_slice(&self.opaque_data);
2267 raw
2268 }
2269}
2270
2271impl From<sys::nvmlVgpuSchedulerLogEntry_t> for VgpuSchedulerLogEntry {
2272 fn from(value: sys::nvmlVgpuSchedulerLogEntry_t) -> Self {
2273 Self {
2274 timestamp: value.timestamp,
2275 time_run_total: value.timeRunTotal,
2276 time_run: value.timeRun,
2277 sw_runlist_id: value.swRunlistId,
2278 target_time_slice: value.targetTimeSlice,
2279 cumulative_preemption_time: value.cumulativePreemptionTime,
2280 }
2281 }
2282}
2283
2284impl From<sys::nvmlVgpuSchedulerLogEntry_v2_t> for VgpuSchedulerLogEntry {
2285 fn from(value: sys::nvmlVgpuSchedulerLogEntry_v2_t) -> Self {
2286 Self {
2287 timestamp: value.timestamp,
2288 time_run_total: value.timeRunTotal,
2289 time_run: value.timeRun,
2290 sw_runlist_id: value.swRunlistId,
2291 target_time_slice: value.targetTimeSlice,
2292 cumulative_preemption_time: value.cumulativePreemptionTime,
2293 }
2294 }
2295}
2296
2297impl From<sys::nvmlVgpuLicenseExpiry_t> for VgpuLicenseExpiry {
2298 fn from(value: sys::nvmlVgpuLicenseExpiry_t) -> Self {
2299 Self {
2300 year: value.year,
2301 month: value.month,
2302 day: value.day,
2303 hour: value.hour,
2304 minute: value.min,
2305 second: value.sec,
2306 status: value.status,
2307 }
2308 }
2309}
2310
2311impl From<sys::nvmlVgpuLicenseInfo_t> for VgpuLicenseInfo {
2312 fn from(value: sys::nvmlVgpuLicenseInfo_t) -> Self {
2313 Self {
2314 is_licensed: value.isLicensed != 0,
2315 expiry: value.licenseExpiry.into(),
2316 current_state: value.currentState,
2317 }
2318 }
2319}
2320
2321impl From<sys::nvmlVgpuRuntimeState_t> for VgpuRuntimeState {
2322 fn from(value: sys::nvmlVgpuRuntimeState_t) -> Self {
2323 Self { size: value.size }
2324 }
2325}
2326
2327impl VgpuSchedulerState {
2328 pub(crate) fn from_raw(engine: sys::nvmlVgpuSchedulerStateInfo_v2_t) -> Result<Self> {
2329 let avg_factor = (engine.avgFactor != 0).then_some(engine.avgFactor);
2330 let arr_mode = if avg_factor.is_some() {
2331 VgpuSchedulerArrMode::Enabled
2332 } else {
2333 VgpuSchedulerArrMode::Default
2334 };
2335
2336 Ok(Self {
2337 engine: try_from_nvml_enum("vgpu scheduler engine", engine.engineId)?,
2338 policy: try_from_nvml_enum("vgpu scheduler policy", engine.schedulerPolicy)?,
2339 arr_mode,
2340 params: VgpuSchedulerParams {
2341 timeslice: engine.timeslice,
2342 avg_factor,
2343 },
2344 })
2345 }
2346}
2347
2348impl VgpuSchedulerLog {
2349 pub(crate) fn from_raw(info: sys::nvmlVgpuSchedulerLogInfo_v2_t) -> Result<Self> {
2350 let avg_factor = (info.avgFactor != 0).then_some(info.avgFactor);
2351 let arr_mode = if avg_factor.is_some() {
2352 VgpuSchedulerArrMode::Enabled
2353 } else {
2354 VgpuSchedulerArrMode::Default
2355 };
2356
2357 let entries = info.logEntries[..info.entriesCount as usize]
2358 .iter()
2359 .copied()
2360 .map(Into::into)
2361 .collect();
2362
2363 Ok(Self {
2364 state: VgpuSchedulerState {
2365 engine: try_from_nvml_enum("vgpu scheduler engine", info.engineId)?,
2366 policy: try_from_nvml_enum("vgpu scheduler policy", info.schedulerPolicy)?,
2367 arr_mode,
2368 params: VgpuSchedulerParams {
2369 timeslice: info.timeslice,
2370 avg_factor,
2371 },
2372 },
2373 entries,
2374 })
2375 }
2376}
2377
2378impl From<sys::nvmlLedState_t> for LedState {
2379 fn from(value: sys::nvmlLedState_t) -> Self {
2380 Self {
2381 cause: string_from_c_chars(&value.cause),
2382 color: value.color.into(),
2383 }
2384 }
2385}
2386
2387impl From<sys::nvmlUnitInfo_t> for UnitInfo {
2388 fn from(value: sys::nvmlUnitInfo_t) -> Self {
2389 Self {
2390 name: string_from_c_chars(&value.name),
2391 id: string_from_c_chars(&value.id),
2392 serial: string_from_c_chars(&value.serial),
2393 firmware_version: string_from_c_chars(&value.firmwareVersion),
2394 }
2395 }
2396}
2397
2398impl From<sys::nvmlPSUInfo_t> for PsuInfo {
2399 fn from(value: sys::nvmlPSUInfo_t) -> Self {
2400 Self {
2401 state: string_from_c_chars(&value.state),
2402 current: value.current,
2403 voltage: value.voltage,
2404 power: value.power,
2405 }
2406 }
2407}
2408
2409impl From<sys::nvmlGpmSupport_t> for GpmSupport {
2410 fn from(value: sys::nvmlGpmSupport_t) -> Self {
2411 Self {
2412 is_supported_device: value.isSupportedDevice != 0,
2413 }
2414 }
2415}
2416
2417impl From<sys::nvmlGpmMetric_t> for GpmMetric {
2418 fn from(value: sys::nvmlGpmMetric_t) -> Self {
2419 let result = if value.nvmlReturn == sys::nvmlReturn_t::NVML_SUCCESS {
2420 Ok(value.value)
2421 } else {
2422 Err(value.nvmlReturn.into())
2423 };
2424
2425 Self {
2426 metric_id: GpmMetricId(value.metricId),
2427 result,
2428 short_name: unsafe { string_from_c_ptr(value.metricInfo.shortName) },
2429 long_name: unsafe { string_from_c_ptr(value.metricInfo.longName) },
2430 unit: unsafe { string_from_c_ptr(value.metricInfo.unit) },
2431 }
2432 }
2433}
2434
2435impl From<sys::nvmlBAR1Memory_t> for Bar1MemoryInfo {
2436 fn from(value: sys::nvmlBAR1Memory_t) -> Self {
2437 Self {
2438 total: value.bar1Total,
2439 free: value.bar1Free,
2440 used: value.bar1Used,
2441 }
2442 }
2443}
2444
2445impl From<sys::nvmlEccErrorCounts_t> for EccErrorCounts {
2446 fn from(value: sys::nvmlEccErrorCounts_t) -> Self {
2447 Self {
2448 l1_cache: value.l1Cache,
2449 l2_cache: value.l2Cache,
2450 device_memory: value.deviceMemory,
2451 register_file: value.registerFile,
2452 }
2453 }
2454}
2455
2456impl From<sys::nvmlViolationTime_t> for ViolationTime {
2457 fn from(value: sys::nvmlViolationTime_t) -> Self {
2458 Self {
2459 reference_time: value.referenceTime,
2460 violation_time: value.violationTime,
2461 }
2462 }
2463}
2464
2465impl From<sys::nvmlRowRemapperHistogramValues_t> for RowRemapperHistogram {
2466 fn from(value: sys::nvmlRowRemapperHistogramValues_t) -> Self {
2467 Self {
2468 max: value.max,
2469 high: value.high,
2470 partial: value.partial,
2471 low: value.low,
2472 none: value.none,
2473 }
2474 }
2475}
2476
2477impl From<sys::nvmlAccountingStats_t> for AccountingStats {
2478 fn from(value: sys::nvmlAccountingStats_t) -> Self {
2479 Self {
2480 gpu_utilization: value.gpuUtilization,
2481 memory_utilization: value.memoryUtilization,
2482 max_memory_usage: value.maxMemoryUsage,
2483 time: value.time,
2484 start_time: value.startTime,
2485 is_running: value.isRunning != 0,
2486 }
2487 }
2488}
2489
2490impl From<sys::nvmlDeviceCurrentClockFreqs_t> for CurrentClockFreqs {
2491 fn from(value: sys::nvmlDeviceCurrentClockFreqs_t) -> Self {
2492 Self {
2493 value: string_from_c_chars(&value.str_),
2494 }
2495 }
2496}
2497
2498impl From<sys::nvmlDevicePerfModes_t> for PerformanceModes {
2499 fn from(value: sys::nvmlDevicePerfModes_t) -> Self {
2500 Self {
2501 value: string_from_c_chars(&value.str_),
2502 }
2503 }
2504}
2505
2506impl From<sys::nvmlMarginTemperature_t> for MarginTemperature {
2507 fn from(value: sys::nvmlMarginTemperature_t) -> Self {
2508 Self {
2509 value: value.marginTemperature,
2510 }
2511 }
2512}
2513
2514impl From<sys::nvmlDeviceAttributes_t> for DeviceAttributes {
2515 fn from(value: sys::nvmlDeviceAttributes_t) -> Self {
2516 Self {
2517 multiprocessor_count: value.multiprocessorCount,
2518 shared_copy_engine_count: value.sharedCopyEngineCount,
2519 shared_decoder_count: value.sharedDecoderCount,
2520 shared_encoder_count: value.sharedEncoderCount,
2521 shared_jpeg_count: value.sharedJpegCount,
2522 shared_ofa_count: value.sharedOfaCount,
2523 gpu_instance_slice_count: value.gpuInstanceSliceCount,
2524 compute_instance_slice_count: value.computeInstanceSliceCount,
2525 memory_size_mb: value.memorySizeMB,
2526 }
2527 }
2528}
2529
2530impl From<sys::nvmlPlatformInfo_t> for PlatformInfo {
2531 fn from(value: sys::nvmlPlatformInfo_t) -> Self {
2532 Self {
2533 ib_guid: value.ibGuid,
2534 chassis_serial_number: value.chassisSerialNumber,
2535 slot_number: value.slotNumber,
2536 tray_index: value.trayIndex,
2537 host_id: value.hostId,
2538 peer_type: value.peerType,
2539 module_id: value.moduleId,
2540 }
2541 }
2542}
2543
2544impl From<sys::nvmlPdi_t> for Pdi {
2545 fn from(value: sys::nvmlPdi_t) -> Self {
2546 Self { value: value.value }
2547 }
2548}
2549
2550impl From<sys::nvmlBridgeChipInfo_t> for BridgeChipInfo {
2551 fn from(value: sys::nvmlBridgeChipInfo_t) -> Self {
2552 Self {
2553 kind: value.type_.into(),
2554 firmware_version: value.fwVersion,
2555 }
2556 }
2557}
2558
2559impl From<sys::nvmlBridgeChipHierarchy_t> for BridgeChipHierarchy {
2560 fn from(value: sys::nvmlBridgeChipHierarchy_t) -> Self {
2561 Self {
2562 bridge_chips: value.bridgeChipInfo[..value.bridgeCount as usize]
2563 .iter()
2564 .copied()
2565 .map(Into::into)
2566 .collect(),
2567 }
2568 }
2569}
2570
2571impl From<sys::nvmlRepairStatus_t> for RepairStatus {
2572 fn from(value: sys::nvmlRepairStatus_t) -> Self {
2573 Self {
2574 channel_repair_pending: value.bChannelRepairPending != 0,
2575 tpc_repair_pending: value.bTpcRepairPending != 0,
2576 }
2577 }
2578}
2579
2580impl From<sys::nvmlC2cModeInfo_v1_t> for C2cModeInfo {
2581 fn from(value: sys::nvmlC2cModeInfo_v1_t) -> Self {
2582 Self {
2583 enabled: value.isC2cEnabled != 0,
2584 }
2585 }
2586}
2587
2588impl From<sys::nvmlClkMonFaultInfo_t> for ClkMonFaultInfo {
2589 fn from(value: sys::nvmlClkMonFaultInfo_t) -> Self {
2590 Self {
2591 clock_api_domain: value.clkApiDomain,
2592 clock_domain_fault_mask: value.clkDomainFaultMask,
2593 }
2594 }
2595}
2596
2597impl From<sys::nvmlClkMonStatus_t> for ClkMonStatus {
2598 fn from(value: sys::nvmlClkMonStatus_t) -> Self {
2599 Self {
2600 global_status: value.bGlobalStatus != 0,
2601 faults: value.clkMonList[..value.clkMonListSize as usize]
2602 .iter()
2603 .copied()
2604 .map(Into::into)
2605 .collect(),
2606 }
2607 }
2608}
2609
2610impl From<sys::nvmlEccSramErrorStatus_t> for EccSramErrorStatus {
2611 fn from(value: sys::nvmlEccSramErrorStatus_t) -> Self {
2612 Self {
2613 aggregate_unc_parity: value.aggregateUncParity,
2614 aggregate_unc_secded: value.aggregateUncSecDed,
2615 aggregate_corrected: value.aggregateCor,
2616 volatile_unc_parity: value.volatileUncParity,
2617 volatile_unc_secded: value.volatileUncSecDed,
2618 volatile_corrected: value.volatileCor,
2619 aggregate_unc_bucket_l2: value.aggregateUncBucketL2,
2620 aggregate_unc_bucket_sm: value.aggregateUncBucketSm,
2621 aggregate_unc_bucket_pcie: value.aggregateUncBucketPcie,
2622 aggregate_unc_bucket_mcu: value.aggregateUncBucketMcu,
2623 aggregate_unc_bucket_other: value.aggregateUncBucketOther,
2624 threshold_exceeded: value.bThresholdExceeded != 0,
2625 }
2626 }
2627}
2628
2629impl From<sys::nvmlEccSramUniqueUncorrectedErrorEntry_v1_t> for EccSramUniqueUncorrectedErrorEntry {
2630 fn from(value: sys::nvmlEccSramUniqueUncorrectedErrorEntry_v1_t) -> Self {
2631 Self {
2632 unit: value.unit,
2633 location: value.location,
2634 sublocation: value.sublocation,
2635 extlocation: value.extlocation,
2636 address: value.address,
2637 is_parity: value.isParity != 0,
2638 count: value.count,
2639 }
2640 }
2641}
2642
2643impl From<sys::nvmlGpuThermalSettings_t__bindgen_ty_1> for ThermalSensorSetting {
2644 fn from(value: sys::nvmlGpuThermalSettings_t__bindgen_ty_1) -> Self {
2645 Self {
2646 controller: value.controller.into(),
2647 default_min_temp: value.defaultMinTemp,
2648 default_max_temp: value.defaultMaxTemp,
2649 current_temp: value.currentTemp,
2650 target: value.target.into(),
2651 }
2652 }
2653}
2654
2655impl From<sys::nvmlGpuThermalSettings_t> for ThermalSettings {
2656 fn from(value: sys::nvmlGpuThermalSettings_t) -> Self {
2657 Self {
2658 sensors: value.sensor[..value.count as usize]
2659 .iter()
2660 .copied()
2661 .map(Into::into)
2662 .collect(),
2663 }
2664 }
2665}
2666
2667impl From<sys::nvmlClockOffset_t> for ClockOffset {
2668 fn from(value: sys::nvmlClockOffset_t) -> Self {
2669 Self {
2670 kind: value.type_.into(),
2671 pstate: value.pstate.into(),
2672 clock_offset_mhz: value.clockOffsetMHz,
2673 min_clock_offset_mhz: value.minClockOffsetMHz,
2674 max_clock_offset_mhz: value.maxClockOffsetMHz,
2675 }
2676 }
2677}
2678
2679impl From<sys::nvmlNvLinkUtilizationControl_t> for NvLinkUtilizationControl {
2680 fn from(value: sys::nvmlNvLinkUtilizationControl_t) -> Self {
2681 Self {
2682 units: value.units.into(),
2683 packet_filter: NvLinkPacketTypes::from_bits_retain(value.pktfilter as u32),
2684 }
2685 }
2686}
2687
2688impl From<sys::nvmlNvlinkFirmwareVersion_t> for NvLinkFirmwareVersion {
2689 fn from(value: sys::nvmlNvlinkFirmwareVersion_t) -> Self {
2690 Self {
2691 ucode_type: value.ucodeType,
2692 major: value.major,
2693 minor: value.minor,
2694 sub_minor: value.subMinor,
2695 }
2696 }
2697}
2698
2699impl From<sys::nvmlNvLinkInfo_t> for NvLinkInfo {
2700 fn from(value: sys::nvmlNvLinkInfo_t) -> Self {
2701 Self {
2702 nvle_enabled: value.isNvleEnabled != 0,
2703 firmware_versions: value.firmwareInfo.firmwareVersion
2704 [..value.firmwareInfo.numValidEntries as usize]
2705 .iter()
2706 .copied()
2707 .map(Into::into)
2708 .collect(),
2709 }
2710 }
2711}
2712
2713impl From<sys::nvmlNvlinkGetBwMode_t> for NvLinkBwMode {
2714 fn from(value: sys::nvmlNvlinkGetBwMode_t) -> Self {
2715 Self {
2716 is_best: value.bIsBest != 0,
2717 mode: value.bwMode,
2718 }
2719 }
2720}
2721
2722impl From<sys::nvmlNvlinkSupportedBwModes_t> for NvLinkSupportedBwModes {
2723 fn from(value: sys::nvmlNvlinkSupportedBwModes_t) -> Self {
2724 Self {
2725 modes: value.bwModes[..value.totalBwModes as usize].to_vec(),
2726 }
2727 }
2728}
2729
2730impl From<sys::nvmlDevicePowerMizerModes_v1_t> for PowerMizerModes {
2731 fn from(value: sys::nvmlDevicePowerMizerModes_v1_t) -> Self {
2732 Self {
2733 current_mode: value.currentMode,
2734 mode: value.mode,
2735 supported_modes: value.supportedPowerMizerModes,
2736 }
2737 }
2738}
2739
2740impl From<sys::nvmlWorkloadPowerProfileInfo_t> for WorkloadPowerProfileInfo {
2741 fn from(value: sys::nvmlWorkloadPowerProfileInfo_t) -> Self {
2742 Self {
2743 profile_id: value.profileId,
2744 priority: value.priority,
2745 conflicting_profiles: mask255_bits(value.conflictingMask),
2746 }
2747 }
2748}
2749
2750impl From<sys::nvmlWorkloadPowerProfileProfilesInfo_t> for WorkloadPowerProfilesInfo {
2751 fn from(value: sys::nvmlWorkloadPowerProfileProfilesInfo_t) -> Self {
2752 Self {
2753 supported_profiles: mask255_bits(value.perfProfilesMask),
2754 profiles: value.perfProfile.into_iter().map(Into::into).collect(),
2755 }
2756 }
2757}
2758
2759impl From<sys::nvmlWorkloadPowerProfileCurrentProfiles_t> for WorkloadPowerCurrentProfiles {
2760 fn from(value: sys::nvmlWorkloadPowerProfileCurrentProfiles_t) -> Self {
2761 Self {
2762 supported_profiles: mask255_bits(value.perfProfilesMask),
2763 requested_profiles: mask255_bits(value.requestedProfilesMask),
2764 enforced_profiles: mask255_bits(value.enforcedProfilesMask),
2765 }
2766 }
2767}
2768
2769impl From<sys::nvmlDramEncryptionInfo_t> for DramEncryptionInfo {
2770 fn from(value: sys::nvmlDramEncryptionInfo_t) -> Self {
2771 Self {
2772 encryption_state: value.encryptionState.into(),
2773 }
2774 }
2775}
2776
2777impl From<sys::nvmlVgpuTypeBar1Info_t> for VgpuTypeBar1Info {
2778 fn from(value: sys::nvmlVgpuTypeBar1Info_t) -> Self {
2779 Self {
2780 bar1_size: value.bar1Size,
2781 }
2782 }
2783}
2784
2785impl From<sys::nvmlConfComputeSystemCaps_t> for ConfComputeSystemCaps {
2786 fn from(value: sys::nvmlConfComputeSystemCaps_t) -> Self {
2787 Self {
2788 cpu_caps: value.cpuCaps,
2789 gpus_caps: value.gpusCaps,
2790 }
2791 }
2792}
2793
2794impl From<sys::nvmlConfComputeSystemState_t> for ConfComputeSystemState {
2795 fn from(value: sys::nvmlConfComputeSystemState_t) -> Self {
2796 Self {
2797 environment: value.environment,
2798 cc_feature: value.ccFeature,
2799 dev_tools_mode: value.devToolsMode,
2800 }
2801 }
2802}
2803
2804impl From<sys::nvmlSystemConfComputeSettings_t> for ConfComputeSystemSettings {
2805 fn from(value: sys::nvmlSystemConfComputeSettings_t) -> Self {
2806 Self {
2807 environment: value.environment,
2808 cc_feature: value.ccFeature,
2809 dev_tools_mode: value.devToolsMode,
2810 multi_gpu_mode: value.multiGpuMode,
2811 }
2812 }
2813}
2814
2815impl From<sys::nvmlConfComputeMemSizeInfo_t> for ConfComputeMemSizeInfo {
2816 fn from(value: sys::nvmlConfComputeMemSizeInfo_t) -> Self {
2817 Self {
2818 protected_mem_size_kib: value.protectedMemSizeKib,
2819 unprotected_mem_size_kib: value.unprotectedMemSizeKib,
2820 }
2821 }
2822}
2823
2824impl From<sys::nvmlConfComputeGpuCertificate_t> for ConfComputeGpuCertificate {
2825 fn from(value: sys::nvmlConfComputeGpuCertificate_t) -> Self {
2826 Self {
2827 cert_chain: value.certChain[..value.certChainSize as usize].to_vec(),
2828 attestation_cert_chain: value.attestationCertChain
2829 [..value.attestationCertChainSize as usize]
2830 .to_vec(),
2831 }
2832 }
2833}
2834
2835impl From<sys::nvmlConfComputeGpuAttestationReport_t> for ConfComputeGpuAttestationReport {
2836 fn from(value: sys::nvmlConfComputeGpuAttestationReport_t) -> Self {
2837 Self {
2838 cec_attestation_report_present: value.isCecAttestationReportPresent != 0,
2839 nonce: value.nonce,
2840 attestation_report: value.attestationReport[..value.attestationReportSize as usize]
2841 .to_vec(),
2842 cec_attestation_report: value.cecAttestationReport
2843 [..value.cecAttestationReportSize as usize]
2844 .to_vec(),
2845 }
2846 }
2847}
2848
2849impl From<sys::nvmlConfComputeGetKeyRotationThresholdInfo_t> for ConfComputeKeyRotationThreshold {
2850 fn from(value: sys::nvmlConfComputeGetKeyRotationThresholdInfo_t) -> Self {
2851 Self {
2852 attacker_advantage: value.attackerAdvantage,
2853 }
2854 }
2855}
2856
2857impl GpuFabricInfo {
2858 pub(crate) fn from_raw(value: sys::nvmlGpuFabricInfoV_t) -> Result<Self> {
2859 Ok(Self {
2860 cluster_uuid: value.clusterUuid,
2861 status_code: value.status as u32,
2862 clique_id: value.cliqueId,
2863 state: try_from_nvml_enum("gpu fabric state", value.state as u32)?,
2864 health: GpuFabricHealth::from_raw(value.healthMask)?,
2865 health_summary: try_from_nvml_enum(
2866 "gpu fabric health summary",
2867 value.healthSummary as u32,
2868 )?,
2869 })
2870 }
2871}
2872
2873impl From<sys::nvmlGpuDynamicPstatesInfo_t> for DynamicPstatesInfo {
2874 fn from(value: sys::nvmlGpuDynamicPstatesInfo_t) -> Self {
2875 Self {
2876 flags: value.flags,
2877 utilization: value
2878 .utilization
2879 .into_iter()
2880 .enumerate()
2881 .filter(|(_, entry)| entry.bIsPresent != 0)
2882 .map(|(domain, entry)| DynamicPstateInfo {
2883 domain: domain as u32,
2884 percentage: entry.percentage,
2885 increase_threshold: entry.incThreshold,
2886 decrease_threshold: entry.decThreshold,
2887 })
2888 .collect(),
2889 }
2890 }
2891}
2892
2893impl GpuFabricHealth {
2894 fn from_raw(raw_mask: u32) -> Result<Self> {
2895 Ok(Self {
2896 degraded_bandwidth: decode_fabric_boolean_health(
2897 raw_mask,
2898 sys::NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_DEGRADED_BW,
2899 sys::NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_DEGRADED_BW,
2900 )?,
2901 route_recovery: decode_fabric_boolean_health(
2902 raw_mask,
2903 sys::NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_RECOVERY,
2904 sys::NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_RECOVERY,
2905 )?,
2906 route_unhealthy: decode_fabric_boolean_health(
2907 raw_mask,
2908 sys::NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_UNHEALTHY,
2909 sys::NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_UNHEALTHY,
2910 )?,
2911 access_timeout_recovery: decode_fabric_boolean_health(
2912 raw_mask,
2913 sys::NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ACCESS_TIMEOUT_RECOVERY,
2914 sys::NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ACCESS_TIMEOUT_RECOVERY,
2915 )?,
2916 incorrect_configuration: try_from_nvml_enum(
2917 "gpu fabric incorrect configuration",
2918 (raw_mask >> sys::NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_INCORRECT_CONFIGURATION)
2919 & sys::NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_INCORRECT_CONFIGURATION,
2920 )?,
2921 raw_mask,
2922 })
2923 }
2924}
2925
2926fn decode_fabric_boolean_health(
2927 raw_mask: u32,
2928 shift: u32,
2929 width: u32,
2930) -> Result<GpuFabricBooleanState> {
2931 try_from_nvml_enum("gpu fabric boolean state", (raw_mask >> shift) & width)
2932}
2933
2934impl FieldValue {
2935 pub fn from_raw(value_type: sys::nvmlValueType_t, value: sys::nvmlValue_t) -> Result<Self> {
2936 Ok(match FieldValueType::try_from(u32::from(value_type)) {
2937 Ok(FieldValueType::Double) => Self::Double(unsafe { value.dVal }),
2938 Ok(FieldValueType::UnsignedInt) => Self::UnsignedInt(unsafe { value.uiVal }),
2939 Ok(FieldValueType::UnsignedLong) => Self::UnsignedLong(unsafe { value.ulVal }),
2940 Ok(FieldValueType::UnsignedLongLong) => Self::UnsignedLongLong(unsafe { value.ullVal }),
2941 Ok(FieldValueType::SignedLongLong) => Self::SignedLongLong(unsafe { value.sllVal }),
2942 Ok(FieldValueType::SignedInt) => Self::SignedInt(unsafe { value.siVal }),
2943 Ok(FieldValueType::UnsignedShort) => Self::UnsignedShort(unsafe { value.usVal }),
2944 Err(_) => return Err(Error::UnknownFieldValueType(u32::from(value_type))),
2945 })
2946 }
2947}
2948
2949impl Sample {
2950 pub fn from_raw(value_type: sys::nvmlValueType_t, sample: sys::nvmlSample_t) -> Result<Self> {
2951 Ok(Self {
2952 timestamp: sample.timeStamp,
2953 value: FieldValue::from_raw(value_type, sample.sampleValue)?,
2954 })
2955 }
2956}
2957
2958impl FieldSample {
2959 pub fn from_raw(value: sys::nvmlFieldValue_t) -> Self {
2960 let result = if value.nvmlReturn == sys::nvmlReturn_t::NVML_SUCCESS {
2961 FieldValue::from_raw(value.valueType, value.value)
2962 } else {
2963 Err(value.nvmlReturn.into())
2964 };
2965
2966 Self {
2967 field: FieldId(value.fieldId),
2968 scope_id: value.scopeId,
2969 timestamp: value.timestamp,
2970 latency_usec: value.latencyUsec,
2971 result,
2972 }
2973 }
2974}
2975
2976impl From<sys::nvmlEventData_t> for EventData {
2977 fn from(value: sys::nvmlEventData_t) -> Self {
2978 Self {
2979 device: (!value.device.is_null()).then_some(unsafe { Device::from_raw(value.device) }),
2980 event_types: EventTypes::from_bits_retain(value.eventType),
2981 event_data: value.eventData,
2982 gpu_instance_id: value.gpuInstanceId,
2983 compute_instance_id: value.computeInstanceId,
2984 }
2985 }
2986}
2987
2988impl From<sys::nvmlSystemEventData_v1_t> for SystemEventData {
2989 fn from(value: sys::nvmlSystemEventData_v1_t) -> Self {
2990 Self {
2991 event_types: SystemEventTypes::from_bits_retain(value.eventType),
2992 gpu_id: value.gpuId,
2993 }
2994 }
2995}
2996
2997impl From<sys::nvmlProcessInfo_t> for ProcessInfo {
2998 fn from(value: sys::nvmlProcessInfo_t) -> Self {
2999 Self {
3000 pid: Pid(value.pid),
3001 used_gpu_memory: option_u64_from_not_available(value.usedGpuMemory),
3002 gpu_instance_id: value.gpuInstanceId,
3003 compute_instance_id: value.computeInstanceId,
3004 }
3005 }
3006}
3007
3008impl From<sys::nvmlProcessDetail_v1_t> for ProcessDetail {
3009 fn from(value: sys::nvmlProcessDetail_v1_t) -> Self {
3010 Self {
3011 pid: Pid(value.pid),
3012 used_gpu_memory: option_u64_from_not_available(value.usedGpuMemory),
3013 gpu_instance_id: value.gpuInstanceId,
3014 compute_instance_id: value.computeInstanceId,
3015 used_gpu_cc_protected_memory: option_u64_from_not_available(
3016 value.usedGpuCcProtectedMemory,
3017 ),
3018 }
3019 }
3020}
3021
3022impl From<sys::nvmlProcessUtilizationSample_t> for ProcessUtilizationSample {
3023 fn from(value: sys::nvmlProcessUtilizationSample_t) -> Self {
3024 Self {
3025 pid: Pid(value.pid),
3026 timestamp: value.timeStamp,
3027 sm_utilization: value.smUtil,
3028 memory_utilization: value.memUtil,
3029 encoder_utilization: value.encUtil,
3030 decoder_utilization: value.decUtil,
3031 }
3032 }
3033}
3034
3035impl From<sys::nvmlProcessUtilizationInfo_v1_t> for ProcessUtilizationInfo {
3036 fn from(value: sys::nvmlProcessUtilizationInfo_v1_t) -> Self {
3037 Self {
3038 timestamp: value.timeStamp,
3039 pid: Pid(value.pid),
3040 sm_utilization: value.smUtil,
3041 memory_utilization: value.memUtil,
3042 encoder_utilization: value.encUtil,
3043 decoder_utilization: value.decUtil,
3044 jpg_utilization: value.jpgUtil,
3045 ofa_utilization: value.ofaUtil,
3046 }
3047 }
3048}
3049
3050impl From<sys::nvmlEncoderSessionInfo_t> for EncoderSessionInfo {
3051 fn from(value: sys::nvmlEncoderSessionInfo_t) -> Self {
3052 Self {
3053 session_id: value.sessionId,
3054 pid: Pid(value.pid),
3055 vgpu_instance: value.vgpuInstance,
3056 codec_type: value.codecType.into(),
3057 horizontal_resolution: value.hResolution,
3058 vertical_resolution: value.vResolution,
3059 average_fps: value.averageFps,
3060 average_latency_us: value.averageLatency,
3061 }
3062 }
3063}
3064
3065impl From<sys::nvmlFBCStats_t> for FbcStats {
3066 fn from(value: sys::nvmlFBCStats_t) -> Self {
3067 Self {
3068 session_count: value.sessionsCount,
3069 average_fps: value.averageFPS,
3070 average_latency_us: value.averageLatency,
3071 }
3072 }
3073}
3074
3075impl From<sys::nvmlFBCSessionInfo_t> for FbcSessionInfo {
3076 fn from(value: sys::nvmlFBCSessionInfo_t) -> Self {
3077 Self {
3078 session_id: value.sessionId,
3079 pid: Pid(value.pid),
3080 vgpu_instance: value.vgpuInstance,
3081 display_ordinal: value.displayOrdinal,
3082 session_type: value.sessionType.into(),
3083 session_flags: value.sessionFlags,
3084 max_horizontal_resolution: value.hMaxResolution,
3085 max_vertical_resolution: value.vMaxResolution,
3086 horizontal_resolution: value.hResolution,
3087 vertical_resolution: value.vResolution,
3088 average_fps: value.averageFPS,
3089 average_latency_us: value.averageLatency,
3090 }
3091 }
3092}