mirror of
https://github.com/torvalds/linux.git
synced 2026-05-04 14:32:27 -04:00
Implement core resume operation. This is the last step of the sequencer resulting in resume of the GSP and proceeding to INIT_DONE stage of GSP boot. Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Message-ID: <20251114195552.739371-12-joelagnelf@nvidia.com>
58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
use kernel::{
|
|
io::poll::read_poll_timeout,
|
|
prelude::*,
|
|
time::Delta, //
|
|
};
|
|
|
|
use crate::{
|
|
driver::Bar0,
|
|
falcon::{
|
|
Falcon,
|
|
FalconEngine,
|
|
PFalcon2Base,
|
|
PFalconBase, //
|
|
},
|
|
regs::{
|
|
self,
|
|
macros::RegisterBase, //
|
|
},
|
|
};
|
|
|
|
/// Type specifying the `Gsp` falcon engine. Cannot be instantiated.
|
|
pub(crate) struct Gsp(());
|
|
|
|
impl RegisterBase<PFalconBase> for Gsp {
|
|
const BASE: usize = 0x00110000;
|
|
}
|
|
|
|
impl RegisterBase<PFalcon2Base> for Gsp {
|
|
const BASE: usize = 0x00111000;
|
|
}
|
|
|
|
impl FalconEngine for Gsp {
|
|
const ID: Self = Gsp(());
|
|
}
|
|
|
|
impl Falcon<Gsp> {
|
|
/// Clears the SWGEN0 bit in the Falcon's IRQ status clear register to
|
|
/// allow GSP to signal CPU for processing new messages in message queue.
|
|
pub(crate) fn clear_swgen0_intr(&self, bar: &Bar0) {
|
|
regs::NV_PFALCON_FALCON_IRQSCLR::default()
|
|
.set_swgen0(true)
|
|
.write(bar, &Gsp::ID);
|
|
}
|
|
|
|
/// Checks if GSP reload/resume has completed during the boot process.
|
|
pub(crate) fn check_reload_completed(&self, bar: &Bar0, timeout: Delta) -> Result<bool> {
|
|
read_poll_timeout(
|
|
|| Ok(regs::NV_PGC6_BSI_SECURE_SCRATCH_14::read(bar)),
|
|
|val| val.boot_stage_3_handoff(),
|
|
Delta::ZERO,
|
|
timeout,
|
|
)
|
|
.map(|_| true)
|
|
}
|
|
}
|