// 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 for Gsp { const BASE: usize = 0x00110000; } impl RegisterBase for Gsp { const BASE: usize = 0x00111000; } impl FalconEngine for Gsp { const ID: Self = Gsp(()); } impl Falcon { /// 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 { read_poll_timeout( || Ok(regs::NV_PGC6_BSI_SECURE_SCRATCH_14::read(bar)), |val| val.boot_stage_3_handoff(), Delta::ZERO, timeout, ) .map(|_| true) } }