rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Timur Tabi <ttabi@nvidia.com>
To: "dakr@kernel.org" <dakr@kernel.org>, John Hubbard <jhubbard@nvidia.com>
Cc: Alexandre Courbot <acourbot@nvidia.com>,
	"lossin@kernel.org" <lossin@kernel.org>,
	"a.hindborg@kernel.org" <a.hindborg@kernel.org>,
	"boqun.feng@gmail.com" <boqun.feng@gmail.com>,
	"aliceryhl@google.com" <aliceryhl@google.com>,
	Zhi Wang <zhiw@nvidia.com>, "simona@ffwll.ch" <simona@ffwll.ch>,
	"alex.gaynor@gmail.com" <alex.gaynor@gmail.com>,
	"ojeda@kernel.org" <ojeda@kernel.org>,
	"tmgross@umich.edu" <tmgross@umich.edu>,
	"nouveau@lists.freedesktop.org" <nouveau@lists.freedesktop.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"rust-for-linux@vger.kernel.org" <rust-for-linux@vger.kernel.org>,
	"bjorn3_gh@protonmail.com" <bjorn3_gh@protonmail.com>,
	Edwin Peer <epeer@nvidia.com>,
	"airlied@gmail.com" <airlied@gmail.com>,
	Joel Fernandes <joelagnelf@nvidia.com>,
	"bhelgaas@google.com" <bhelgaas@google.com>,
	"gary@garyguo.net" <gary@garyguo.net>,
	Alistair Popple <apopple@nvidia.com>
Subject: Re: [PATCH v4 3/3] gpu: nova-core: add boot42 support for next-gen GPUs
Date: Sun, 2 Nov 2025 18:14:30 +0000	[thread overview]
Message-ID: <4c6df1aa00dab5b7e2a43c952180fc74e40f146a.camel@nvidia.com> (raw)
In-Reply-To: <20251102013656.423235-4-jhubbard@nvidia.com>

On Sat, 2025-11-01 at 18:36 -0700, John Hubbard wrote:
> NVIDIA GPUs are moving away from using NV_PMC_BOOT_0 to contain
> architecture and revision details, and will instead use NV_PMC_BOOT_42
> in the future. NV_PMC_BOOT_0 will be zeroed out.

You missed this one.  Boot0 will not be completely zeroed out.

> 
>  
> +impl TryFrom<regs::NV_PMC_BOOT_42> for Spec {
> +    type Error = Error;
> +
> +    fn try_from(boot42: regs::NV_PMC_BOOT_42) -> Result<Self> {
> +        Ok(Self {
> +            chipset: boot42.chipset()?,
> +            revision: boot42.revision(),
> +        })
> +    }
> +}
> +
>  impl fmt::Display for Revision {
>      fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
>          write!(f, "{:x}.{:x}", self.major, self.minor)
> @@ -169,9 +180,34 @@ pub(crate) struct Spec {
>  
>  impl Spec {
>      fn new(bar: &Bar0) -> Result<Spec> {
> +        // Some brief notes about boot0 and boot42, in chronological order:
> +        //
> +        // NV04 through Volta:
> +        //
> +        //    Not supported by Nova. boot0 is necessary and sufficient to identify these
> GPUs.
> +        //    boot42 may not even exist on some of these GPUs.boot42

Did you intend to write more than just "boot42" at the end here?

> +        //
> +        // Turing through Blackwell:
> +        //
> +        //     Supported by both Nouveau and Nova. boot0 is still necessary and sufficient to
> +        //     identify these GPUs. boot42 exists on these GPUs but we don't need to use it.
> +        //
> +        // Rubin:
> +        //
> +        //     Only supported by Nova. Need to use boot42 to fully identify these GPUs.
> +        //
> +        // "Future" (after Rubin) GPUs:
> +        //
> +        //    Only supported by Nova. NV_PMC_BOOT's ARCH_0 (bits 28:24) will be zeroed out,
> and
> +        //    ARCH_1 (bit 8:8) will be set to 1, which will mean, "refer to NV_PMC_BOOT_42".
> +
>          let boot0 = regs::NV_PMC_BOOT_0::read(bar);
>  
> -        Spec::try_from(boot0)
> +        if boot0.use_boot42_instead() {
> +            Spec::try_from(regs::NV_PMC_BOOT_42::read(bar))
> +        } else {
> +            Spec::try_from(boot0)
> +        }
>      }
>  }
>  
> diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs
> index 207b865335af..8b5ff3858210 100644
> --- a/drivers/gpu/nova-core/regs.rs
> +++ b/drivers/gpu/nova-core/regs.rs
> @@ -25,6 +25,13 @@
>  });
>  
>  impl NV_PMC_BOOT_0 {
> +    pub(crate) fn use_boot42_instead(self) -> bool {
> +        // "Future" GPUs (some time after Rubin) will set `architecture_0`
> +        // to 0, and `architecture_1` to 1, and put the architecture details in
> +        // boot42 instead.
> +        self.architecture_0() == 0 && self.architecture_1() == 1
> +    }

So this was the crux of my initial objection, and I just don't think this is truly "forward
looking".  The code is using boot42 only if boot0 is "zeroed out".  So sometimes Nova will use
boot0 and sometimes it will use boot42, depending on the GPU.  It's this inconsistency that
bothers me.

Instead, I think Nova should use only boot42, so that we have consistent information across all
GPUs.  boot0 should only be used to avoid accidentally reading boot42 when it doesn't exist.

Previously, Danilo said this:

> I think you're indeed talking about the same thing, but thinking differently
> about the implementation details.
> 
> A standalone is_ancient_gpu() function called from probe() like
> 
> 	if is_ancient_gpu(bar) {
> 		return Err(ENODEV);
> 	}
> 
> is what we would probably do in C, but in Rust we should just call
> 
> 	let spec = Spec::new()?;
> 
> from probe() and Spec::new() will return Err(ENODEV) when it run into an ancient
> GPU spec internally.

This I agree with.  The first thing that Spec::new() should do is check whether we're on an
ancient GPU that does not even have boot42.  If so, return Err(ENODEV).  Otherwise, from that
point onward, no code will ever look at boot0 again.  boot0 should never be used to return the
actual architecture/gpu information.


  reply	other threads:[~2025-11-02 18:14 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-02  1:36 [PATCH v4 0/3] gpu: nova: add boot42 support for next-gen GPUs John Hubbard
2025-11-02  1:36 ` [PATCH v4 1/3] gpu: nova-core: prepare Spec and Revision types for boot0/boot42 John Hubbard
2025-11-02  1:36 ` [PATCH v4 2/3] gpu: nova-core: make Architecture behave as a u8 type John Hubbard
2025-11-02  1:36 ` [PATCH v4 3/3] gpu: nova-core: add boot42 support for next-gen GPUs John Hubbard
2025-11-02 18:14   ` Timur Tabi [this message]
2025-11-03  1:04     ` John Hubbard
2025-11-03  4:59       ` Timur Tabi

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=4c6df1aa00dab5b7e2a43c952180fc74e40f146a.camel@nvidia.com \
    --to=ttabi@nvidia.com \
    --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=gary@garyguo.net \
    --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=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;
as well as URLs for NNTP newsgroup(s).