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