rdrive/register/
mod.rs

1use alloc::vec::Vec;
2use core::ops::Deref;
3
4use crate::probe::fdt;
5pub use crate::probe::fdt::FdtInfo;
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}
60
61#[repr(C)]
62pub struct DriverRegisterSlice {
63    data: *const u8,
64    len: usize,
65}
66
67impl DriverRegisterSlice {
68    pub fn from_raw(data: &'static [u8]) -> Self {
69        Self {
70            data: data.as_ptr(),
71            len: data.len(),
72        }
73    }
74
75    pub fn as_slice(&self) -> &[DriverRegister] {
76        if self.len == 0 {
77            return &[];
78        }
79        unsafe {
80            core::slice::from_raw_parts(self.data as _, self.len / size_of::<DriverRegister>())
81        }
82    }
83    pub fn empty() -> Self {
84        Self {
85            data: core::ptr::null(),
86            len: 0,
87        }
88    }
89}
90
91impl Deref for DriverRegisterSlice {
92    type Target = [DriverRegister];
93
94    fn deref(&self) -> &Self::Target {
95        self.as_slice()
96    }
97}
98
99#[derive(Default)]
100pub struct RegisterContainer {
101    registers: Vec<DriverRegister>,
102}
103
104impl RegisterContainer {
105    pub const fn new() -> Self {
106        Self {
107            registers: Vec::new(),
108        }
109    }
110
111    pub fn add(&mut self, register: DriverRegister) {
112        self.registers.push(register);
113    }
114
115    pub fn append(&mut self, register: &[DriverRegister]) {
116        for one in register {
117            self.add(one.clone());
118        }
119    }
120
121    pub fn unregistered(&self) -> Vec<DriverRegister> {
122        self.registers.to_vec()
123    }
124}