// 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<Option<crate::gsp::UnloadBundle>>; /// 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 } }}
// 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<Option<crate::gsp::UnloadBundle>>;
/// 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
}
}
}