Keep Gsp::new() from getting too cluttered, by factoring out the selection of .fwsignature* items. This will continue to grow as we add GPUs.
Reviewed-by: Gary Guo <[email protected]> Signed-off-by: John Hubbard <[email protected]> --- drivers/gpu/nova-core/firmware/gsp.rs | 60 ++++++++++++++------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/nova-core/firmware/gsp.rs b/drivers/gpu/nova-core/firmware/gsp.rs index a529a5f1c3ee..072881e0a62b 100644 --- a/drivers/gpu/nova-core/firmware/gsp.rs +++ b/drivers/gpu/nova-core/firmware/gsp.rs @@ -148,6 +148,36 @@ pub(crate) struct GspFirmware { } impl GspFirmware { + fn get_gsp_sigs_section(chipset: Chipset) -> Option<&'static str> { + match chipset.arch() { + Architecture::Turing if matches!(chipset, Chipset::TU116 | Chipset::TU117) => { + Some(".fwsignature_tu11x") + } + Architecture::Turing => Some(".fwsignature_tu10x"), + // GA100 uses the same firmware as Turing + Architecture::Ampere if chipset == Chipset::GA100 => Some(".fwsignature_tu10x"), + Architecture::Ampere => Some(".fwsignature_ga10x"), + Architecture::Ada => Some(".fwsignature_ad10x"), + Architecture::Hopper => Some(".fwsignature_gh10x"), + Architecture::Blackwell => { + // Distinguish between GB10x and GB20x series + match chipset { + // GB10x series: GB100, GB102 + Chipset::GB100 | Chipset::GB102 => Some(".fwsignature_gb10x"), + // GB20x series: GB202, GB203, GB205, GB206, GB207 + Chipset::GB202 + | Chipset::GB203 + | Chipset::GB205 + | Chipset::GB206 + | Chipset::GB207 => Some(".fwsignature_gb20x"), + // It's not possible to get here with a non-Blackwell chipset, but Rust doesn't + // know that. + _ => None, + } + } + } + } + /// Loads the GSP firmware binaries, map them into `dev`'s address-space, and creates the page /// tables expected by the GSP bootloader to load it. pub(crate) fn new<'a>( @@ -213,35 +243,7 @@ pub(crate) fn new<'a>( }, size, signatures: { - let sigs_section = match chipset.arch() { - Architecture::Turing - if matches!(chipset, Chipset::TU116 | Chipset::TU117) => - { - ".fwsignature_tu11x" - } - Architecture::Turing => ".fwsignature_tu10x", - // GA100 uses the same firmware as Turing - 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), - } - } - }; + let sigs_section = Self::get_gsp_sigs_section(chipset).ok_or(ENOTSUPP)?; elf::elf64_section(firmware.data(), sigs_section) .ok_or(EINVAL) -- 2.52.0
