hermit/drivers/
mod.rs

1//! A module containing hermit-rs driver, hermit-rs driver trait and driver specific errors.
2
3#[cfg(feature = "virtio-console")]
4pub mod console;
5#[cfg(feature = "virtio-fs")]
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(feature = "virtio")]
14pub mod virtio;
15#[cfg(feature = "virtio-vsock")]
16pub mod vsock;
17
18use alloc::collections::VecDeque;
19
20#[cfg(feature = "pci")]
21pub(crate) use pci_types::InterruptLine;
22#[cfg(not(feature = "pci"))]
23pub(crate) type InterruptLine = u8;
24
25pub(crate) type InterruptHandlerQueue = VecDeque<fn()>;
26
27/// A common error module for drivers.
28/// [DriverError](error::DriverError) values will be
29/// passed on to higher layers.
30pub mod error {
31	#[cfg(any(
32		feature = "virtio",
33		all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")),
34		feature = "rtl8139",
35	))]
36	use thiserror::Error;
37
38	#[cfg(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")))]
39	use crate::drivers::net::gem::GEMError;
40	#[cfg(feature = "rtl8139")]
41	use crate::drivers::net::rtl8139::RTL8139Error;
42	#[cfg(feature = "virtio")]
43	use crate::drivers::virtio::error::VirtioError;
44
45	#[cfg(any(
46		feature = "virtio",
47		all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")),
48		feature = "rtl8139",
49	))]
50	#[derive(Error, Debug)]
51	pub enum DriverError {
52		#[cfg(feature = "virtio")]
53		#[error("Virtio driver failed: {0:?}")]
54		InitVirtioDevFail(#[from] VirtioError),
55
56		#[cfg(feature = "rtl8139")]
57		#[error("RTL8139 driver failed: {0:?}")]
58		InitRTL8139DevFail(#[from] RTL8139Error),
59
60		#[cfg(all(target_arch = "riscv64", feature = "gem-net", not(feature = "pci")))]
61		#[error("GEM driver failed: {0:?}")]
62		InitGEMDevFail(#[from] GEMError),
63	}
64}
65
66/// A trait to determine general driver information
67#[allow(dead_code)]
68pub(crate) trait Driver {
69	/// Returns the interrupt number of the device
70	fn get_interrupt_number(&self) -> InterruptLine;
71
72	/// Returns the device driver name
73	fn get_name(&self) -> &'static str;
74}
75
76pub(crate) fn init() {
77	// Initialize PCI Drivers
78	#[cfg(feature = "pci")]
79	crate::drivers::pci::init();
80	#[cfg(all(not(feature = "pci"), target_arch = "x86_64", feature = "virtio-net"))]
81	crate::arch::x86_64::kernel::mmio::init_drivers();
82	#[cfg(all(
83		not(feature = "pci"),
84		target_arch = "aarch64",
85		any(feature = "virtio-console", feature = "virtio-net"),
86	))]
87	crate::arch::aarch64::kernel::mmio::init_drivers();
88
89	#[cfg(target_arch = "riscv64")]
90	crate::arch::riscv64::kernel::init_drivers();
91
92	crate::arch::interrupts::install_handlers();
93}