mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
gpu: nova-core: gsp: Boot GSP
Boot the GSP to the RISC-V active state. Completing the boot requires running the CPU sequencer which will be added in a future commit. Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Alistair Popple <apopple@nvidia.com> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Message-ID: <20251110-gsp_boot-v9-15-8ae4058e3c0e@nvidia.com>
This commit is contained in:
committed by
Alexandre Courbot
parent
945c1eee7d
commit
5949d419c1
@@ -616,14 +616,12 @@ impl<E: FalconEngine + 'static> Falcon<E> {
|
||||
/// Check if the RISC-V core is active.
|
||||
///
|
||||
/// Returns `true` if the RISC-V core is active, `false` otherwise.
|
||||
#[expect(unused)]
|
||||
pub(crate) fn is_riscv_active(&self, bar: &Bar0) -> bool {
|
||||
let cpuctl = regs::NV_PRISCV_RISCV_CPUCTL::read(bar, &E::ID);
|
||||
cpuctl.active_stat()
|
||||
}
|
||||
|
||||
/// Write the application version to the OS register.
|
||||
#[expect(dead_code)]
|
||||
pub(crate) fn write_os_version(&self, bar: &Bar0, app_version: u32) {
|
||||
regs::NV_PFALCON_FALCON_OS::default()
|
||||
.set_value(app_version)
|
||||
|
||||
@@ -57,7 +57,6 @@ impl RmRiscvUCodeDesc {
|
||||
}
|
||||
|
||||
/// A parsed firmware for a RISC-V core, ready to be loaded and run.
|
||||
#[expect(unused)]
|
||||
pub(crate) struct RiscvFirmware {
|
||||
/// Offset at which the code starts in the firmware image.
|
||||
pub(crate) code_offset: u32,
|
||||
@@ -66,7 +65,7 @@ pub(crate) struct RiscvFirmware {
|
||||
/// Offset at which the manifest starts in the firmware image.
|
||||
pub(crate) manifest_offset: u32,
|
||||
/// Application version.
|
||||
app_version: u32,
|
||||
pub(crate) app_version: u32,
|
||||
/// Device-mapped firmware image.
|
||||
pub(crate) ucode: DmaObject,
|
||||
}
|
||||
|
||||
@@ -4,8 +4,10 @@ use kernel::{
|
||||
device,
|
||||
dma::CoherentAllocation,
|
||||
dma_write,
|
||||
io::poll::read_poll_timeout,
|
||||
pci,
|
||||
prelude::*, //
|
||||
prelude::*,
|
||||
time::Delta, //
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@@ -143,7 +145,7 @@ impl super::Gsp {
|
||||
|
||||
Self::run_fwsec_frts(dev, gsp_falcon, bar, &bios, &fb_layout)?;
|
||||
|
||||
let _booter_loader = BooterFirmware::new(
|
||||
let booter_loader = BooterFirmware::new(
|
||||
dev,
|
||||
BooterKind::Loader,
|
||||
chipset,
|
||||
@@ -160,6 +162,65 @@ impl super::Gsp {
|
||||
.send_command(bar, commands::SetSystemInfo::new(pdev))?;
|
||||
self.cmdq.send_command(bar, commands::SetRegistry::new())?;
|
||||
|
||||
gsp_falcon.reset(bar)?;
|
||||
let libos_handle = self.libos.dma_handle();
|
||||
let (mbox0, mbox1) = gsp_falcon.boot(
|
||||
bar,
|
||||
Some(libos_handle as u32),
|
||||
Some((libos_handle >> 32) as u32),
|
||||
)?;
|
||||
dev_dbg!(
|
||||
pdev.as_ref(),
|
||||
"GSP MBOX0: {:#x}, MBOX1: {:#x}\n",
|
||||
mbox0,
|
||||
mbox1
|
||||
);
|
||||
|
||||
dev_dbg!(
|
||||
pdev.as_ref(),
|
||||
"Using SEC2 to load and run the booter_load firmware...\n"
|
||||
);
|
||||
|
||||
sec2_falcon.reset(bar)?;
|
||||
sec2_falcon.dma_load(bar, &booter_loader)?;
|
||||
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!(
|
||||
pdev.as_ref(),
|
||||
"SEC2 MBOX0: {:#x}, MBOX1{:#x}\n",
|
||||
mbox0,
|
||||
mbox1
|
||||
);
|
||||
|
||||
if mbox0 != 0 {
|
||||
dev_err!(
|
||||
pdev.as_ref(),
|
||||
"Booter-load failed with error {:#x}\n",
|
||||
mbox0
|
||||
);
|
||||
return Err(ENODEV);
|
||||
}
|
||||
|
||||
gsp_falcon.write_os_version(bar, gsp_fw.bootloader.app_version);
|
||||
|
||||
// Poll for RISC-V to become active before running sequencer
|
||||
read_poll_timeout(
|
||||
|| Ok(gsp_falcon.is_riscv_active(bar)),
|
||||
|val: &bool| *val,
|
||||
Delta::from_millis(10),
|
||||
Delta::from_secs(5),
|
||||
)?;
|
||||
|
||||
dev_dbg!(
|
||||
pdev.as_ref(),
|
||||
"RISC-V active? {}\n",
|
||||
gsp_falcon.is_riscv_active(bar),
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user