mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
gpu: nova-core: refactor SEC2 booter loading into BooterFirmware::run()
Move the SEC2 reset/load/boot sequence into a BooterFirmware::run() method. This is mostly refactoring, with no significant behavior change, done in preparation for adding an alternative FSP boot path. Suggested-by: Danilo Krummrich <dakr@kernel.org> Signed-off-by: John Hubbard <jhubbard@nvidia.com> Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> Link: https://patch.msgid.link/20260521-nova-unload-v6-4-65f581c812c9@nvidia.com [acourbot: fix typo in commit message.] Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
parent
60b8bfabf5
commit
c852faa981
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
|
||||
//! Support for loading and patching the `Booter` firmware. `Booter` is a Heavy Secured firmware
|
||||
//! running on [`Sec2`], that is used on Turing/Ampere to load the GSP firmware into the GSP falcon
|
||||
|
|
@ -8,6 +9,7 @@
|
|||
|
||||
use kernel::{
|
||||
device,
|
||||
dma::Coherent,
|
||||
prelude::*,
|
||||
transmute::FromBytes, //
|
||||
};
|
||||
|
|
@ -396,6 +398,35 @@ pub(crate) fn new(
|
|||
ucode: ucode_signed,
|
||||
})
|
||||
}
|
||||
|
||||
/// Load and run the booter firmware on SEC2.
|
||||
///
|
||||
/// Resets SEC2, loads this firmware image, then boots with the WPR metadata
|
||||
/// address passed via the SEC2 mailboxes.
|
||||
pub(crate) fn run<T>(
|
||||
&self,
|
||||
dev: &device::Device<device::Bound>,
|
||||
bar: &Bar0,
|
||||
sec2_falcon: &Falcon<Sec2>,
|
||||
wpr_meta: &Coherent<T>,
|
||||
) -> Result {
|
||||
sec2_falcon.reset(bar)?;
|
||||
sec2_falcon.load(dev, bar, self)?;
|
||||
let wpr_handle = wpr_meta.dma_handle();
|
||||
let (mbox0, mbox1) = sec2_falcon.boot(
|
||||
bar,
|
||||
Some(wpr_handle as u32),
|
||||
Some((wpr_handle >> 32) as u32),
|
||||
)?;
|
||||
dev_dbg!(dev, "SEC2 MBOX0: {:#x}, MBOX1: {:#x}\n", mbox0, mbox1);
|
||||
|
||||
if mbox0 != 0 {
|
||||
dev_err!(dev, "Booter-load failed with error {:#x}\n", mbox0);
|
||||
return Err(ENODEV);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl FalconDmaLoadable for BooterFirmware {
|
||||
|
|
|
|||
|
|
@ -171,15 +171,6 @@ pub(crate) fn boot(
|
|||
Self::run_fwsec_frts(dev, chipset, gsp_falcon, bar, &bios, &fb_layout)?;
|
||||
}
|
||||
|
||||
let booter_loader = BooterFirmware::new(
|
||||
dev,
|
||||
BooterKind::Loader,
|
||||
chipset,
|
||||
FIRMWARE_VERSION,
|
||||
sec2_falcon,
|
||||
bar,
|
||||
)?;
|
||||
|
||||
let wpr_meta = Coherent::init(dev, GFP_KERNEL, GspFwWprMeta::new(&gsp_fw, &fb_layout))?;
|
||||
|
||||
self.cmdq
|
||||
|
|
@ -201,20 +192,15 @@ pub(crate) fn boot(
|
|||
"Using SEC2 to load and run the booter_load firmware...\n"
|
||||
);
|
||||
|
||||
sec2_falcon.reset(bar)?;
|
||||
sec2_falcon.load(dev, bar, &booter_loader)?;
|
||||
let wpr_handle = wpr_meta.dma_handle();
|
||||
let (mbox0, mbox1) = sec2_falcon.boot(
|
||||
BooterFirmware::new(
|
||||
dev,
|
||||
BooterKind::Loader,
|
||||
chipset,
|
||||
FIRMWARE_VERSION,
|
||||
sec2_falcon,
|
||||
bar,
|
||||
Some(wpr_handle as u32),
|
||||
Some((wpr_handle >> 32) as u32),
|
||||
)?;
|
||||
dev_dbg!(pdev, "SEC2 MBOX0: {:#x}, MBOX1: {:#x}\n", mbox0, mbox1);
|
||||
|
||||
if mbox0 != 0 {
|
||||
dev_err!(pdev, "Booter-load failed with error {:#x}\n", mbox0);
|
||||
return Err(ENODEV);
|
||||
}
|
||||
)?
|
||||
.run(dev, bar, sec2_falcon, &wpr_meta)?;
|
||||
|
||||
gsp_falcon.write_os_version(bar, gsp_fw.bootloader.app_version);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user