mirror of
https://github.com/mbilker/vgpu_unlock-rs.git
synced 2026-06-07 23:57:45 +02: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::format::WideCharFormat;
|
||||||
use crate::log::{error, info};
|
use crate::log::{error, info};
|
||||||
use crate::nvidia::ctrl0000vgpu::{
|
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::{
|
use crate::nvidia::ctrl0080gpu::{
|
||||||
Nv0080CtrlGpuGetVirtualizationModeParams, NV0080_CTRL_CMD_GPU_GET_VIRTUALIZATION_MODE,
|
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);
|
*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 => {
|
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,
|
// 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"
|
// 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)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
use super::Nv0000CtrlVgpuCreateDeviceParams;
|
||||||
use super::Nv0000CtrlVgpuGetStartDataParams;
|
use super::Nv0000CtrlVgpuGetStartDataParams;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn verify_sizes() {
|
fn verify_sizes() {
|
||||||
assert_eq!(mem::size_of::<Nv0000CtrlVgpuGetStartDataParams>(), 0x420);
|
assert_eq!(mem::size_of::<Nv0000CtrlVgpuGetStartDataParams>(), 0x420);
|
||||||
|
assert_eq!(mem::size_of::<Nv0000CtrlVgpuCreateDeviceParams>(), 0x20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user