John Hubbard
2025-Oct-30 01:07 UTC
[PATCH v3 2/2] gpu: nova-core: add boot42 support for next-gen GPUs
On 10/29/25 6:01 PM, Timur Tabi wrote:> On Wed, 2025-10-29 at 17:35 -0700, John Hubbard wrote: >> ??????? // "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. > > I don't want to kick a dead horse here, but aren't the architecture details already in boot42 > for Turing? I thought the whole point was that we don't need boot0 any more, and only Nouveau > has to worry about boot0 vs boot42.Yes, but someone can still plug in a pre-Turing GPU and try to boot up with nova-core.ko on the system. So it's important to avoid getting into trouble in that case. thanks, John Hubbard
John Hubbard
2025-Oct-30 01:13 UTC
[PATCH v3 2/2] gpu: nova-core: add boot42 support for next-gen GPUs
On 10/29/25 6:07 PM, John Hubbard wrote:> On 10/29/25 6:01 PM, Timur Tabi wrote: >> On Wed, 2025-10-29 at 17:35 -0700, John Hubbard wrote: >>> ???????? // "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. >> >> I don't want to kick a dead horse here, but aren't the architecture >> details already in boot42 >> for Turing?? I thought the whole point was that we don't need boot0 >> any more, and only Nouveau >> has to worry about boot0 vs boot42. > > Yes, but someone can still plug in a pre-Turing GPU and try to > boot up with nova-core.ko on the system. > > So it's important to avoid getting into trouble in that case.In fact, here's what I have staged for the next posting: 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 // // 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); if boot0.use_boot42_instead() { Spec::try_from(regs::NV_PMC_BOOT_42::read(bar)) } else { Spec::try_from(boot0) } } }
Timur Tabi
2025-Oct-30 01:44 UTC
[PATCH v3 2/2] gpu: nova-core: add boot42 support for next-gen GPUs
On Wed, 2025-10-29 at 18:07 -0700, John Hubbard wrote:> Yes, but someone can still plug in a pre-Turing GPU and try to > boot up with nova-core.ko on the system. > > So it's important to avoid getting into trouble in that case.Sure, but I think we don't want any real code that looks at boot0. Nova should really just look at boot42 to determine any architecture. So what we really want is to avoid accidentally reading boot42 on GPUs where it doesn't exist. I believe that the oldest GPU that supports boot42 is Fermi GF100, or chipset id 0x0c0. So we can do something like this: fn is_gpu_ancient(bar: &Bar0) -> bool { let boot0 = regs::NV_PMC_BOOT_0::read(bar); if boot0.architecture_1() == 0 && boot0.architecture_0() < 0x0c0 { return true; } else { return false; } At the beginning of probe(), if is_gpu_ancient() returns true, just exit immediately. Then the rest of the driver can happily ignore boot0 completely and use boot42 for everything. Just my two cents.