1 use log::{error, warn}; 2 3 use crate::mm::PhysAddr; 4 5 use super::{ 6 pci::{PciCam, SegmentGroupNumber}, 7 root::{pci_root_manager, PciRoot}, 8 }; 9 10 #[inline(always)] 11 pub fn pci_ecam_root_info_manager() -> &'static EcamRootInfoManager { 12 &EcamRootInfoManager 13 } 14 15 /// Ecam pci root info 16 #[derive(Clone, Copy)] 17 pub struct EcamRootInfo { 18 pub segement_group_number: SegmentGroupNumber, 19 pub bus_begin: u8, 20 pub bus_end: u8, 21 pub physical_address_base: PhysAddr, 22 } 23 24 impl EcamRootInfo { 25 pub fn new( 26 segement_group_number: SegmentGroupNumber, 27 bus_begin: u8, 28 bus_end: u8, 29 physical_address_base: PhysAddr, 30 ) -> Self { 31 Self { 32 segement_group_number, 33 bus_begin, 34 bus_end, 35 physical_address_base, 36 } 37 } 38 } 39 40 pub struct EcamRootInfoManager; 41 42 impl EcamRootInfoManager { 43 /// # add_ecam_root_info - 向EcamRootInfoManager添加EcamRootInfo 44 /// 45 /// 将一个新的EcamRootInfo添加到EcamRootInfoManager中。 46 /// 47 /// ## 参数 48 /// 49 /// - `ecam_root_info`: EcamRootInfo - 要添加的EcamRootInfo实例 50 pub fn add_ecam_root_info(&self, ecam_root_info: EcamRootInfo) { 51 if !pci_root_manager().has_root(ecam_root_info.segement_group_number) { 52 let root = PciRoot::new( 53 ecam_root_info.segement_group_number, 54 PciCam::Ecam, 55 ecam_root_info.physical_address_base, 56 ecam_root_info.bus_begin, 57 ecam_root_info.bus_end, 58 ); 59 60 if let Err(err) = root { 61 error!("add_ecam_root_info(): failed to create PciRoot: {:?}", err); 62 return; 63 } 64 65 pci_root_manager().add_pci_root(root.unwrap()); 66 } else { 67 warn!( 68 "add_ecam_root_info(): root {} already exists", 69 ecam_root_info.segement_group_number 70 ); 71 } 72 } 73 } 74