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}