1#[cfg(feature = "console")]
4pub mod console;
5#[cfg(feature = "fuse")]
6pub mod fs;
7#[cfg(not(feature = "pci"))]
8pub mod mmio;
9#[cfg(feature = "net")]
10pub mod net;
11#[cfg(feature = "pci")]
12pub mod pci;
13#[cfg(any(
14 all(
15 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
16 not(feature = "rtl8139"),
17 feature = "virtio-net",
18 ),
19 feature = "fuse",
20 feature = "vsock",
21 feature = "console",
22))]
23pub mod virtio;
24#[cfg(feature = "vsock")]
25pub mod vsock;
26
27use alloc::collections::VecDeque;
28
29#[cfg(feature = "pci")]
30pub(crate) use pci_types::InterruptLine;
31#[cfg(not(feature = "pci"))]
32pub(crate) type InterruptLine = u8;
33
34pub(crate) type InterruptHandlerQueue = VecDeque<fn()>;
35
36pub mod error {
40 #[cfg(any(
41 all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")),
42 feature = "rtl8139",
43 feature = "virtio-net",
44 feature = "fuse",
45 feature = "vsock",
46 feature = "console",
47 ))]
48 use thiserror::Error;
49
50 #[cfg(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")))]
51 use crate::drivers::net::gem::GEMError;
52 #[cfg(feature = "rtl8139")]
53 use crate::drivers::net::rtl8139::RTL8139Error;
54 #[cfg(any(
55 all(
56 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
57 not(feature = "rtl8139"),
58 feature = "virtio-net",
59 ),
60 feature = "fuse",
61 feature = "vsock",
62 feature = "console",
63 ))]
64 use crate::drivers::virtio::error::VirtioError;
65
66 #[cfg(any(
67 all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")),
68 feature = "rtl8139",
69 feature = "virtio-net",
70 feature = "fuse",
71 feature = "vsock",
72 feature = "console",
73 ))]
74 #[derive(Error, Debug)]
75 pub enum DriverError {
76 #[cfg(any(
77 all(
78 not(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci"))),
79 not(feature = "rtl8139"),
80 feature = "virtio-net",
81 ),
82 feature = "fuse",
83 feature = "vsock",
84 feature = "console",
85 ))]
86 #[error("Virtio driver failed: {0:?}")]
87 InitVirtioDevFail(#[from] VirtioError),
88
89 #[cfg(feature = "rtl8139")]
90 #[error("RTL8139 driver failed: {0:?}")]
91 InitRTL8139DevFail(#[from] RTL8139Error),
92
93 #[cfg(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")))]
94 #[error("GEM driver failed: {0:?}")]
95 InitGEMDevFail(#[from] GEMError),
96 }
97}
98
99#[allow(dead_code)]
101pub(crate) trait Driver {
102 fn get_interrupt_number(&self) -> InterruptLine;
104
105 fn get_name(&self) -> &'static str;
107}
108
109pub(crate) fn init() {
110 #[cfg(feature = "pci")]
112 crate::drivers::pci::init();
113 #[cfg(all(not(feature = "pci"), target_arch = "x86_64", feature = "virtio-net"))]
114 crate::arch::x86_64::kernel::mmio::init_drivers();
115 #[cfg(all(
116 not(feature = "pci"),
117 target_arch = "aarch64",
118 any(feature = "console", feature = "virtio-net"),
119 ))]
120 crate::arch::aarch64::kernel::mmio::init_drivers();
121
122 #[cfg(target_arch = "riscv64")]
123 crate::arch::riscv64::kernel::init_drivers();
124
125 crate::arch::interrupts::install_handlers();
126}