rdrive/register/
mod.rs

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