xref: /linux/drivers/gpu/nova-core/gsp/hal.rs (revision 570f7e331f5febb30f1384817463c7e42b65ca7d)
1 // SPDX-License-Identifier: GPL-2.0
2 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3 
4 mod ga102;
5 mod gh100;
6 mod tu102;
7 
8 use kernel::prelude::*;
9 
10 use crate::{
11     firmware::gsp::GspFirmware,
12     gpu::{
13         Architecture,
14         Chipset, //
15     },
16     gsp::{
17         Gsp,
18         GspBootContext, //
19     },
20 };
21 
22 /// Trait for types containing the resources and code required to fully reset the GSP.
23 ///
24 /// The GSP unload code might run in a situation where we cannot load firmware dynamically (e.g.
25 /// because we are in shutdown and the file system is not accessible anymore). Thus, the firmware
26 /// required for unloading is prepared at load time, and stored here until it needs to be run.
27 pub(super) trait UnloadBundle: Send {
28     /// Performs the steps required to properly reset the GSP after it has been stopped.
29     fn run(&self, ctx: &mut GspBootContext<'_, '_>) -> Result;
30 }
31 
32 /// Trait implemented by GSP HALs.
33 pub(super) trait GspHal: Send {
34     /// Performs the GSP boot process, loading and running the required firmwares as needed.
35     ///
36     /// Upon success, returns the [`crate::gsp::UnloadBundle`] to use with [`Gsp::unload`], if one
37     /// could be created.
38     fn boot(
39         &self,
40         gsp: &Gsp,
41         ctx: &mut GspBootContext<'_, '_>,
42         gsp_fw: &GspFirmware,
43     ) -> Result<Option<crate::gsp::UnloadBundle>>;
44 
45     /// Performs HAL-specific post-GSP boot tasks.
46     ///
47     /// This method is called by the GSP boot code after the GSP is confirmed to be running, and
48     /// after the initialization commands have been pushed onto its queue.
49     fn post_boot(
50         &self,
51         _gsp: &Gsp,
52         _ctx: &mut GspBootContext<'_, '_>,
53         _gsp_fw: &GspFirmware,
54     ) -> Result {
55         Ok(())
56     }
57 }
58 
59 /// Returns the names of the firmware files required to boot the GSP of `chipset`, in addition to
60 /// the "bootloader" and "gsp" images required by all chipsets.
61 pub(crate) const fn boot_firmware_files(chipset: Chipset) -> &'static [&'static str] {
62     match chipset.arch() {
63         // Turing chipsets boot the GSP via the SEC2 Booter, and require the FWSEC bootloader.
64         Architecture::Turing => &["booter_load.tlv", "booter_unload.tlv", "gen_bootloader.tlv"],
65         // GA100 also requires the FWSEC bootloader.
66         Architecture::Ampere if matches!(chipset, Chipset::GA100) => {
67             &["booter_load.tlv", "booter_unload.tlv", "gen_bootloader.tlv"]
68         }
69         // Other Ampere chipsets, as well as Ada chipsets, run FWSEC directly.
70         Architecture::Ampere | Architecture::Ada => &["booter_load.tlv", "booter_unload.tlv"],
71         // Hopper and later chipsets boot the GSP via the FMC image loaded by FSP.
72         Architecture::Hopper | Architecture::BlackwellGB10x | Architecture::BlackwellGB20x => {
73             &["fmc.tlv"]
74         }
75     }
76 }
77 
78 /// Returns the GSP HAL to be used for `chipset`.
79 pub(super) fn gsp_hal(chipset: Chipset) -> &'static dyn GspHal {
80     match chipset.arch() {
81         Architecture::Turing => tu102::TU102_HAL,
82         Architecture::Ampere if matches!(chipset, Chipset::GA100) => tu102::TU102_HAL,
83         Architecture::Ampere | Architecture::Ada => ga102::GA102_HAL,
84         Architecture::Hopper | Architecture::BlackwellGB10x | Architecture::BlackwellGB20x => {
85             gh100::GH100_HAL
86         }
87     }
88 }
89