//! 系统 BSP 定义
//!
//! 由板级 BSP 信息导出，是系统运行的配置信息

use core::fmt;

pub use moa_bsp_define::*;
use moa_bsp_define::{
    clocksource::{SetNextEventFunc, SetStateStoppedFunc},
    irqchip::{IrqType, IrqchipIrqState, Result},
    memrange::MemDefine,
    smp::SmpDefine,
};
use moa_cpumask::Cpumask;

unsafe extern "Rust" {
    /// 系统启动早期调用，不能使用串口内存分配等功能
    pub fn __early_init();
    /// 系统启动后期调用，可以使用内核大部分功能，需要在这里完成 APP 加载
    pub fn __late_init();
    /// 系统从核启动调用
    pub fn __secondary_init();

    /// 多核信息定义
    pub fn __smp_define() -> &'static SmpDefine;
    /// 内存域信息定义
    pub fn __mems_define() -> &'static MemDefine;

    /// 控制台初始化
    pub fn __console_init();
    /// 控制台输出
    pub fn __console_output(args: fmt::Arguments<'_>);

    /// 中断控制器名字
    pub fn __irqchip_name() -> &'static str;
    /// 中断控制器支持的最大中断数量
    pub fn __irqchip_irqs_max() -> usize;
    /// 中断控制器应答中断
    pub fn __irqchip_irq_ack(hwirq: u32);
    /// 中断控制器结束中断
    pub fn __irqchip_irq_eoi(hwirq: u32);
    /// 中断控制器禁用一个中断
    pub fn __irqchip_irq_disable(hwirq: u32);
    /// 中断控制器激活一个中断
    pub fn __irqchip_irq_enable(hwirq: u32);
    /// 中断控制器设置中断亲和性
    pub fn __irqchip_irq_set_affinity(hwirq: u32, cpumask: &Cpumask) -> Result<()>;
    /// 中断控制器设置中断类型
    pub fn __irqchip_irq_set_type(hwirq: u32, irq_type: IrqType) -> Result<()>;
    /// 中断控制器获取控制器状态
    pub fn __irqchip_irq_get_irqchip_state(hwirq: u32, which: IrqchipIrqState) -> Result<bool>;
    /// 中断控制器设置控制器状态
    pub fn __irqchip_irq_set_irqchip_state(
        hwirq: u32,
        which: IrqchipIrqState,
        state: bool,
    ) -> Result<()>;
    /// 中断控制器向一个处理器发送 IPI 中断
    pub fn __irqchip_ipi_send_single(hwirq: u32, cpu: usize);
    /// 中断控制器向一组处理器发送 IPI 中断
    pub fn __irqchip_ipi_send_mask(hwirq: u32, cpumask: &Cpumask);
    /// 中断控制器硬中断处理函数入口
    pub fn __irqchip_irq_handler();
    /// 中断控制器初始化
    pub fn __irqchip_irq_init();
    /// 中断控制器处理器接口初始化
    pub fn __irqchip_irq_init_cpu();

    /// 时钟系统初始化
    pub fn __clock_init();
    /// 时钟系统初始化处理器
    pub fn __clock_init_cpu();
    /// 获取设置下一个时钟事件回调
    pub fn __clock_get_set_next_event() -> SetNextEventFunc;
    /// 获取停止当前时钟事件回调
    pub fn __clock_get_set_state_stopped() -> SetStateStoppedFunc;
    /// 时钟事件源频率
    pub fn __clock_rate() -> usize;
    /// 时钟事件源最小 tick
    pub fn __clock_min_delta() -> u64;
    /// 时钟事件源最大 tick
    pub fn __clock_max_delta() -> u64;
}
