hermit/drivers/
mod.rs

1//! A module containing hermit-rs driver, hermit-rs driver trait and driver specific errors.
2
3#[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
36/// A common error module for drivers.
37/// [DriverError](error::DriverError) values will be
38/// passed on to higher layers.
39pub 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/// A trait to determine general driver information
100#[allow(dead_code)]
101pub(crate) trait Driver {
102	/// Returns the interrupt number of the device
103	fn get_interrupt_number(&self) -> InterruptLine;
104
105	/// Returns the device driver name
106	fn get_name(&self) -> &'static str;
107}
108
109pub(crate) fn init() {
110	// Initialize PCI Drivers
111	#[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}