Skip to main content

rdrive/register/
mod.rs

1use alloc::vec::Vec;
2use core::ops::Deref;
3
4pub use fdt::NodeType as Node;
5
6pub use crate::probe::fdt::FdtInfo;
7use crate::probe::{acpi, fdt, pci, static_};
8
9#[repr(transparent)]
10#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
11pub struct ProbePriority(pub usize);
12
13impl ProbePriority {
14    pub const CLK: ProbePriority = ProbePriority(6);
15    pub const INTC: ProbePriority = ProbePriority(10);
16    pub const DEFAULT: ProbePriority = ProbePriority(256);
17}
18
19impl From<usize> for ProbePriority {
20    fn from(value: usize) -> Self {
21        Self(value)
22    }
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
26pub enum ProbeLevel {
27    PreKernel,
28    PostKernel,
29}
30
31impl ProbeLevel {
32    pub const fn new() -> Self {
33        Self::PostKernel
34    }
35}
36
37impl Default for ProbeLevel {
38    fn default() -> Self {
39        Self::new()
40    }
41}
42
43#[derive(Clone)]
44pub struct DriverRegister {
45    pub name: &'static str,
46    pub level: ProbeLevel,
47    pub priority: ProbePriority,
48    pub probe_kinds: &'static [ProbeKind],
49}
50
51unsafe impl Send for DriverRegister {}
52unsafe impl Sync for DriverRegister {}
53
54pub enum ProbeKind {
55    Static {
56        on_probe: static_::FnOnProbe,
57    },
58    Fdt {
59        compatibles: &'static [&'static str],
60        on_probe: fdt::FnOnProbe,
61    },
62    Acpi {
63        ids: &'static [acpi::AcpiId],
64        on_probe: acpi::FnOnProbe,
65    },
66    Pci {
67        on_probe: pci::FnOnProbe,
68    },
69}
70
71#[repr(C)]
72pub struct DriverRegisterSlice {
73    data: *const u8,
74    len: usize,
75}
76
77impl DriverRegisterSlice {
78    pub fn from_raw(data: &'static [u8]) -> Self {
79        Self {
80            data: data.as_ptr(),
81            len: data.len(),
82        }
83    }
84
85    pub fn as_slice(&self) -> &[DriverRegister] {
86        if self.len == 0 {
87            return &[];
88        }
89        unsafe {
90            core::slice::from_raw_parts(self.data as _, self.len / size_of::<DriverRegister>())
91        }
92    }
93    pub fn empty() -> Self {
94        Self {
95            data: core::ptr::null(),
96            len: 0,
97        }
98    }
99}
100
101impl Deref for DriverRegisterSlice {
102    type Target = [DriverRegister];
103
104    fn deref(&self) -> &Self::Target {
105        self.as_slice()
106    }
107}
108
109#[derive(Default)]
110pub struct RegisterContainer {
111    registers: Vec<DriverRegister>,
112}
113
114impl RegisterContainer {
115    pub const fn new() -> Self {
116        Self {
117            registers: Vec::new(),
118        }
119    }
120
121    pub fn add(&mut self, register: DriverRegister) {
122        self.registers.push(register);
123    }
124
125    pub fn append(&mut self, register: &[DriverRegister]) {
126        for one in register {
127            self.add(one.clone());
128        }
129    }
130
131    pub fn unregistered(&self) -> Vec<DriverRegister> {
132        self.registers.to_vec()
133    }
134}