#![no_std]
use core::{ptr::NonNull, time::Duration};
pub use ax_errno::{AxError, AxResult};
pub use ax_memory_addr::{PhysAddr, VirtAddr};
pub use irq_framework::{
AutoEnable as IrqAutoEnable, BoxedIrqHandler, CpuId as IrqCpuId, CpuMask as IrqCpuMask,
IrqAffinity, IrqContext, IrqError, IrqExecution, IrqHandle, IrqNumber, IrqOutcome, IrqRequest,
IrqReturn, IrqScope, IrqStatus, RawIrqHandler, ShareMode as IrqShareMode,
};
use trait_ffi::*;
pub mod dma;
pub mod mmio;
#[def_extern_trait]
pub trait Klib {
fn mem_iomap(addr: PhysAddr, size: usize) -> AxResult<VirtAddr>;
fn mem_virt_to_phys(addr: VirtAddr) -> PhysAddr;
fn mem_make_dma_coherent_uncached(addr: VirtAddr, size: usize) -> AxResult;
fn mem_restore_dma_cached(addr: VirtAddr, size: usize) -> AxResult;
fn dma_alloc_pages(dma_mask: u64, num_pages: usize, align: usize) -> AxResult<VirtAddr>;
fn dma_dealloc_pages(addr: VirtAddr, num_pages: usize);
fn time_busy_wait(dur: Duration);
fn time_monotonic_nanos() -> u64;
fn time_try_init_epoch_offset(epoch_time_nanos: u64) -> bool;
fn irq_set_enable(irq: usize, enabled: bool);
fn irq_request_shared(
irq: usize,
handler: RawIrqHandler,
data: NonNull<()>,
) -> AxResult<IrqHandle>;
fn irq_request_percpu(
irq: usize,
cpus: IrqCpuMask,
handler: RawIrqHandler,
data: NonNull<()>,
) -> AxResult<IrqHandle>;
fn irq_free(handle: IrqHandle) -> AxResult;
fn irq_enable(handle: IrqHandle) -> AxResult;
fn irq_disable(handle: IrqHandle) -> AxResult;
unsafe fn irq_run_on_cpu_sync(
cpu: IrqCpuId,
f: unsafe fn(*mut ()),
arg: *mut (),
) -> Result<(), IrqError> {
if cpu.0 == 0 {
unsafe { f(arg) };
Ok(())
} else {
Err(IrqError::Unsupported)
}
}
}
pub mod mem {
pub use super::klib::{
mem_iomap as iomap, mem_make_dma_coherent_uncached as make_dma_coherent_uncached,
mem_restore_dma_cached as restore_dma_cached, mem_virt_to_phys as virt_to_phys,
};
}
pub mod time {
pub use super::klib::{
time_busy_wait as busy_wait, time_monotonic_nanos as monotonic_nanos,
time_try_init_epoch_offset as try_init_epoch_offset,
};
}
pub mod irq {
pub use super::{
BoxedIrqHandler, IrqAffinity, IrqAutoEnable as AutoEnable, IrqContext, IrqCpuId as CpuId,
IrqCpuMask as CpuMask, IrqError, IrqExecution, IrqHandle, IrqNumber, IrqOutcome,
IrqRequest, IrqReturn, IrqScope, IrqShareMode as ShareMode, IrqStatus, RawIrqHandler,
klib::{
irq_disable as disable, irq_enable as enable, irq_free as free,
irq_request_percpu as request_percpu, irq_request_shared as request_shared,
irq_run_on_cpu_sync as run_on_cpu_sync, irq_set_enable as set_enable,
},
};
}