1#![allow(unused_imports)]
9
10use bitflags::bitflags;
11use zerocopy::{FromBytes, IntoBytes};
12
13#[repr(u32)]
15#[derive(Clone, Copy, Debug, Eq, IntoBytes, PartialEq)]
16pub enum KernelDriver {
17 ArmPsci = 0x49435350,
19
20 ArmGicV2 = 0x32434947,
22
23 ArmGicV3 = 0x33434947,
25
26 ArmGenericTimer = 0x4d495441,
28
29 ArmGenericTimerMmio = 0x4d4d5441,
31
32 Pl011Uart = 0x55304c50,
34
35 AmlogicUart = 0x554c4d41,
37
38 AmlogicHdcp = 0x484c4d41,
40
41 Dw8250Uart = 0x44573855,
43
44 AmlogicRngV1 = 0x484c4d52,
46
47 AmlogicRngV2 = 0x524c4d41,
49
50 Generic32Watchdog = 0x32334457,
52
53 GeniUart = 0x494E4547,
55
56 I8250PioUart = 0x30353238,
58
59 I8250Mmio32Uart = 0x4d353238,
61
62 I8250Mmio8Uart = 0x42353238,
64
65 MotmotPower = 0x4d4d5450,
67
68 As370Power = 0x50303733,
70
71 MoonflowerPower = 0x4d4e4650,
73
74 ImxUart = 0x55584d49,
76
77 RiscvPlic = 0x43494C50,
79
80 RiscvGenericTimer = 0x4D495452,
82
83 PxaUart = 0x50584155,
85
86 ExynosUsiUart = 0x45585955,
88}
89
90#[repr(C)]
94#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
95pub struct DcfgSimple {
96 pub mmio_phys: u64,
97 pub irq: u32,
98 pub flags: u32,
99}
100
101#[repr(C)]
102#[derive(IntoBytes, FromBytes, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
103pub struct KernelDriverIrqFlags(u32);
104
105bitflags! {
106 impl KernelDriverIrqFlags : u32 {
107
108 const EDGE_TRIGGERED = 1 << 0;
111 const LEVEL_TRIGGERED = 1 << 1;
112
113 const POLARITY_LOW = 1 << 2;
117
118 const POLARITY_HIGH = 1 << 3;
122 }
123}
124
125#[repr(C)]
127#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
128pub struct DcfgSimplePio {
129 pub base: u16,
130 pub reserved: u16,
131 pub irq: u32,
132}
133
134#[repr(C)]
136#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
137pub struct DcfgArmPsciDriver {
138 pub use_hvc: u8,
139 pub reserved: [u8; 7],
140 pub shutdown_args: [u64; 3],
141 pub reboot_args: [u64; 3],
142 pub reboot_bootloader_args: [u64; 3],
143 pub reboot_recovery_args: [u64; 3],
144}
145
146#[repr(C)]
148#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
149pub struct DcfgArmGicV2Driver {
150 pub mmio_phys: u64,
151 pub msi_frame_phys: u64,
152 pub gicd_offset: u64,
153 pub gicc_offset: u64,
154 pub gich_offset: u64,
155 pub gicv_offset: u64,
156 pub ipi_base: u32,
157 pub optional: u8,
158 pub use_msi: u8,
159 pub reserved: u16,
160}
161
162#[repr(C)]
164#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
165pub struct DcfgArmGicV3Driver {
166 pub mmio_phys: u64,
167 pub gicd_offset: u64,
168 pub gicr_offset: u64,
169 pub gicr_stride: u64,
170 pub reserved0: u64,
171 pub ipi_base: u32,
172 pub optional: u8,
173 pub reserved1: [u8; 3],
174}
175
176#[repr(C)]
178#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
179pub struct DcfgArmGenericTimerDriver {
180 pub irq_phys: u32,
181 pub irq_virt: u32,
182 pub irq_sphys: u32,
183 pub freq_override: u32,
184}
185
186#[repr(C)]
188#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
189pub struct DcfgArmGenericTimerMmioDriver {
190 pub base_addr: u64,
192
193 pub frequency: u32,
195
196 pub active_frames_mask: u8,
198 pub reserved0: [u8; 3],
199
200 pub frames: [DcfgSimple; 8],
203}
204
205#[repr(C)]
207#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
208pub struct DcfgAmlogicHdcpDriver {
209 pub preset_phys: u64,
210 pub hiu_phys: u64,
211 pub hdmitx_phys: u64,
212}
213
214#[repr(C)]
217#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
218pub struct DcfgAmlogicRngDriver {
219 pub rng_data_phys: u64,
220 pub rng_status_phys: u64,
221 pub rng_refresh_interval_usec: u64,
222}
223
224#[repr(C)]
232#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
233pub struct DcfgGeneric32WatchdogAction {
234 pub addr: u64,
235 pub clr_mask: u32,
236 pub set_mask: u32,
237}
238
239#[repr(C)]
240#[derive(IntoBytes, FromBytes, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
241pub struct KernelDriverGeneric32WatchdogFlags(u32);
242
243bitflags! {
244 impl KernelDriverGeneric32WatchdogFlags : u32 {
245 const ENABLED = 1 << 0;
246 }
247}
248
249pub const KERNEL_DRIVER_GENERIC32_WATCHDOG_MIN_PERIOD: i64 = 1000000;
251
252#[repr(C)]
256#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
257pub struct DcfgGeneric32Watchdog {
258 pub pet_action: DcfgGeneric32WatchdogAction,
260
261 pub enable_action: DcfgGeneric32WatchdogAction,
264
265 pub disable_action: DcfgGeneric32WatchdogAction,
269
270 pub watchdog_period_nsec: i64,
275
276 pub flags: KernelDriverGeneric32WatchdogFlags,
280 pub reserved: u32,
281}
282
283#[repr(C)]
285#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
286pub struct DcfgRiscvPlicDriver {
287 pub mmio_phys: u64,
288 pub num_irqs: u32,
289 pub reserved: u32,
290}
291
292#[repr(C)]
294#[derive(Clone, Copy, Debug, Eq, FromBytes, IntoBytes, PartialEq)]
295pub struct DcfgRiscvGenericTimerDriver {
296 pub freq_hz: u32,
297 pub reserved: u32,
298}