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}