pci_host_ecam.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. use fdt::{node::FdtNode, Fdt};
  2. use system_error::SystemError;
  3. use crate::{
  4. driver::{
  5. open_firmware::fdt::open_firmware_fdt_driver,
  6. pci::ecam::{pci_ecam_root_info_manager, EcamRootInfo},
  7. },
  8. kdebug,
  9. mm::PhysAddr,
  10. };
  11. pub(super) fn pci_host_ecam_driver_init(fdt: &Fdt<'_>) -> Result<(), SystemError> {
  12. let do_check = |node: FdtNode| -> Result<(), SystemError> {
  13. let reg = node
  14. .reg()
  15. .ok_or(SystemError::EINVAL)?
  16. .next()
  17. .ok_or(SystemError::EINVAL)?;
  18. let paddr = reg.starting_address as usize;
  19. let size = reg.size.unwrap_or(0);
  20. let bus_range: &[u8] = node.property("bus-range").ok_or(SystemError::EINVAL)?.value;
  21. let (bus_begin, bus_end) = match bus_range.len() {
  22. 8 => (
  23. u32::from_be_bytes(bus_range[0..4].try_into().unwrap()),
  24. u32::from_be_bytes(bus_range[4..8].try_into().unwrap()),
  25. ),
  26. _ => panic!("Unexpected bus-range length"),
  27. };
  28. let segement_group_number: &[u8] = node
  29. .property("linux,pci-domain")
  30. .ok_or(SystemError::EINVAL)?
  31. .value;
  32. let segement_group_number = match segement_group_number.len() {
  33. 4 => u32::from_be_bytes(segement_group_number[0..4].try_into().unwrap()),
  34. _ => panic!("Unexpected linux,pci-domain length"),
  35. };
  36. kdebug!(
  37. "pci_host_ecam_driver_init(): {} paddr: {:#x} size: {:#x} bus-range: {}-{} segement_group_number: {}",
  38. node.name,
  39. paddr,
  40. size,
  41. bus_begin,
  42. bus_end,
  43. segement_group_number
  44. );
  45. pci_ecam_root_info_manager().add_ecam_root_info(EcamRootInfo::new(
  46. segement_group_number.try_into().unwrap(),
  47. bus_begin as u8,
  48. bus_end as u8,
  49. PhysAddr::new(paddr),
  50. ));
  51. Ok(())
  52. };
  53. for node in open_firmware_fdt_driver().find_node_by_compatible(&fdt, "pci-host-ecam-generic") {
  54. if let Err(err) = do_check(node) {
  55. kdebug!(
  56. "pci_host_ecam_driver_init(): check {} error: {:?}",
  57. node.name,
  58. err
  59. );
  60. }
  61. }
  62. return Ok(());
  63. }