Re: [PATCH v4 07/17] gpu: nova-core: wait for GFW boot in probe, not in the Gpu constructor
From: Alexandre Courbot
Date: Mon Sep 21 2026 - 02:36:53 EST
On Sat Sep 12, 2026 at 5:43 AM BST, John Hubbard wrote:
> The GPU boots its own firmware, GFW, out of reset, and nothing may
> program the GPU until GFW reports completion.
>
> nova-core waited for GFW inside the Gpu constructor, which also boots
> the GSP. Code that has to run after GFW and before GSP boot, such as a
> probe-time hardware self-test, had nowhere to go.
>
> Move the wait into probe, ahead of the Gpu constructor, and read the
> chipset there from a Spec that probe builds itself. Leave the DMA mask
> in the constructor, since it programs the host rather than the GPU.
>
> Assisted-by: LLM
> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>
> ---
> drivers/gpu/nova-core/driver.rs | 13 ++++++++++++-
> drivers/gpu/nova-core/gpu.rs | 28 ++++++++++++++++++++--------
> 2 files changed, 32 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs
> index 0672a0707a71..15a44f9a6441 100644
> --- a/drivers/gpu/nova-core/driver.rs
> +++ b/drivers/gpu/nova-core/driver.rs
> @@ -22,7 +22,13 @@
> types::CovariantForLt,
> };
>
> -use crate::gpu::Gpu;
> +use crate::{
> + gpu,
> + gpu::{
> + Gpu,
> + Spec, //
> + }, //
> +};
Import format: use `self` to wrap the single `gpu` into its sibling.
<...>
> diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
> index d763bc8d3827..3d796d6c7013 100644
> --- a/drivers/gpu/nova-core/gpu.rs
> +++ b/drivers/gpu/nova-core/gpu.rs
> @@ -212,12 +212,12 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
> /// Structure holding a basic description of the GPU: `Chipset` and `Revision`.
> #[derive(Clone, Copy)]
> pub(crate) struct Spec {
> - chipset: Chipset,
> + pub(crate) chipset: Chipset,
> revision: Revision,
> }
>
> impl Spec {
> - fn new(dev: &device::Device, bar: Bar0<'_>) -> Result<Spec> {
> + pub(crate) fn new(dev: &device::Device, bar: Bar0<'_>) -> Result<Spec> {
> // Some brief notes about boot0 and boot42, in chronological order:
> //
> // NV04 through NV50:
> @@ -362,17 +362,12 @@ pub(crate) fn new<'a>(
> dev_info!(dev,"NVIDIA ({})\n", spec);
> })?,
>
> - // We must wait for GFW_BOOT completion before doing any significant setup on the GPU.
This comment would still be useful in the new home of the GFW completion
wait code.