88 lines · 3.3 KB · Rust
RawDownload
// 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        }    }}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t