| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // 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)
- }
- }
|