Timur Tabi
2025-Nov-08 05:09 UTC
[PATCH v6 4/4] gpu: nova-core: add boot42 support for next-gen GPUs
On Fri, 2025-11-07 at 20:39 -0800, John Hubbard wrote:> +??????? // Turing and later: > +??????? // > +??????? //???? Supported by Nova. Identified by first checking boot0 to ensure that the GPU > is not > +??????? //???? from an earlier (pre-Fermi) era, and then using boot42 to precisely identify > the GPU. > +??????? //???? Somewhere in the Rubin timeframe, boot0 will no longer have space to add new > GPU IDs. > + > ???????? 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) > +??????? } > ???? }Spec::try_from(boot0) will always fail, because we can't generate a Spec from a pre-Turing GPU, so it seems weird that we have it as an else condition. I don't think the comment and the code aligns. The code implies that sometimes we'll be using boot0 to generate the Spec, but that isn't true. However, the comment makes it clear that we'll be using boot42 only.
John Hubbard
2025-Nov-08 05:19 UTC
[PATCH v6 4/4] gpu: nova-core: add boot42 support for next-gen GPUs
On 11/7/25 9:09 PM, Timur Tabi wrote:> On Fri, 2025-11-07 at 20:39 -0800, John Hubbard wrote:...>> ???????? 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) >> +??????? } >> ???? } > > Spec::try_from(boot0) will always fail, because we can't generate a Spec from a pre-Turing GPU, > so it seems weird that we have it as an else condition. > > I don't think the comment and the code aligns. The code implies that sometimes we'll be using > boot0 to generate the Spec, but that isn't true. However, the comment makes it clear that we'll > be using boot42 only.Hmmm, yes, the new use_boot42_instead() logic means that most of the boot0 logic should actually be deleted now. OK, so I can apply this diff on top, and everything still works: diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 5650c115c613..6d17ad3cec40 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -194,22 +194,11 @@ fn new(bar: &Bar0) -> Result<Spec> { if boot0.use_boot42_instead() { Spec::try_from(regs::NV_PMC_BOOT_42::read(bar)) } else { - Spec::try_from(boot0) + Err(ENOTSUPP) } } } -impl TryFrom<regs::NV_PMC_BOOT_0> for Spec { - type Error = Error; - - fn try_from(boot0: regs::NV_PMC_BOOT_0) -> Result<Self> { - Ok(Self { - chipset: boot0.chipset()?, - revision: boot0.revision(), - }) - } -} - impl TryFrom<regs::NV_PMC_BOOT_42> for Spec { type Error = Error; diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 5d6397f6450a..018bee114a3f 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -56,31 +56,6 @@ pub(crate) fn use_boot42_instead(self) -> bool { !self.older_than_fermi() } - - /// Combines `architecture_0` and `architecture_1` to obtain the architecture of the chip. - pub(crate) fn architecture(self) -> Result<Architecture> { - Architecture::try_from( - self.architecture_0() | (self.architecture_1() << Self::ARCHITECTURE_0_RANGE.len()), - ) - } - - /// Combines `architecture` and `implementation` to obtain a code unique to the chipset. - pub(crate) fn chipset(self) -> Result<Chipset> { - self.architecture() - .map(|arch| { - ((arch as u32) << Self::IMPLEMENTATION_RANGE.len()) - | u32::from(self.implementation()) - }) - .and_then(Chipset::try_from) - } - - /// Returns the revision information of the chip. - pub(crate) fn revision(self) -> Revision { - Revision { - major: self.major_revision(), - minor: self.minor_revision(), - } - } } register!(NV_PMC_BOOT_42 @ 0x00000a00, "Extended architecture information" { thanks, -- John Hubbard