use kernel::prelude::*;
use crate::{
driver::Bar0,
falcon::{
Falcon,
FalconBromParams,
FalconEngine, },
gpu::Chipset,
};
mod ga102;
mod tu102;
pub(crate) enum LoadMethod {
Pio,
Dma,
}
pub(crate) trait FalconHal<E: FalconEngine>: Send + Sync {
fn select_core(&self, _falcon: &Falcon<E>, _bar: &Bar0) -> Result {
Ok(())
}
fn signature_reg_fuse_version(
&self,
falcon: &Falcon<E>,
bar: &Bar0,
engine_id_mask: u16,
ucode_id: u8,
) -> Result<u32>;
fn program_brom(&self, falcon: &Falcon<E>, bar: &Bar0, params: &FalconBromParams) -> Result;
fn is_riscv_active(&self, bar: &Bar0) -> bool;
fn reset_wait_mem_scrubbing(&self, bar: &Bar0) -> Result;
fn reset_eng(&self, bar: &Bar0) -> Result;
fn load_method(&self) -> LoadMethod;
}
pub(super) fn falcon_hal<E: FalconEngine + 'static>(
chipset: Chipset,
) -> Result<KBox<dyn FalconHal<E>>> {
use Chipset::*;
let hal = match chipset {
TU102 | TU104 | TU106 | TU116 | TU117 => {
KBox::new(tu102::Tu102::<E>::new(), GFP_KERNEL)? as KBox<dyn FalconHal<E>>
}
GA102 | GA103 | GA104 | GA106 | GA107 | AD102 | AD103 | AD104 | AD106 | AD107 => {
KBox::new(ga102::Ga102::<E>::new(), GFP_KERNEL)? as KBox<dyn FalconHal<E>>
}
_ => return Err(ENOTSUPP),
};
Ok(hal)
}