mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-08-09 06:14:34 +02:00
Currently Nova code uses `&'a Bar0` a lot. This is `&'a Mmio`, where `Mmio` represents an owned MMIO region; this type only exists as a target for `Deref` so `Bar` and `IoMem` can share code and should be avoided to be named directly. The upcoming I/O projection series would make `Io` trait much simpler to implement, and thus the owned MMIO type would be removed in favour of direct `Io` implementation on `Bar` and `IoMem`. Add lifetime parameter to `Bar0<'a>` and change it to be alias of `&'a pci::Bar<'a, ..>`. This also prepares Nova core so that when I/O projection series land, this could be changed to using a MMIO view type directly which avoids double indirection. Signed-off-by: Gary Guo <gary@garyguo.net> Acked-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> Link: https://patch.msgid.link/20260602170416.2268531-1-gary@kernel.org [ Rebase onto latest drm-rust-next (Blackwell enablement). - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
80 lines
2.2 KiB
Rust
80 lines
2.2 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
use kernel::{
|
|
io::{
|
|
poll::read_poll_timeout,
|
|
register::{
|
|
RegisterBase,
|
|
WithBase, //
|
|
},
|
|
Io,
|
|
},
|
|
prelude::*,
|
|
time::Delta, //
|
|
};
|
|
|
|
use crate::{
|
|
driver::Bar0,
|
|
falcon::{
|
|
Falcon,
|
|
FalconEngine,
|
|
PFalcon2Base,
|
|
PFalconBase, //
|
|
},
|
|
regs,
|
|
};
|
|
|
|
/// Pattern returned by GSP register reads while the PRIV target mask still blocks CPU access.
|
|
const GSP_TARGET_MASK_LOCKED_PATTERN: u32 = 0xbadf_4100;
|
|
const GSP_TARGET_MASK_LOCKED_MASK: u32 = 0xffff_ff00;
|
|
|
|
/// 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 {}
|
|
|
|
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<'_>) {
|
|
bar.write(
|
|
WithBase::of::<Gsp>(),
|
|
regs::NV_PFALCON_FALCON_IRQSCLR::zeroed().with_swgen0(true),
|
|
);
|
|
}
|
|
|
|
/// 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(bar.read(regs::NV_PGC6_BSI_SECURE_SCRATCH_14)),
|
|
|val| val.boot_stage_3_handoff(),
|
|
Delta::ZERO,
|
|
timeout,
|
|
)
|
|
.map(|_| true)
|
|
}
|
|
|
|
/// Returns whether the RISC-V branch privilege lockdown bit is set.
|
|
pub(crate) fn riscv_branch_privilege_lockdown(&self, bar: Bar0<'_>) -> bool {
|
|
bar.read(regs::NV_PFALCON_FALCON_HWCFG2::of::<Gsp>())
|
|
.riscv_br_priv_lockdown()
|
|
}
|
|
|
|
/// Returns whether GSP registers can be read by the CPU.
|
|
pub(crate) fn priv_target_mask_released(&self, bar: Bar0<'_>) -> bool {
|
|
let hwcfg2 = bar
|
|
.read(regs::NV_PFALCON_FALCON_HWCFG2::of::<Gsp>())
|
|
.into_raw();
|
|
|
|
hwcfg2 != 0 && (hwcfg2 & GSP_TARGET_MASK_LOCKED_MASK) != GSP_TARGET_MASK_LOCKED_PATTERN
|
|
}
|
|
}
|