Skip to main content

nvml_wrapper/struct_wrappers/
vgpu.rs

1use std::{ffi::CStr, os::raw::c_char};
2
3use ffi::bindings::*;
4
5use crate::{
6    enum_wrappers::vgpu::{VgpuGuestInfoState, VgpuLicenseState},
7    error::NvmlError,
8};
9
10#[derive(Debug, Copy, Clone)]
11pub struct VgpuLicenseInfo {
12    pub is_licensed: bool,
13    pub expiry: VgpuLicenseExpiry,
14    pub state: VgpuLicenseState,
15}
16
17impl From<nvmlVgpuLicenseInfo_t> for VgpuLicenseInfo {
18    fn from(value: nvmlVgpuLicenseInfo_t) -> Self {
19        Self {
20            is_licensed: value.isLicensed != 0,
21            expiry: VgpuLicenseExpiry::from(value.licenseExpiry),
22            state: VgpuLicenseState::from(value.currentState),
23        }
24    }
25}
26
27#[derive(Debug, Copy, Clone)]
28pub struct VgpuLicenseExpiry {
29    pub year: u16,
30    pub month: u8,
31    pub day: u8,
32    pub hour: u8,
33    pub min: u8,
34    pub sec: u8,
35    pub status: u8,
36}
37
38impl From<nvmlVgpuLicenseExpiry_t> for VgpuLicenseExpiry {
39    fn from(value: nvmlVgpuLicenseExpiry_t) -> Self {
40        Self {
41            year: u16::try_from(value.year).unwrap_or(u16::MAX),
42            month: u8::try_from(value.month).unwrap_or(u8::MAX),
43            day: u8::try_from(value.day).unwrap_or(u8::MAX),
44            hour: u8::try_from(value.hour).unwrap_or(u8::MAX),
45            min: u8::try_from(value.min).unwrap_or(u8::MAX),
46            sec: u8::try_from(value.sec).unwrap_or(u8::MAX),
47            status: value.status,
48        }
49    }
50}
51
52#[derive(Debug)]
53pub struct VgpuMetadata {
54    pub version: u32,
55    pub revision: u32,
56    pub guest_info_state: VgpuGuestInfoState,
57    pub guest_driver_version: String,
58    pub host_driver_version: String,
59    pub vgpu_virtualization_caps: u32,
60    pub guest_vgpu_version: u32,
61}
62
63impl TryFrom<nvmlVgpuMetadata_t> for VgpuMetadata {
64    type Error = NvmlError;
65    fn try_from(value: nvmlVgpuMetadata_t) -> Result<Self, Self::Error> {
66        let convert_c_str = |c_str: &[c_char]| unsafe {
67            CStr::from_ptr(c_str.as_ptr())
68                .to_str()
69                .map(|v| v.to_string())
70        };
71
72        Ok(Self {
73            version: value.version,
74            revision: value.revision,
75            guest_driver_version: convert_c_str(&value.guestDriverVersion)?,
76            host_driver_version: convert_c_str(&value.hostDriverVersion)?,
77            vgpu_virtualization_caps: value.vgpuVirtualizationCaps,
78            guest_vgpu_version: value.guestVgpuVersion,
79            guest_info_state: value.guestInfoState.try_into()?,
80        })
81    }
82}
83
84#[derive(Debug, Copy, Clone)]
85pub struct VgpuPlacementId {
86    pub version: u32,
87    pub id: u32,
88}
89
90impl From<nvmlVgpuPlacementId_t> for VgpuPlacementId {
91    fn from(value: nvmlVgpuPlacementId_t) -> Self {
92        Self {
93            version: value.version,
94            id: value.placementId,
95        }
96    }
97}
98
99#[derive(Debug, Copy, Clone)]
100pub struct VgpuRuntimeState {
101    pub version: u32,
102    pub size: u64,
103}
104
105impl From<nvmlVgpuRuntimeState_t> for VgpuRuntimeState {
106    fn from(value: nvmlVgpuRuntimeState_t) -> Self {
107        Self {
108            version: value.version,
109            size: value.size,
110        }
111    }
112}
113
114#[derive(Debug, Clone, Copy)]
115pub struct Bar1Info {
116    pub version: u32,
117    pub size: u64,
118}
119
120impl From<nvmlVgpuTypeBar1Info_v1_t> for Bar1Info {
121    fn from(value: nvmlVgpuTypeBar1Info_v1_t) -> Self {
122        Self {
123            version: value.version,
124            size: value.bar1Size,
125        }
126    }
127}