Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/gpu/nova-core/falcon/hal.rs
26481 views
1
// SPDX-License-Identifier: GPL-2.0
2
3
use kernel::prelude::*;
4
5
use crate::driver::Bar0;
6
use crate::falcon::{Falcon, FalconBromParams, FalconEngine};
7
use crate::gpu::Chipset;
8
9
mod ga102;
10
11
/// Hardware Abstraction Layer for Falcon cores.
12
///
13
/// Implements chipset-specific low-level operations. The trait is generic against [`FalconEngine`]
14
/// so its `BASE` parameter can be used in order to avoid runtime bound checks when accessing
15
/// registers.
16
pub(crate) trait FalconHal<E: FalconEngine>: Sync {
17
/// Activates the Falcon core if the engine is a risvc/falcon dual engine.
18
fn select_core(&self, _falcon: &Falcon<E>, _bar: &Bar0) -> Result {
19
Ok(())
20
}
21
22
/// Returns the fused version of the signature to use in order to run a HS firmware on this
23
/// falcon instance. `engine_id_mask` and `ucode_id` are obtained from the firmware header.
24
fn signature_reg_fuse_version(
25
&self,
26
falcon: &Falcon<E>,
27
bar: &Bar0,
28
engine_id_mask: u16,
29
ucode_id: u8,
30
) -> Result<u32>;
31
32
/// Program the boot ROM registers prior to starting a secure firmware.
33
fn program_brom(&self, falcon: &Falcon<E>, bar: &Bar0, params: &FalconBromParams) -> Result;
34
}
35
36
/// Returns a boxed falcon HAL adequate for `chipset`.
37
///
38
/// We use a heap-allocated trait object instead of a statically defined one because the
39
/// generic `FalconEngine` argument makes it difficult to define all the combinations
40
/// statically.
41
pub(super) fn falcon_hal<E: FalconEngine + 'static>(
42
chipset: Chipset,
43
) -> Result<KBox<dyn FalconHal<E>>> {
44
use Chipset::*;
45
46
let hal = match chipset {
47
GA102 | GA103 | GA104 | GA106 | GA107 => {
48
KBox::new(ga102::Ga102::<E>::new(), GFP_KERNEL)? as KBox<dyn FalconHal<E>>
49
}
50
_ => return Err(ENOTSUPP),
51
};
52
53
Ok(hal)
54
}
55
56