lib: Add handling of NV0000_CTRL_CMD_VGPU_CREATE_DEVICE for 17.0 host driver (#35)

This commit is contained in:
vdheijden
2024-09-16 22:18:56 -05:00
committed by GitHub
parent f74929011f
commit f53fb6b3c1
2 changed files with 39 additions and 1 deletions

View File

@@ -40,7 +40,8 @@ use crate::config::Config;
use crate::format::WideCharFormat;
use crate::log::{error, info};
use crate::nvidia::ctrl0000vgpu::{
Nv0000CtrlVgpuGetStartDataParams, NV0000_CTRL_CMD_VGPU_GET_START_DATA,
Nv0000CtrlVgpuCreateDeviceParams, Nv0000CtrlVgpuGetStartDataParams,
NV0000_CTRL_CMD_VGPU_CREATE_DEVICE, NV0000_CTRL_CMD_VGPU_GET_START_DATA,
};
use crate::nvidia::ctrl0080gpu::{
Nv0080CtrlGpuGetVirtualizationModeParams, NV0080_CTRL_CMD_GPU_GET_VIRTUALIZATION_MODE,
@@ -430,6 +431,18 @@ pub unsafe extern "C" fn ioctl(fd: RawFd, request: c_ulong, argp: *mut c_void) -
*LAST_MDEV_UUID.lock() = Some(config.mdev_uuid);
}
NV0000_CTRL_CMD_VGPU_CREATE_DEVICE
if check_size!(
NV0000_CTRL_CMD_VGPU_CREATE_DEVICE,
Nv0000CtrlVgpuCreateDeviceParams
) =>
{
// 17.0 driver provides mdev uuid as vgpu_name in this command
let params: &mut Nv0000CtrlVgpuCreateDeviceParams = &mut *io_data.params.cast();
info!("{:#?}", params);
*LAST_MDEV_UUID.lock() = Some(params.vgpu_name);
}
NVA081_CTRL_CMD_VGPU_CONFIG_GET_VGPU_TYPE_INFO => {
// 17.0 driver sends larger struct with size 5096 bytes. Only extra members added at the end,
// nothing in between or changed, so accessing the larger struct is "safe"

View File

@@ -31,14 +31,39 @@ impl fmt::Debug for Nv0000CtrlVgpuGetStartDataParams {
}
}
pub const NV0000_CTRL_CMD_VGPU_CREATE_DEVICE: u32 = 0xc02;
#[repr(C)]
pub struct Nv0000CtrlVgpuCreateDeviceParams {
pub vgpu_name: Uuid,
pub gpu_pci_id: u32,
pub gpu_pci_bdf: u32,
pub vgpu_type_id: u32,
pub vgpu_id: u16,
}
impl fmt::Debug for Nv0000CtrlVgpuCreateDeviceParams {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Nv0000CtrlVgpuCreateDeviceParams")
.field("vgpu_name", &format_args!("{{{}}}", self.vgpu_name))
.field("gpu_pci_id", &HexFormat(&self.gpu_pci_id))
.field("gpu_pci_bdf", &self.gpu_pci_bdf)
.field("vgpu_type_id", &self.vgpu_type_id)
.field("vgpu_id", &self.vgpu_id)
.finish()
}
}
#[cfg(test)]
mod test {
use std::mem;
use super::Nv0000CtrlVgpuCreateDeviceParams;
use super::Nv0000CtrlVgpuGetStartDataParams;
#[test]
fn verify_sizes() {
assert_eq!(mem::size_of::<Nv0000CtrlVgpuGetStartDataParams>(), 0x420);
assert_eq!(mem::size_of::<Nv0000CtrlVgpuCreateDeviceParams>(), 0x20);
}
}