// SPDX-License-Identifier: GPL-2.0 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. mod ga102; mod gh100; mod tu102; use kernel::prelude::*; use crate::{ firmware::gsp::GspFirmware, gpu::{ Architecture, Chipset, // }, gsp::{ Gsp, GspBootContext, // }, }; /// Trait for types containing the resources and code required to fully reset the GSP. /// /// The GSP unload code might run in a situation where we cannot load firmware dynamically (e.g. /// because we are in shutdown and the file system is not accessible anymore). Thus, the firmware /// required for unloading is prepared at load time, and stored here until it needs to be run. pub(super) trait UnloadBundle: Send { /// Performs the steps required to properly reset the GSP after it has been stopped. fn run(&self, ctx: &mut GspBootContext<'_, '_>) -> Result; } /// Trait implemented by GSP HALs. pub(super) trait GspHal: Send { /// Performs the GSP boot process, loading and running the required firmwares as needed. /// /// Upon success, returns the [`crate::gsp::UnloadBundle`] to use with [`Gsp::unload`], if one /// could be created. fn boot( &self, gsp: &Gsp, ctx: &mut GspBootContext<'_, '_>, gsp_fw: &GspFirmware, ) -> Result>; /// Performs HAL-specific post-GSP boot tasks. /// /// This method is called by the GSP boot code after the GSP is confirmed to be running, and /// after the initialization commands have been pushed onto its queue. fn post_boot( &self, _gsp: &Gsp, _ctx: &mut GspBootContext<'_, '_>, _gsp_fw: &GspFirmware, ) -> Result { Ok(()) } } /// Returns the names of the firmware files required to boot the GSP of `chipset`, in addition to /// the "bootloader" and "gsp" images required by all chipsets. pub(crate) const fn boot_firmware_files(chipset: Chipset) -> &'static [&'static str] { match chipset.arch() { // Turing chipsets boot the GSP via the SEC2 Booter, and require the FWSEC bootloader. Architecture::Turing => &["booter_load.tlv", "booter_unload.tlv", "gen_bootloader.tlv"], // GA100 also requires the FWSEC bootloader. Architecture::Ampere if matches!(chipset, Chipset::GA100) => { &["booter_load.tlv", "booter_unload.tlv", "gen_bootloader.tlv"] } // Other Ampere chipsets, as well as Ada chipsets, run FWSEC directly. Architecture::Ampere | Architecture::Ada => &["booter_load.tlv", "booter_unload.tlv"], // Hopper and later chipsets boot the GSP via the FMC image loaded by FSP. Architecture::Hopper | Architecture::BlackwellGB10x | Architecture::BlackwellGB20x => { &["fmc.tlv"] } } } /// Returns the GSP HAL to be used for `chipset`. pub(super) fn gsp_hal(chipset: Chipset) -> &'static dyn GspHal { match chipset.arch() { Architecture::Turing => tu102::TU102_HAL, Architecture::Ampere if matches!(chipset, Chipset::GA100) => tu102::TU102_HAL, Architecture::Ampere | Architecture::Ada => ga102::GA102_HAL, Architecture::Hopper | Architecture::BlackwellGB10x | Architecture::BlackwellGB20x => { gh100::GH100_HAL } } }