Re: [PATCH v6 03/34] gpu: nova-core: Hopper/Blackwell: basic GPU identification

From: Alexandre Courbot

Date: Tue Mar 10 2026 - 04:09:25 EST


On Tue Mar 10, 2026 at 11:10 AM JST, John Hubbard wrote:
> Hopper (GH100) and Blackwell identification, including ELF
> .fwsignature_* items.
>
> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>
> ---
> drivers/gpu/nova-core/falcon/hal.rs | 3 ++-
> drivers/gpu/nova-core/fb/hal.rs | 5 ++---
> drivers/gpu/nova-core/firmware/gsp.rs | 17 +++++++++++++++++
> drivers/gpu/nova-core/gpu.rs | 22 ++++++++++++++++++++++
> 4 files changed, 43 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/falcon/hal.rs b/drivers/gpu/nova-core/falcon/hal.rs
> index a7e5ea8d0272..c7f12f2a7a35 100644
> --- a/drivers/gpu/nova-core/falcon/hal.rs
> +++ b/drivers/gpu/nova-core/falcon/hal.rs
> @@ -80,7 +80,8 @@ pub(super) fn falcon_hal<E: FalconEngine + 'static>(
> TU102 | TU104 | TU106 | TU116 | TU117 => {
> KBox::new(tu102::Tu102::<E>::new(), GFP_KERNEL)? as KBox<dyn FalconHal<E>>
> }
> - GA102 | GA103 | GA104 | GA106 | GA107 | AD102 | AD103 | AD104 | AD106 | AD107 => {
> + GA102 | GA103 | GA104 | GA106 | GA107 | AD102 | AD103 | AD104 | AD106 | AD107 | GH100
> + | GB100 | GB102 | GB202 | GB203 | GB205 | GB206 | GB207 => {
> KBox::new(ga102::Ga102::<E>::new(), GFP_KERNEL)? as KBox<dyn FalconHal<E>>
> }
> _ => return Err(ENOTSUPP),
> diff --git a/drivers/gpu/nova-core/fb/hal.rs b/drivers/gpu/nova-core/fb/hal.rs
> index aba0abd8ee00..e709affaa7e8 100644
> --- a/drivers/gpu/nova-core/fb/hal.rs
> +++ b/drivers/gpu/nova-core/fb/hal.rs
> @@ -34,8 +34,7 @@ pub(super) fn fb_hal(chipset: Chipset) -> &'static dyn FbHal {
> match chipset {
> TU102 | TU104 | TU106 | TU117 | TU116 => tu102::TU102_HAL,
> GA100 => ga100::GA100_HAL,
> - GA102 | GA103 | GA104 | GA106 | GA107 | AD102 | AD103 | AD104 | AD106 | AD107 => {
> - ga102::GA102_HAL
> - }
> + GA102 | GA103 | GA104 | GA106 | GA107 | AD102 | AD103 | AD104 | AD106 | AD107 | GH100
> + | GB100 | GB102 | GB202 | GB203 | GB205 | GB206 | GB207 => ga102::GA102_HAL,
> }
> }
> diff --git a/drivers/gpu/nova-core/firmware/gsp.rs b/drivers/gpu/nova-core/firmware/gsp.rs
> index 9488a626352f..bc2243450989 100644
> --- a/drivers/gpu/nova-core/firmware/gsp.rs
> +++ b/drivers/gpu/nova-core/firmware/gsp.rs
> @@ -222,6 +222,23 @@ pub(crate) fn new<'a>(
> Architecture::Ampere if chipset == Chipset::GA100 => ".fwsignature_tu10x",
> Architecture::Ampere => ".fwsignature_ga10x",
> Architecture::Ada => ".fwsignature_ad10x",
> + Architecture::Hopper => ".fwsignature_gh10x",
> + Architecture::Blackwell => {
> + // Distinguish between GB10x and GB20x series
> + match chipset {
> + // GB10x series: GB100, GB102
> + Chipset::GB100 | Chipset::GB102 => ".fwsignature_gb10x",
> + // GB20x series: GB202, GB203, GB205, GB206, GB207
> + Chipset::GB202
> + | Chipset::GB203
> + | Chipset::GB205
> + | Chipset::GB206
> + | Chipset::GB207 => ".fwsignature_gb20x",
> + // It's not possible to get here with a non-Blackwell chipset, but
> + // Rust doesn't know that.
> + _ => return Err(ENOTSUPP),
> + }
> + }

Can we use the same trick as Turing above to avoid the double-match and
unused catch-all statement? That would look something like:

Architecture::Blackwell if matches!(chipset, Chipset::GB100 | Chipset::GB102) => {
Some(".fwsignature_gb10x")
}
Architecture::Blackwell => Some(".fwsignature_gb20x"),

Note that this is not perfect either, but it is at least more succint.