From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Zhi Wang" <zhiw@nvidia.com>
Cc: <dakr@kernel.org>, <airlied@gmail.com>, <simona@ffwll.ch>,
<ojeda@kernel.org>, <alex.gaynor@gmail.com>,
<boqun.feng@gmail.com>, <gary@garyguo.net>,
<bjorn3_gh@protonmail.com>, <lossin@kernel.org>,
<a.hindborg@kernel.org>, <aliceryhl@google.com>,
<tmgross@umich.edu>, <jhubbard@nvidia.com>,
<ecourtney@nvidia.com>, <joelagnelf@nvidia.com>,
<apopple@nvidia.com>, <cjia@nvidia.com>, <smitra@nvidia.com>,
<kjaju@nvidia.com>, <alkumar@nvidia.com>, <ankita@nvidia.com>,
<aniketa@nvidia.com>, <kwankhede@nvidia.com>,
<targupta@nvidia.com>, <nova-gpu@lists.linux.dev>,
<linux-kernel@vger.kernel.org>, <zhiwang@kernel.org>
Subject: Re: [PATCH v4 4/6] gpu: nova-core: add vGPU preludes
Date: Fri, 17 Jul 2026 11:40:28 -0700 [thread overview]
Message-ID: <DK12E4VG8GKN.27MC1C9PABT4N@nvidia.com> (raw)
In-Reply-To: <20260709150206.1046839-5-zhiw@nvidia.com>
The patch title is a bit vague; maybe switch it to something more
informative like "detect and store vGPU state"?
On Thu Jul 9, 2026 at 8:02 AM PDT, Zhi Wang wrote:
> GSP boot needs a stable view of vGPU state before it starts building the
> boot-time data structures that depend on SR-IOV and firmware policy. That
> state must be derived once from the PCI VF count and the FSP PRC vGPU mode
> knob before booting GSP.
>
> Add VgpuManager to detect and retain the vGPU state during GPU
> construction. Keep the manager separate from the detected state because
> later vGPU milestones will add vGPU resources and lifecycle state to it.
>
> Keep the vGPU capability gate local to the vGPU module with per-chip HAL
> modules. Treat failures to detect the optional vGPU state as disabled so
> they do not prevent a bare-metal probe, and log both the failure and the
> detected state where the manager is constructed.
>
> Cc: Alexandre Courbot <acourbot@nvidia.com>
> Signed-off-by: Zhi Wang <zhiw@nvidia.com>
> ---
> drivers/gpu/nova-core/fsp.rs | 1 -
> drivers/gpu/nova-core/gpu.rs | 7 ++
> drivers/gpu/nova-core/gsp.rs | 2 +
> drivers/gpu/nova-core/nova_core.rs | 1 +
> drivers/gpu/nova-core/vgpu.rs | 90 +++++++++++++++++++++++++
> drivers/gpu/nova-core/vgpu/hal.rs | 25 +++++++
> drivers/gpu/nova-core/vgpu/hal/gb202.rs | 15 +++++
> drivers/gpu/nova-core/vgpu/hal/tu102.rs | 15 +++++
> 8 files changed, 155 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/nova-core/vgpu.rs
> create mode 100644 drivers/gpu/nova-core/vgpu/hal.rs
> create mode 100644 drivers/gpu/nova-core/vgpu/hal/gb202.rs
> create mode 100644 drivers/gpu/nova-core/vgpu/hal/tu102.rs
>
> diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs
> index 3a6b02f0dc11..abc161c4ba96 100644
> --- a/drivers/gpu/nova-core/fsp.rs
> +++ b/drivers/gpu/nova-core/fsp.rs
> @@ -487,7 +487,6 @@ fn send_sync_fsp<M>(&mut self, dev: &device::Device, msg: &M) -> Result<KVec<u8>
> /// Reads the active vGPU mode from FSP using the PRC protocol.
> ///
> /// Queries FSP's Management Partition for the active vGPU mode knob value.
> - #[expect(dead_code)]
> pub(crate) fn read_vgpu_mode(
> &mut self,
> dev: &device::Device<device::Bound>,
> diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
> index 442c0979f9c6..42a4cd7971fa 100644
> --- a/drivers/gpu/nova-core/gpu.rs
> +++ b/drivers/gpu/nova-core/gpu.rs
> @@ -30,6 +30,7 @@
> GspBootContext, //
> },
> regs,
> + vgpu::VgpuManager, //
> };
>
> mod hal;
> @@ -267,6 +268,8 @@ struct GspResources<'gpu> {
> // TODO: use different resource types for each boot method, and make the relevant Gsp methods
> // generic against them.
> fsp: Option<Fsp<'gpu>>,
> + /// vGPU state detected before GSP boot.
> + vgpu: VgpuManager,
> /// GSP runtime data.
> #[pin]
> gsp: Gsp,
> @@ -311,6 +314,7 @@ fn drop(self: Pin<&mut Self>) {
> gsp_falcon: &*this.gsp_falcon,
> sec2_falcon: &*this.sec2_falcon,
> fsp: this.fsp.as_mut(),
> + vgpu: &*this.vgpu,
> },
> bundle,
> )
> @@ -364,6 +368,8 @@ pub(crate) fn new(
>
> fsp: Fsp::try_new(dev, bar, spec.chipset)?,
>
> + vgpu: VgpuManager::new(pdev, spec.chipset, fsp.as_mut()),
> +
> gsp <- Gsp::new(pdev),
>
> // This member must be initialized last, so the `UnloadBundle` can never be dropped
> @@ -376,6 +382,7 @@ pub(crate) fn new(
> gsp_falcon,
> sec2_falcon,
> fsp: fsp.as_mut(),
> + vgpu,
> })?,
> }),
>
> diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs
> index d89cc3ba7c72..164bae8b8524 100644
> --- a/drivers/gpu/nova-core/gsp.rs
> +++ b/drivers/gpu/nova-core/gsp.rs
> @@ -49,6 +49,7 @@
> },
> },
> num,
> + vgpu::VgpuManager, //
> };
>
> pub(crate) const GSP_PAGE_SHIFT: usize = 12;
> @@ -67,6 +68,7 @@ pub(crate) struct GspBootContext<'ctx, 'gpu> {
> pub(crate) gsp_falcon: &'ctx Falcon<'gpu, GspFalcon>,
> pub(crate) sec2_falcon: &'ctx Falcon<'gpu, Sec2Falcon>,
> pub(crate) fsp: Option<&'ctx mut Fsp<'gpu>>,
> + pub(crate) vgpu: &'ctx VgpuManager,
> }
>
> impl<'ctx, 'gpu> GspBootContext<'ctx, 'gpu> {
> diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs
> index a61406ba5c0b..35a8b1214b0e 100644
> --- a/drivers/gpu/nova-core/nova_core.rs
> +++ b/drivers/gpu/nova-core/nova_core.rs
> @@ -23,6 +23,7 @@
> mod regs;
> mod sbuffer;
> mod vbios;
> +mod vgpu;
>
> pub(crate) const MODULE_NAME: &core::ffi::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
>
> diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs
> new file mode 100644
> index 000000000000..fcc15bddd53e
> --- /dev/null
> +++ b/drivers/gpu/nova-core/vgpu.rs
> @@ -0,0 +1,90 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +use kernel::{
> + device,
> + pci,
> + prelude::*, //
> +};
> +
> +use crate::{
> + fsp::{
> + Fsp,
> + VgpuMode, //
> + },
> + gpu::Chipset, //
> +};
> +
> +mod hal;
> +
> +/// vGPU state detected during GPU construction.
> +#[derive(Debug, Clone, Copy)]
> +pub(crate) enum VgpuState {
> + /// vGPU mode is not enabled for this boot.
> + Disabled,
> + /// vGPU mode is enabled for this boot.
> + Enabled {
> + /// Total number of SR-IOV VFs supported by this device.
> + total_vfs: u16,
Patch 2 returns a `NonNull<u16>`, which is the correct type - can we use
that type here as well? Since a value of `0` would mean `Disabled`
anwyay.
> + },
> +}
> +
> +/// vGPU state manager.
> +pub(crate) struct VgpuManager {
> + state: VgpuState,
> +}
> +
> +impl VgpuManager {
> + /// Creates a vGPU manager by querying SR-IOV and the FSP PRC vGPU knob.
> + pub(crate) fn new(
> + pdev: &pci::Device<device::Bound>,
> + chipset: Chipset,
> + fsp: Option<&mut Fsp<'_>>,
> + ) -> Self {
> + let state = Self::detect_state(pdev, chipset, fsp).unwrap_or_else(|e| {
> + dev_warn!(
> + pdev.as_ref(),
> + "vGPU state detection failed: {:?}; disabling vGPU\n",
> + e
> + );
> + VgpuState::Disabled
> + });
> + dev_dbg!(pdev.as_ref(), "vGPU state: {:?}\n", state);
Note that you can just use `dev_dbg!(pdev, ...)` here (also applies to a
few other sites).
I believe these will be my last nits for this series. :) Thanks for your
patience.
next prev parent reply other threads:[~2026-07-17 18:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 15:02 [PATCH v4 0/6] gpu: nova-core: boot GSP with vGPU enabled Zhi Wang
2026-07-09 15:02 ` [PATCH v4 1/6] PCI/IOV: Return unsigned int from pci_sriov_get_totalvfs() Zhi Wang
2026-07-09 22:46 ` Bjorn Helgaas
2026-07-09 22:58 ` Danilo Krummrich
2026-07-09 15:02 ` [PATCH v4 2/6] rust: pci: add sriov_get_totalvfs() helper Zhi Wang
2026-07-09 23:00 ` Danilo Krummrich
2026-07-16 14:56 ` Alexandre Courbot
2026-07-09 15:02 ` [PATCH v4 3/6] gpu: nova-core: read vGPU mode from FSP via PRC protocol Zhi Wang
2026-07-09 15:02 ` [PATCH v4 4/6] gpu: nova-core: add vGPU preludes Zhi Wang
2026-07-17 18:40 ` Alexandre Courbot [this message]
2026-07-09 15:02 ` [PATCH v4 5/6] gpu: nova-core: set RMSetSriovMode for vGPU Zhi Wang
2026-07-09 15:02 ` [PATCH v4 6/6] gpu: nova-core: reserve vGPU WPR2 heap Zhi Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DK12E4VG8GKN.27MC1C9PABT4N@nvidia.com \
--to=acourbot@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=airlied@gmail.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=alkumar@nvidia.com \
--cc=aniketa@nvidia.com \
--cc=ankita@nvidia.com \
--cc=apopple@nvidia.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=cjia@nvidia.com \
--cc=dakr@kernel.org \
--cc=ecourtney@nvidia.com \
--cc=gary@garyguo.net \
--cc=jhubbard@nvidia.com \
--cc=joelagnelf@nvidia.com \
--cc=kjaju@nvidia.com \
--cc=kwankhede@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=ojeda@kernel.org \
--cc=simona@ffwll.ch \
--cc=smitra@nvidia.com \
--cc=targupta@nvidia.com \
--cc=tmgross@umich.edu \
--cc=zhiw@nvidia.com \
--cc=zhiwang@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox