xref: /DragonOS/kernel/src/driver/acpi/bus.rs (revision 7eda31b2f07c6ef41dc0d2bd13051f0fce5e5976)
1*7eda31b2SLoGin use alloc::{
2*7eda31b2SLoGin     string::{String, ToString},
3*7eda31b2SLoGin     sync::{Arc, Weak},
4*7eda31b2SLoGin };
5a03c4f9dSLoGin 
6a03c4f9dSLoGin use crate::{
7*7eda31b2SLoGin     driver::base::{
8*7eda31b2SLoGin         device::{
9*7eda31b2SLoGin             bus::{bus_manager, Bus},
10*7eda31b2SLoGin             driver::Driver,
11*7eda31b2SLoGin             Device,
12*7eda31b2SLoGin         },
13*7eda31b2SLoGin         subsys::SubSysPrivate,
14*7eda31b2SLoGin     },
15a03c4f9dSLoGin     syscall::SystemError,
16a03c4f9dSLoGin };
17a03c4f9dSLoGin 
18a03c4f9dSLoGin use super::AcpiManager;
19a03c4f9dSLoGin 
20a03c4f9dSLoGin impl AcpiManager {
21a03c4f9dSLoGin     /// 通过acpi来匹配驱动
22a03c4f9dSLoGin     ///
23a03c4f9dSLoGin     /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#949
24a03c4f9dSLoGin     pub fn driver_match_device(
25a03c4f9dSLoGin         &self,
26a03c4f9dSLoGin         _driver: &Arc<dyn Driver>,
27a03c4f9dSLoGin         _device: &Arc<dyn Device>,
28a03c4f9dSLoGin     ) -> Result<bool, SystemError> {
29a03c4f9dSLoGin         // todo:
30a03c4f9dSLoGin 
31a03c4f9dSLoGin         return Ok(false);
32a03c4f9dSLoGin     }
33*7eda31b2SLoGin 
34*7eda31b2SLoGin     /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1286
35*7eda31b2SLoGin     pub(super) fn bus_init(&self) -> Result<(), SystemError> {
36*7eda31b2SLoGin         self.acpi_sysfs_init()?;
37*7eda31b2SLoGin 
38*7eda31b2SLoGin         let acpi_bus = AcpiBus::new();
39*7eda31b2SLoGin         bus_manager()
40*7eda31b2SLoGin             .register(acpi_bus as Arc<dyn Bus>)
41*7eda31b2SLoGin             .expect("acpi_bus register failed");
42*7eda31b2SLoGin         return Ok(());
43a03c4f9dSLoGin     }
44*7eda31b2SLoGin }
45*7eda31b2SLoGin 
46*7eda31b2SLoGin /// ACPI总线
47*7eda31b2SLoGin ///
48*7eda31b2SLoGin /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1072
49*7eda31b2SLoGin #[derive(Debug)]
50*7eda31b2SLoGin pub(super) struct AcpiBus {
51*7eda31b2SLoGin     private: SubSysPrivate,
52*7eda31b2SLoGin }
53*7eda31b2SLoGin 
54*7eda31b2SLoGin impl AcpiBus {
55*7eda31b2SLoGin     pub fn new() -> Arc<Self> {
56*7eda31b2SLoGin         let default_weak: Weak<Self> = Weak::new();
57*7eda31b2SLoGin         let bus = Arc::new(Self {
58*7eda31b2SLoGin             private: SubSysPrivate::new("acpi".to_string(), default_weak, &[]),
59*7eda31b2SLoGin         });
60*7eda31b2SLoGin         bus.subsystem()
61*7eda31b2SLoGin             .set_bus(Arc::downgrade(&(bus.clone() as Arc<dyn Bus>)));
62*7eda31b2SLoGin         return bus;
63*7eda31b2SLoGin     }
64*7eda31b2SLoGin }
65*7eda31b2SLoGin 
66*7eda31b2SLoGin impl Bus for AcpiBus {
67*7eda31b2SLoGin     fn name(&self) -> String {
68*7eda31b2SLoGin         return self.private.subsys().as_kobject().name();
69*7eda31b2SLoGin     }
70*7eda31b2SLoGin 
71*7eda31b2SLoGin     fn dev_name(&self) -> String {
72*7eda31b2SLoGin         self.name()
73*7eda31b2SLoGin     }
74*7eda31b2SLoGin 
75*7eda31b2SLoGin     /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1056
76*7eda31b2SLoGin     fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
77*7eda31b2SLoGin         todo!("acpi_bus: remove")
78*7eda31b2SLoGin     }
79*7eda31b2SLoGin 
80*7eda31b2SLoGin     fn shutdown(&self, _device: &Arc<dyn Device>) {
81*7eda31b2SLoGin         return;
82*7eda31b2SLoGin     }
83*7eda31b2SLoGin 
84*7eda31b2SLoGin     fn resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
85*7eda31b2SLoGin         return Ok(());
86*7eda31b2SLoGin     }
87*7eda31b2SLoGin 
88*7eda31b2SLoGin     /// 通过acpi来匹配驱动
89*7eda31b2SLoGin     ///
90*7eda31b2SLoGin     /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1005
91*7eda31b2SLoGin     fn match_device(
92*7eda31b2SLoGin         &self,
93*7eda31b2SLoGin         _device: &Arc<dyn Device>,
94*7eda31b2SLoGin         _driver: &Arc<dyn Driver>,
95*7eda31b2SLoGin     ) -> Result<bool, SystemError> {
96*7eda31b2SLoGin         // todo: 通过acpi来匹配驱动
97*7eda31b2SLoGin         return Ok(false);
98*7eda31b2SLoGin     }
99*7eda31b2SLoGin 
100*7eda31b2SLoGin     /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1019
101*7eda31b2SLoGin     fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
102*7eda31b2SLoGin         todo!("acpi_bus: probe")
103*7eda31b2SLoGin     }
104*7eda31b2SLoGin 
105*7eda31b2SLoGin     fn subsystem(&self) -> &SubSysPrivate {
106*7eda31b2SLoGin         return &self.private;
107*7eda31b2SLoGin     }
108*7eda31b2SLoGin }
109*7eda31b2SLoGin 
110*7eda31b2SLoGin /// Acpi设备应当实现的trait
111*7eda31b2SLoGin ///
112*7eda31b2SLoGin /// 所有的实现了 AcpiDevice trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDevice)]
113*7eda31b2SLoGin ///
114*7eda31b2SLoGin /// todo: 仿照linux的acpi_device去设计这个trait
115*7eda31b2SLoGin ///
116*7eda31b2SLoGin ///
117*7eda31b2SLoGin /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#364
118*7eda31b2SLoGin pub trait AcpiDevice: Device {}
119*7eda31b2SLoGin 
120*7eda31b2SLoGin /// Acpi驱动应当实现的trait
121*7eda31b2SLoGin ///
122*7eda31b2SLoGin /// 所有的实现了 AcpiDriver trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDriver)]
123*7eda31b2SLoGin ///
124*7eda31b2SLoGin /// todo: 仿照linux的acpi_driver去设计这个trait
125*7eda31b2SLoGin ///
126*7eda31b2SLoGin /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#163
127*7eda31b2SLoGin pub trait AcpiDriver: Driver {}
128