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}