fdt.rs 851 B

12345678910111213141516171819202122232425262728293031
  1. use super::mm::ArchPhysAccess;
  2. use core::sync::atomic::{AtomicPtr, Ordering};
  3. use eonix_mm::address::{Addr, PAddr, PRange, PhysAccess};
  4. use eonix_sync_base::LazyLock;
  5. use fdt::Fdt;
  6. const FDT_PADDR: PAddr = PAddr::from_val(0x100000);
  7. pub static FDT: LazyLock<Fdt<'static>> = LazyLock::new(|| unsafe {
  8. Fdt::from_ptr(FDT_PADDR.addr() as *const u8).expect("Failed to parse DTB from static memory.")
  9. });
  10. pub trait FdtExt {
  11. fn harts(&self) -> impl Iterator<Item = usize>;
  12. fn hart_count(&self) -> usize {
  13. self.harts().count()
  14. }
  15. fn present_ram(&self) -> impl Iterator<Item = PRange>;
  16. }
  17. impl FdtExt for Fdt<'_> {
  18. fn harts(&self) -> impl Iterator<Item = usize> {
  19. self.cpus().map(|cpu| cpu.ids().all()).flatten()
  20. }
  21. fn present_ram(&self) -> impl Iterator<Item = PRange> {
  22. core::iter::empty()
  23. }
  24. }