xref: /DragonOS/kernel/src/arch/mod.rs (revision 406099704eb939ae23b18f0cfb3ed36c534c1c84)
1 use crate::{
2     driver::pci::pci::{BusDeviceFunction, PciAddr, PciError, PciRoot, SegmentGroupNumber},
3     mm::PhysAddr,
4 };
5 
6 #[cfg(target_arch = "x86_64")]
7 pub mod x86_64;
8 #[cfg(target_arch = "x86_64")]
9 pub use self::x86_64::*; // 公开x86_64架构下的函数,使外界接口统一
10 
11 #[cfg(target_arch = "riscv64")]
12 pub mod riscv64;
13 #[cfg(target_arch = "riscv64")]
14 pub use self::riscv64::*; // 公开riscv64架构下的函数,使外界接口统一
15 
16 pub mod io;
17 
18 /// TraitPciArch Pci架构相关函数,任何架构都应独立实现trait里的函数
19 pub trait TraitPciArch {
20     /// @brief 读取寄存器值,x86_64架构通过读取两个特定io端口实现
21     /// @param bus_device_function 设备的唯一标识符
22     /// @param offset 寄存器偏移值
23     /// @return 读取到的值
24     fn read_config(bus_device_function: &BusDeviceFunction, offset: u8) -> u32;
25     /// @brief 写入寄存器值,x86_64架构通过读取两个特定io端口实现
26     /// @param bus_device_function 设备的唯一标识符
27     /// @param offset 寄存器偏移值
28     /// @param data 要写入的值
29     fn write_config(bus_device_function: &BusDeviceFunction, offset: u8, data: u32);
30     /// @brief PCI域地址到存储器域地址的转换,x86_64架构为一一对应
31     /// @param address PCI域地址
32     /// @return usize 转换结果
33     fn address_pci_to_physical(pci_address: PciAddr) -> PhysAddr;
34     /// @brief 获取Segement的root地址,x86_64架构为acpi mcfg表中读取
35     /// @param segement 组id
36     /// @return  Result<PciRoot, PciError> 转换结果或出错原因
37     fn ecam_root(segement: SegmentGroupNumber) -> Result<PciRoot, PciError>;
38 }
39