Introduce a kernel module param to set vGPU support in nova-core. vgpu_support = 1 (default): automatic
The driver automatically enables or disables vGPU support based on if the GPU advertises SRIOV caps. vgpu_support = 0: disabled Explicitly disables vGPU support. The driver will not enable vGPU support regardless. Signed-off-by: Zhi Wang <[email protected]> --- drivers/gpu/nova-core/gpu.rs | 4 ++++ drivers/gpu/nova-core/nova_core.rs | 15 +++++++++++++++ drivers/gpu/nova-core/vgpu.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 drivers/gpu/nova-core/vgpu.rs diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 629c9d2dc994..10c5ae07a891 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -20,6 +20,7 @@ gfw, gsp::Gsp, regs, + vgpu::Vgpu, // }; macro_rules! define_chipset { @@ -252,6 +253,7 @@ pub(crate) struct Gpu { /// GSP runtime data. Temporarily an empty placeholder. #[pin] gsp: Gsp, + vgpu: Vgpu, } impl Gpu { @@ -271,6 +273,8 @@ pub(crate) fn new<'a>( .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did not complete"))?; }, + vgpu: Vgpu::new(pdev)?, + sysmem_flush: SysmemFlush::register(pdev.as_ref(), bar, spec.chipset)?, gsp_falcon: Falcon::new( diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs index b98a1c03f13d..e034353f69ab 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -18,6 +18,7 @@ mod sbuffer; mod util; mod vbios; +mod vgpu; pub(crate) const MODULE_NAME: &kernel::str::CStr = <LocalModule as kernel::ModuleMetadata>::NAME; @@ -28,6 +29,20 @@ description: "Nova Core GPU driver", license: "GPL v2", firmware: [], + params: { + // vgpu_support = 1 (default): automatic + // + // The driver automatically enables or disables vGPU support based on if the GPU + // advertises SRIOV caps. + // + // vgpu_support = 0: disabled + // + // Explicitly disables vGPU support. The driver will not enable vGPU support regardless. + vgpu_support: u32 { + default: 1, + description: "Enable vGPU support - (1 = auto (default), 0 = disable)", + }, + }, } kernel::module_firmware!(firmware::ModInfoBuilder); diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs new file mode 100644 index 000000000000..9701b97bf6bf --- /dev/null +++ b/drivers/gpu/nova-core/vgpu.rs @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +// +use kernel::{ + device, + pci, + prelude::*, // +}; + +use crate::{ + module_parameters, // +}; + +pub(crate) struct Vgpu { + pub vgpu_support: bool, +} + +impl Vgpu { + pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> Result<Vgpu> { + Ok(Vgpu { + vgpu_support: match *module_parameters::vgpu_support.value() { + 0 => false, + _ => pdev.sriov_get_totalvfs().is_ok(), + }, + }) + } +} -- 2.51.0
