public inbox for rust-for-linux@vger.kernel.org
 help / color / mirror / Atom feed
From: "Gary Guo" <gary@garyguo.net>
To: "John Hubbard" <jhubbard@nvidia.com>,
	"Danilo Krummrich" <dakr@kernel.org>
Cc: "Alexandre Courbot" <acourbot@nvidia.com>,
	"Joel Fernandes" <joelagnelf@nvidia.com>,
	"Timur Tabi" <ttabi@nvidia.com>,
	"Alistair Popple" <apopple@nvidia.com>,
	"Edwin Peer" <epeer@nvidia.com>, "Zhi Wang" <zhiw@nvidia.com>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 28/31] gpu: nova-core: Hopper/Blackwell: add GSP lockdown release polling
Date: Wed, 21 Jan 2026 16:20:15 +0000	[thread overview]
Message-ID: <DFUEKCHQISZL.GIHM3SA9PAZN@garyguo.net> (raw)
In-Reply-To: <20251203055923.1247681-29-jhubbard@nvidia.com>

On Wed Dec 3, 2025 at 5:59 AM GMT, John Hubbard wrote:
> On Hopper and Blackwell, FSP boots GSP with hardware lockdown enabled.
> After FSP Chain of Trust completes, the driver must poll for lockdown
> release before proceeding with GSP initialization. Add the register
> bit and helper functions needed for this polling.
>
> Signed-off-by: John Hubbard <jhubbard@nvidia.com>
> ---
>  drivers/gpu/nova-core/gsp/boot.rs | 86 ++++++++++++++++++++++++++++++-
>  drivers/gpu/nova-core/regs.rs     |  1 +
>  2 files changed, 86 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs
> index 315f84907b11..4d04135a700e 100644
> --- a/drivers/gpu/nova-core/gsp/boot.rs
> +++ b/drivers/gpu/nova-core/gsp/boot.rs
> @@ -15,7 +15,8 @@
>      falcon::{
>          gsp::Gsp,
>          sec2::Sec2,
> -        Falcon, //
> +        Falcon,
> +        FalconEngine, //
>      },
>      fb::FbLayout,
>      firmware::{
> @@ -154,6 +155,89 @@ fn run_booter(
>          Ok(())
>      }
>  
> +    /// Check if GSP lockdown has been released after FSP Chain of Trust
> +    fn gsp_lockdown_released(
> +        dev: &device::Device,
> +        gsp_falcon: &Falcon<Gsp>,
> +        bar: &Bar0,
> +        fmc_boot_params_addr: u64,
> +        mbox0: &mut u32,
> +    ) -> bool {
> +        // Read GSP falcon mailbox0
> +        *mbox0 = gsp_falcon.read_mailbox0(bar);
> +
> +        // Check 1: If mbox0 has 0xbadf4100 pattern, GSP is still locked down
> +        if *mbox0 != 0 && (*mbox0 & 0xffffff00) == 0xbadf4100 {
> +            return false;
> +        }
> +
> +        // Check 2: If mbox0 has a value, check if it's an error
> +        if *mbox0 != 0 {
> +            let mbox1 = gsp_falcon.read_mailbox1(bar);
> +
> +            let combined_addr = (u64::from(mbox1) << 32) | u64::from(*mbox0);
> +            if combined_addr != fmc_boot_params_addr {
> +                // Address doesn't match - GSP wrote an error code
> +                // Return TRUE (lockdown released) with error
> +                dev_dbg!(dev,
> +                    "GSP lockdown released with error: mbox0={:#x}, combined_addr={:#x}, expected={:#x}",
> +                    *mbox0, combined_addr, fmc_boot_params_addr);
> +                return true;
> +            }
> +        }
> +
> +        // Check 3: Verify HWCFG2 RISCV_BR_PRIV_LOCKDOWN bit is clear
> +        let hwcfg2 = regs::NV_PFALCON_FALCON_HWCFG2::read(bar, &crate::falcon::gsp::Gsp::ID);
> +        !hwcfg2.riscv_br_priv_lockdown()
> +    }
> +
> +    /// Wait for GSP lockdown to be released after FSP Chain of Trust
> +    #[expect(dead_code)]
> +    fn wait_for_gsp_lockdown_release(
> +        dev: &device::Device,
> +        bar: &Bar0,
> +        gsp_falcon: &Falcon<Gsp>,
> +        fmc_boot_params_addr: u64,
> +    ) -> Result<u32> {
> +        dev_dbg!(dev, "Waiting for GSP lockdown release\n");
> +
> +        let mut mbox0: u32 = 0;
> +
> +        read_poll_timeout(
> +            || {
> +                let released = Self::gsp_lockdown_released(
> +                    dev,
> +                    gsp_falcon,
> +                    bar,
> +                    fmc_boot_params_addr,
> +                    &mut mbox0,
> +                );
> +
> +                Ok((released, mbox0))
> +            },
> +            |(released, _)| *released,
> +            Delta::ZERO,
> +            Delta::from_millis(4000),
> +        )
> +        .inspect_err(|_| {
> +            dev_err!(dev, "GSP lockdown release timeout\n");
> +        })

Once you're done with the error, please just return early with `?` and not keep
chaining.

Best,
Gary

> +        .map(|(_, mbox0)| mbox0)
> +        .and_then(|mbox0| {
> +            // Check mbox0 for error after wait completion
> +            if mbox0 != 0 {
> +                dev_err!(dev, "GSP-FMC boot failed (mbox: {:#x})\n", mbox0);
> +                Err(EIO)
> +            } else {
> +                dev_dbg!(
> +                    dev,
> +                    "GSP hardware lockdown fully released, proceeding with initialization\n"
> +                );
> +                Ok(mbox0)
> +            }
> +        })
> +    }
> +
>      /// Attempt to boot the GSP.
>      ///
>      /// This is a GPU-dependent and complex procedure that involves loading firmware files from
> diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs
> index 0d5c13f19073..a41d31449c65 100644
> --- a/drivers/gpu/nova-core/regs.rs
> +++ b/drivers/gpu/nova-core/regs.rs
> @@ -277,6 +277,7 @@ pub(crate) fn vga_workspace_addr(self) -> Option<u64> {
>  
>  register!(NV_PFALCON_FALCON_HWCFG2 @ PFalconBase[0x000000f4] {
>      10:10   riscv as bool;
> +    11:11   riscv_br_priv_lockdown as bool, "RISC-V branch privilege lockdown bit";
>      12:12   mem_scrubbing as bool, "Set to 0 after memory scrubbing is completed";
>      31:31   reset_ready as bool, "Signal indicating that reset is completed (GA102+)";
>  });


  parent reply	other threads:[~2026-01-21 16:20 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-03  5:58 [PATCH 00/31] gpu: nova-core: firmware: Hopper/Blackwell support John Hubbard
2025-12-03  5:58 ` [PATCH 01/31] gpu: nova-core: print FB sizes, along with ranges John Hubbard
2025-12-03 19:35   ` Timur Tabi
2025-12-04  7:27     ` John Hubbard
2026-01-13 13:28   ` Gary Guo
2026-01-13 13:42     ` Miguel Ojeda
2026-01-14  2:23     ` John Hubbard
2026-01-23  3:09       ` John Hubbard
2026-01-23 18:04         ` Gary Guo
2025-12-03  5:58 ` [PATCH 02/31] gpu: nova-core: add FbRange.len() and use it in boot.rs John Hubbard
2026-01-13 13:29   ` Gary Guo
2025-12-03  5:58 ` [PATCH 03/31] gpu: nova-core: Hopper/Blackwell: basic GPU identification John Hubbard
2025-12-03  5:58 ` [PATCH 04/31] nova-core: factor .fwsignature* selection into a new get_gsp_sigs_section() John Hubbard
2026-01-13 13:33   ` Gary Guo
2026-01-14  2:24     ` John Hubbard
2025-12-03  5:58 ` [PATCH 05/31] gpu: nova-core: use GPU Architecture to simplify HAL selections John Hubbard
2025-12-03 19:38   ` Timur Tabi
2025-12-04  7:28     ` John Hubbard
2025-12-03  5:58 ` [PATCH 06/31] gpu: nova-core: apply the one "use" item per line policy to commands.rs John Hubbard
2026-01-13 13:35   ` Gary Guo
2025-12-03  5:58 ` [PATCH 07/31] gpu: nova-core: set DMA mask width based on GPU architecture John Hubbard
2026-01-13 13:43   ` Gary Guo
2026-01-14  3:03     ` John Hubbard
2025-12-03  5:59 ` [PATCH 08/31] gpu: nova-core: move firmware image parsing code to firmware.rs John Hubbard
2026-01-13 13:44   ` Gary Guo
2025-12-03  5:59 ` [PATCH 09/31] gpu: nova-core: factor out a section_name_eq() function John Hubbard
2026-01-13 13:57   ` Gary Guo
2026-01-14  3:18     ` John Hubbard
2026-01-14 14:40       ` Gary Guo
2025-12-03  5:59 ` [PATCH 10/31] gpu: nova-core: don't assume 64-bit firmware images John Hubbard
2025-12-03  5:59 ` [PATCH 11/31] gpu: nova-core: add support for 32-bit " John Hubbard
2025-12-03  5:59 ` [PATCH 12/31] gpu: nova-core: add auto-detection of 32-bit, 64-bit " John Hubbard
2025-12-03  5:59 ` [PATCH 13/31] gpu: nova-core: Hopper/Blackwell: add FMC firmware image, in support of FSP John Hubbard
2025-12-03  5:59 ` [PATCH 14/31] gpu: nova-core: Hopper/Blackwell: add FSP falcon engine stub John Hubbard
2025-12-03  5:59 ` [PATCH 15/31] gpu: nova-core: Hopper/Blackwell: add FSP falcon EMEM operations John Hubbard
2025-12-03  6:04   ` Timur Tabi
2025-12-03  6:07     ` John Hubbard
2026-01-21 16:06   ` Gary Guo
2026-01-21 16:17     ` Miguel Ojeda
2026-01-23 23:48     ` John Hubbard
2025-12-03  5:59 ` [PATCH 16/31] gpu: nova-core: Hopper/Blackwell: add FSP message infrastructure John Hubbard
2025-12-05 16:47   ` Joel Fernandes
2026-01-03  2:15     ` John Hubbard
2025-12-03  5:59 ` [PATCH 17/31] gpu: nova-core: Hopper/Blackwell: calculate reserved FB heap size John Hubbard
2025-12-03 20:48   ` Timur Tabi
2025-12-04  7:34     ` John Hubbard
2026-01-21 16:10       ` Gary Guo
2026-01-23 23:56         ` John Hubbard
2025-12-03  5:59 ` [PATCH 18/31] gpu: nova-core: Hopper/Blackwell: add needs_large_reserved_mem() John Hubbard
2025-12-03 20:51   ` Timur Tabi
2025-12-04  7:36     ` John Hubbard
2025-12-03  5:59 ` [PATCH 19/31] gpu: nova-core: Hopper/Blackwell: add FSP secure boot completion waiting John Hubbard
2025-12-03  5:59 ` [PATCH 20/31] gpu: nova-core: Hopper/Blackwell: add FSP message structures John Hubbard
2025-12-03  5:59 ` [PATCH 21/31] gpu: nova-core: Hopper/Blackwell: add FMC signature extraction John Hubbard
2025-12-03 15:45   ` Joel Fernandes
2025-12-04  7:55     ` John Hubbard
2026-01-21 16:15   ` Gary Guo
2026-01-24  0:45     ` John Hubbard
2025-12-03  5:59 ` [PATCH 22/31] gpu: nova-core: Hopper/Blackwell: add FSP send/receive messaging John Hubbard
2025-12-03  5:59 ` [PATCH 23/31] gpu: nova-core: Hopper/Blackwell: add FSP Chain of Trust boot John Hubbard
2025-12-05 17:15   ` Joel Fernandes
2025-12-08  6:00     ` John Hubbard
2025-12-06 21:36   ` Joel Fernandes
2025-12-08  6:09     ` John Hubbard
2025-12-03  5:59 ` [PATCH 24/31] gpu: nova-core: Hopper/Blackwell: larger non-WPR heap John Hubbard
2026-01-21 16:18   ` Gary Guo
2026-01-24  1:50     ` John Hubbard
2025-12-03  5:59 ` [PATCH 25/31] gpu: nova-core: Hopper/Blackwell: larger WPR2 (GSP) heap John Hubbard
2025-12-03  5:59 ` [PATCH 26/31] gpu: nova-core: refactor SEC2 booter loading into run_booter() helper John Hubbard
2025-12-03 20:53   ` Timur Tabi
2025-12-04  7:37     ` John Hubbard
2025-12-03  5:59 ` [PATCH 27/31] gpu: nova-core: Hopper/Blackwell: skip GFW boot waiting John Hubbard
2025-12-03  5:59 ` [PATCH 28/31] gpu: nova-core: Hopper/Blackwell: add GSP lockdown release polling John Hubbard
2025-12-03 20:59   ` Timur Tabi
2025-12-04  7:49     ` John Hubbard
2026-01-21 16:20   ` Gary Guo [this message]
2026-01-24  1:10     ` John Hubbard
2025-12-03  5:59 ` [PATCH 29/31] gpu: nova-core: Hopper/Blackwell: add FSP Chain of Trust boot path John Hubbard
2026-01-21 16:35   ` Gary Guo
2026-01-24  1:38     ` John Hubbard
2026-01-24  1:42       ` John Hubbard
2026-01-26 13:08         ` Gary Guo
2026-01-26 19:53           ` John Hubbard
2025-12-03  5:59 ` [PATCH 30/31] gpu: nova-core: Hopper/Blackwell: new location for PCI config mirror John Hubbard
2025-12-03  5:59 ` [PATCH 31/31] gpu: nova-core: clarify the GPU firmware boot steps John Hubbard

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=DFUEKCHQISZL.GIHM3SA9PAZN@garyguo.net \
    --to=gary@garyguo.net \
    --cc=a.hindborg@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=airlied@gmail.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=apopple@nvidia.com \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=epeer@nvidia.com \
    --cc=jhubbard@nvidia.com \
    --cc=joelagnelf@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tmgross@umich.edu \
    --cc=ttabi@nvidia.com \
    --cc=zhiw@nvidia.com \
    /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