mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-21 16:05:29 -04:00
Falcon engines have two distinct register bases: `PFALCON` and `PFALCON2`. So far we assumed that `PFALCON2` was located at `PFALCON + 0x1000` because that is the case of most engines, but there are exceptions (NVDEC uses `0x1c00`). Fix this shortcoming by leveraging the redesigned relative registers definitions to assign a distinct `PFalcon2Base` base address to each falcon engine. Reviewed-by: Lyude Paul <lyude@redhat.com> Link: https://lore.kernel.org/r/20250718-nova-regs-v2-16-7b6a762aa1cd@nvidia.com Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
33 lines
847 B
Rust
33 lines
847 B
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
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);
|
|
}
|
|
}
|