Hopper (GH100) and Blackwell identification, including ELF .fwsignature_* items.
Signed-off-by: John Hubbard <[email protected]> --- 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 89babd5f9325..444c95fd4ece 100644 --- a/drivers/gpu/nova-core/falcon/hal.rs +++ b/drivers/gpu/nova-core/falcon/hal.rs @@ -76,7 +76,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..71fa92d1b709 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 | GH100 | AD102 | AD103 | AD104 | AD106 | AD107 + | 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 beabae9a1189..a529a5f1c3ee 100644 --- a/drivers/gpu/nova-core/firmware/gsp.rs +++ b/drivers/gpu/nova-core/firmware/gsp.rs @@ -224,6 +224,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), + } + } }; elf::elf64_section(firmware.data(), sigs_section) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 9b042ef1a308..289785530ad7 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -83,12 +83,22 @@ fn try_from(value: u32) -> Result<Self, Self::Error> { GA104 = 0x174, GA106 = 0x176, GA107 = 0x177, + // Hopper + GH100 = 0x180, // Ada AD102 = 0x192, AD103 = 0x193, AD104 = 0x194, AD106 = 0x196, AD107 = 0x197, + // Blackwell + GB100 = 0x1a0, + GB102 = 0x1a2, + GB202 = 0x1b2, + GB203 = 0x1b3, + GB205 = 0x1b5, + GB206 = 0x1b6, + GB207 = 0x1b7, }); impl Chipset { @@ -100,9 +110,17 @@ pub(crate) fn arch(&self) -> Architecture { Self::GA100 | Self::GA102 | Self::GA103 | Self::GA104 | Self::GA106 | Self::GA107 => { Architecture::Ampere } + Self::GH100 => Architecture::Hopper, Self::AD102 | Self::AD103 | Self::AD104 | Self::AD106 | Self::AD107 => { Architecture::Ada } + Self::GB100 + | Self::GB102 + | Self::GB202 + | Self::GB203 + | Self::GB205 + | Self::GB206 + | Self::GB207 => Architecture::Blackwell, } } } @@ -132,7 +150,9 @@ pub(crate) enum Architecture { #[default] Turing = 0x16, Ampere = 0x17, + Hopper = 0x18, Ada = 0x19, + Blackwell = 0x1b, } impl TryFrom<u8> for Architecture { @@ -142,7 +162,9 @@ fn try_from(value: u8) -> Result<Self> { match value { 0x16 => Ok(Self::Turing), 0x17 => Ok(Self::Ampere), + 0x18 => Ok(Self::Hopper), 0x19 => Ok(Self::Ada), + 0x1b => Ok(Self::Blackwell), _ => Err(ENODEV), } } -- 2.52.0
