xref: /DragonOS/kernel/src/driver/pci/ecam.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
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