mirror of
https://github.com/mbilker/vgpu_unlock-rs.git
synced 2025-10-29 12:20:11 +01:00
lib: Add handling of NV0000_CTRL_CMD_VGPU_CREATE_DEVICE for 17.0 host driver (#35)
This commit is contained in:
15
src/lib.rs
15
src/lib.rs
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user