1use core::{
2 ffi::FromBytesUntilNulError,
3 fmt::{Debug, Display},
4 ops::Deref,
5};
6
7pub const FDT_MAGIC: u32 = 0xd00dfeed;
8
9#[derive(Clone, Debug, Default)]
11pub struct MemoryReservation {
12 pub address: u64,
13 pub size: u64,
14}
15
16#[derive(Debug, PartialEq, Eq, Clone, Copy)]
17pub enum Token {
18 BeginNode,
19 EndNode,
20 Prop,
21 Nop,
22 End,
23 Data(u32),
24}
25
26impl From<u32> for Token {
27 fn from(value: u32) -> Self {
28 match value {
29 0x1 => Token::BeginNode,
30 0x2 => Token::EndNode,
31 0x3 => Token::Prop,
32 0x4 => Token::Nop,
33 0x9 => Token::End,
34 _ => Token::Data(value),
35 }
36 }
37}
38
39impl From<Token> for u32 {
40 fn from(value: Token) -> Self {
41 match value {
42 Token::BeginNode => 0x1,
43 Token::EndNode => 0x2,
44 Token::Prop => 0x3,
45 Token::Nop => 0x4,
46 Token::End => 0x9,
47 Token::Data(v) => v,
48 }
49 }
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
53pub enum Status {
54 Okay,
55 Disabled,
56}
57
58impl Deref for Status {
59 type Target = str;
60
61 fn deref(&self) -> &Self::Target {
62 match self {
63 Status::Okay => "okay",
64 Status::Disabled => "disabled",
65 }
66 }
67}
68
69impl core::fmt::Display for Status {
70 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
71 write!(f, "{}", self.deref())
72 }
73}
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
76#[repr(transparent)]
77pub struct Phandle(u32);
78
79impl From<u32> for Phandle {
80 fn from(value: u32) -> Self {
81 Self(value)
82 }
83}
84impl Phandle {
85 pub fn as_usize(&self) -> usize {
86 self.0 as usize
87 }
88
89 pub fn raw(&self) -> u32 {
90 self.0
91 }
92}
93
94impl Display for Phandle {
95 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
96 write!(f, "<{:#x}>", self.0)
97 }
98}
99
100#[derive(thiserror::Error, Debug, Clone)]
101pub enum FdtError {
102 #[error("not found")]
103 NotFound,
104 #[error("buffer too small at position {pos}")]
105 BufferTooSmall { pos: usize },
106 #[error("invalid magic number {0:#x} != {FDT_MAGIC:#x}")]
107 InvalidMagic(u32),
108 #[error("invalid pointer")]
109 InvalidPtr,
110 #[error("invalid input")]
111 InvalidInput,
112 #[error("data provided does not contain a nul")]
113 FromBytesUntilNull,
114 #[error("failed to parse UTF-8 string")]
115 Utf8Parse,
116 #[error("no aliase `{0}` found")]
117 NoAlias(&'static str),
118 #[error("system out of memory")]
119 NoMemory,
120 #[error("node `{0}` not found")]
121 NodeNotFound(&'static str),
122 #[error("property `{0}` not found")]
123 PropertyNotFound(&'static str),
124}
125
126impl From<core::str::Utf8Error> for FdtError {
127 fn from(_: core::str::Utf8Error) -> Self {
128 FdtError::Utf8Parse
129 }
130}
131impl From<FromBytesUntilNulError> for FdtError {
132 fn from(_: FromBytesUntilNulError) -> Self {
133 FdtError::FromBytesUntilNull
134 }
135}