dtb_walker/property/
reg.rs1use crate::StructureBlock;
2use core::{fmt, ops::Range};
3
4#[derive(Clone)]
6pub struct Reg<'a> {
7 pub(crate) buf: &'a [StructureBlock],
8 pub(crate) cfg: RegCfg,
9}
10
11impl Iterator for Reg<'_> {
12 type Item = Range<usize>;
13
14 fn next(&mut self) -> Option<Self::Item> {
15 if self.buf.is_empty() {
16 return None;
17 }
18 let RegCfg {
19 address_cells,
20 size_cells,
21 } = self.cfg;
22 let (base_buf, tail) = self.buf.split_at(address_cells as _);
23 let (size_buf, tail) = tail.split_at(size_cells as _);
24 self.buf = tail;
25
26 let base = base_buf
27 .iter()
28 .fold(0usize, |acc, it| (acc << 32) + it.into_u32() as usize);
29 let size = size_buf
30 .iter()
31 .fold(0usize, |acc, it| (acc << 32) + it.into_u32() as usize);
32 Some(base..base + size)
33 }
34}
35
36impl fmt::Debug for Reg<'_> {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 let mut iter = self.clone();
39 write!(f, "[")?;
40 if let Some(first) = iter.next() {
41 first.fmt(f)?;
42 for s in iter {
43 write!(f, ", ")?;
44 s.fmt(f)?;
45 }
46 }
47 write!(f, "]")
48 }
49}
50
51#[derive(Clone, Copy)]
52pub(crate) struct RegCfg {
53 pub address_cells: u32,
54 pub size_cells: u32,
55}
56
57impl RegCfg {
58 pub const DEFAULT: Self = Self {
59 address_cells: 2,
60 size_cells: 1,
61 };
62
63 #[inline]
64 pub(crate) fn item_size(&self) -> usize {
65 (self.address_cells + self.size_cells) as _
66 }
67}