mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
gpu: nova-core: gsp: fold TU102 unload bundle construction into HAL method
The construction of the unload bundle is currently a bit convoluted and could be done in one function instead of two. Additionally, turn that function into a method of `Tu102`. A following patch will turn the "use FWSEC bootloader" property into a flag of the TU102 HAL itself, and making this a method will allow the code to access it instead of querying `Chipset`. Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> Link: https://patch.msgid.link/20260709-nova-bootcontext-v6-6-520cbf8b9b50@nvidia.com Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
parent
92faa16f34
commit
436f3c4ac4
|
|
@ -56,22 +56,6 @@ enum FwsecUnloadFirmware {
|
|||
}
|
||||
|
||||
impl FwsecUnloadFirmware {
|
||||
/// Loads the FWSEC SB firmware, as well as its bootloader if `chipset` requires it.
|
||||
fn new(
|
||||
dev: &device::Device<device::Bound>,
|
||||
chipset: Chipset,
|
||||
bios: &Vbios,
|
||||
gsp_falcon: &Falcon<'_, GspEngine>,
|
||||
) -> Result<Self> {
|
||||
let fwsec_sb = FwsecFirmware::new(dev, gsp_falcon, bios, FwsecCommand::Sb)?;
|
||||
|
||||
Ok(if chipset.needs_fwsec_bootloader() {
|
||||
Self::WithBl(FwsecFirmwareWithBl::new(fwsec_sb, dev, chipset)?)
|
||||
} else {
|
||||
Self::WithoutBl(fwsec_sb)
|
||||
})
|
||||
}
|
||||
|
||||
/// Runs the FWSEC SB firmware.
|
||||
fn run(
|
||||
&self,
|
||||
|
|
@ -93,33 +77,6 @@ struct Sec2UnloadBundle {
|
|||
booter_unloader: BooterFirmware,
|
||||
}
|
||||
|
||||
impl Sec2UnloadBundle {
|
||||
/// Load and prepare the resources required to properly reset the GSP after it has been stopped.
|
||||
fn build(
|
||||
dev: &device::Device<device::Bound>,
|
||||
chipset: Chipset,
|
||||
bios: &Vbios,
|
||||
gsp_falcon: &Falcon<'_, GspEngine>,
|
||||
sec2_falcon: &Falcon<'_, Sec2>,
|
||||
) -> Result<KBox<dyn UnloadBundle>> {
|
||||
KBox::new(
|
||||
Self {
|
||||
fwsec_sb: FwsecUnloadFirmware::new(dev, chipset, bios, gsp_falcon)?,
|
||||
booter_unloader: BooterFirmware::new(
|
||||
dev,
|
||||
BooterKind::Unloader,
|
||||
chipset,
|
||||
FIRMWARE_VERSION,
|
||||
sec2_falcon,
|
||||
)?,
|
||||
},
|
||||
GFP_KERNEL,
|
||||
)
|
||||
.map(|b| b as KBox<dyn UnloadBundle>)
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl UnloadBundle for Sec2UnloadBundle {
|
||||
fn run(&self, ctx: &GspBootContext<'_>) -> Result {
|
||||
let dev = ctx.dev();
|
||||
|
|
@ -257,6 +214,42 @@ fn run_fwsec_frts(
|
|||
|
||||
struct Tu102;
|
||||
|
||||
impl Tu102 {
|
||||
/// Load and prepare the resources required to properly reset the GSP after it has been stopped.
|
||||
fn build_unload_bundle(
|
||||
&self,
|
||||
dev: &device::Device<device::Bound>,
|
||||
chipset: Chipset,
|
||||
bios: &Vbios,
|
||||
gsp_falcon: &Falcon<'_, GspEngine>,
|
||||
sec2_falcon: &Falcon<'_, Sec2>,
|
||||
) -> Result<crate::gsp::UnloadBundle> {
|
||||
// Load the FWSEC SB firmware, as well as its bootloader if required.
|
||||
let fwsec_sb = FwsecFirmware::new(dev, gsp_falcon, bios, FwsecCommand::Sb)?;
|
||||
let fwsec_sb = if chipset.needs_fwsec_bootloader() {
|
||||
FwsecUnloadFirmware::WithBl(FwsecFirmwareWithBl::new(fwsec_sb, dev, chipset)?)
|
||||
} else {
|
||||
FwsecUnloadFirmware::WithoutBl(fwsec_sb)
|
||||
};
|
||||
|
||||
KBox::new(
|
||||
Sec2UnloadBundle {
|
||||
fwsec_sb,
|
||||
booter_unloader: BooterFirmware::new(
|
||||
dev,
|
||||
BooterKind::Unloader,
|
||||
chipset,
|
||||
FIRMWARE_VERSION,
|
||||
sec2_falcon,
|
||||
)?,
|
||||
},
|
||||
GFP_KERNEL,
|
||||
)
|
||||
.map(|b| crate::gsp::UnloadBundle(b))
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl GspHal for Tu102 {
|
||||
fn boot(
|
||||
&self,
|
||||
|
|
@ -277,10 +270,10 @@ fn boot(
|
|||
//
|
||||
// If the unload bundle creation fails, the GPU will need to be reset before the driver can
|
||||
// be probed again.
|
||||
let unload_bundle = Sec2UnloadBundle::build(dev, chipset, &bios, gsp_falcon, sec2_falcon)
|
||||
let unload_bundle = self
|
||||
.build_unload_bundle(dev, chipset, &bios, gsp_falcon, sec2_falcon)
|
||||
.inspect_err(|e| dev_warn!(dev, "Failed to prepare unload firmware: {:?}\n", e))
|
||||
.ok()
|
||||
.map(crate::gsp::UnloadBundle);
|
||||
.ok();
|
||||
|
||||
// Run the unload bundle to try and recover the GSP if an error occurs.
|
||||
let unload_guard = ScopeGuard::new_with_data(unload_bundle, |unload_bundle| {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user