Danilo Krummrich
2025-Oct-25 10:01 UTC
[PATCH 2/2] gpu: nova: add boot42 support for next-gen GPUs
On Sat Oct 25, 2025 at 2:14 AM CEST, John Hubbard wrote:> + // "next-gen" GPUs (some time after Blackwell) will zero out boot0, and put the architecture > + // details in boot42 instead. Avoid reading boot42 unless we are in that case. > + let boot42 = if boot0.is_next_gen() { > + Some(regs::NV_PMC_BOOT_42::read(bar)) > + } else { > + None > + }; > + > try_pin_init!(Self { > chipset: { > - let chipset = boot0.chipset()?; > + // 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. > + // > + // 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. > + // > + // Future "next-gen" GPUs: > + // > + // Only supported by Nova. Boot42 has the architecture details, boot0 is zeroed > + // out. > + > + // NV04, the very first NVIDIA GPU to be supported on Linux, is identified by a > + // specific bit pattern in boot0. Although Nova does not support NV04 (see above), > + // it is possible to confuse NV04 with a "next-gen" GPU. Therefore, return early if > + // we specifically detect NV04, thus simplifying the remaining selection logic. > + if boot0.is_nv04() { > + Err(ENODEV)? > + } > + > + // Now that we know it is something more recent than NV04, use boot42 if we > + // previously determined that boot42 was both valid and relevant, and boot0 > + // otherwise. > + let (chipset, major_rev, minor_rev) = if let Some(boot42) = boot42 { > + ( > + boot42.chipset()?, > + boot42.major_revision(), > + boot42.minor_revision(), > + ) > + } else { > + // Current/older GPU: use BOOT0 > + ( > + boot0.chipset()?, > + boot0.major_revision(), > + boot0.minor_revision(), > + ) > + };Why open code all of the above in the struct Gpu constructor? This could all happen within Spec::new(). If we *really* don't want to store the Spec, but only the Chipset, you can also do: try_pin_init!(Self { chipset: { let spec = Spec::new(bar); dev_info!(pdev.as_ref(), "{}\n", spec); spec.chipset }, [...], }
John Hubbard
2025-Oct-25 17:32 UTC
[PATCH 2/2] gpu: nova: add boot42 support for next-gen GPUs
On 10/25/25 3:01 AM, Danilo Krummrich wrote:> On Sat Oct 25, 2025 at 2:14 AM CEST, John Hubbard wrote:...> Why open code all of the above in the struct Gpu constructor? This could all> happen within Spec::new(). >OK, yes, that does help avoid cluttering up Gpu::new().> If we *really* don't want to store the Spec, but only the Chipset, you can also > do: > > try_pin_init!(Self { > chipset: { > let spec = Spec::new(bar); > > dev_info!(pdev.as_ref(), "{}\n", spec); > > spec.chipsetRight. thanks, -- John Hubbard