xref: /DragonOS/kernel/src/driver/acpi/bus.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
191e9d4abSLoGin use crate::driver::base::{
27eda31b2SLoGin     device::{
37eda31b2SLoGin         bus::{bus_manager, Bus},
47eda31b2SLoGin         driver::Driver,
57eda31b2SLoGin         Device,
67eda31b2SLoGin     },
77eda31b2SLoGin     subsys::SubSysPrivate,
8a03c4f9dSLoGin };
991e9d4abSLoGin use alloc::{
1091e9d4abSLoGin     string::{String, ToString},
1191e9d4abSLoGin     sync::Arc,
1291e9d4abSLoGin };
1391e9d4abSLoGin use system_error::SystemError;
14a03c4f9dSLoGin 
15a03c4f9dSLoGin use super::AcpiManager;
16a03c4f9dSLoGin 
17a03c4f9dSLoGin impl AcpiManager {
18a03c4f9dSLoGin     /// 通过acpi来匹配驱动
19a03c4f9dSLoGin     ///
20e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#949
driver_match_device( &self, _driver: &Arc<dyn Driver>, _device: &Arc<dyn Device>, ) -> Result<bool, SystemError>21a03c4f9dSLoGin     pub fn driver_match_device(
22a03c4f9dSLoGin         &self,
23a03c4f9dSLoGin         _driver: &Arc<dyn Driver>,
24a03c4f9dSLoGin         _device: &Arc<dyn Device>,
25a03c4f9dSLoGin     ) -> Result<bool, SystemError> {
26a03c4f9dSLoGin         // todo:
27a03c4f9dSLoGin 
28a03c4f9dSLoGin         return Ok(false);
29a03c4f9dSLoGin     }
307eda31b2SLoGin 
31e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1286
bus_init(&self) -> Result<(), SystemError>327eda31b2SLoGin     pub(super) fn bus_init(&self) -> Result<(), SystemError> {
337eda31b2SLoGin         self.acpi_sysfs_init()?;
347eda31b2SLoGin 
357eda31b2SLoGin         let acpi_bus = AcpiBus::new();
367eda31b2SLoGin         bus_manager()
377eda31b2SLoGin             .register(acpi_bus as Arc<dyn Bus>)
387eda31b2SLoGin             .expect("acpi_bus register failed");
397eda31b2SLoGin         return Ok(());
40a03c4f9dSLoGin     }
417eda31b2SLoGin }
427eda31b2SLoGin 
437eda31b2SLoGin /// ACPI总线
447eda31b2SLoGin ///
45e7071df6SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1072
467eda31b2SLoGin #[derive(Debug)]
477eda31b2SLoGin pub(super) struct AcpiBus {
487eda31b2SLoGin     private: SubSysPrivate,
497eda31b2SLoGin }
507eda31b2SLoGin 
517eda31b2SLoGin impl AcpiBus {
new() -> Arc<Self>527eda31b2SLoGin     pub fn new() -> Arc<Self> {
537eda31b2SLoGin         let bus = Arc::new(Self {
5408a2ee40SLoGin             private: SubSysPrivate::new("acpi".to_string(), None, None, &[]),
557eda31b2SLoGin         });
567eda31b2SLoGin         bus.subsystem()
5708a2ee40SLoGin             .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc<dyn Bus>))));
587eda31b2SLoGin         return bus;
597eda31b2SLoGin     }
607eda31b2SLoGin }
617eda31b2SLoGin 
627eda31b2SLoGin impl Bus for AcpiBus {
name(&self) -> String637eda31b2SLoGin     fn name(&self) -> String {
647eda31b2SLoGin         return self.private.subsys().as_kobject().name();
657eda31b2SLoGin     }
667eda31b2SLoGin 
dev_name(&self) -> String677eda31b2SLoGin     fn dev_name(&self) -> String {
687eda31b2SLoGin         self.name()
697eda31b2SLoGin     }
707eda31b2SLoGin 
71e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1056
remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>727eda31b2SLoGin     fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
737eda31b2SLoGin         todo!("acpi_bus: remove")
747eda31b2SLoGin     }
757eda31b2SLoGin 
shutdown(&self, _device: &Arc<dyn Device>)767eda31b2SLoGin     fn shutdown(&self, _device: &Arc<dyn Device>) {
777eda31b2SLoGin         return;
787eda31b2SLoGin     }
797eda31b2SLoGin 
resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>807eda31b2SLoGin     fn resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
817eda31b2SLoGin         return Ok(());
827eda31b2SLoGin     }
837eda31b2SLoGin 
847eda31b2SLoGin     /// 通过acpi来匹配驱动
857eda31b2SLoGin     ///
86e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1005
match_device( &self, _device: &Arc<dyn Device>, _driver: &Arc<dyn Driver>, ) -> Result<bool, SystemError>877eda31b2SLoGin     fn match_device(
887eda31b2SLoGin         &self,
897eda31b2SLoGin         _device: &Arc<dyn Device>,
907eda31b2SLoGin         _driver: &Arc<dyn Driver>,
917eda31b2SLoGin     ) -> Result<bool, SystemError> {
927eda31b2SLoGin         // todo: 通过acpi来匹配驱动
937eda31b2SLoGin         return Ok(false);
947eda31b2SLoGin     }
957eda31b2SLoGin 
96e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1019
probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>977eda31b2SLoGin     fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
987eda31b2SLoGin         todo!("acpi_bus: probe")
997eda31b2SLoGin     }
1007eda31b2SLoGin 
subsystem(&self) -> &SubSysPrivate1017eda31b2SLoGin     fn subsystem(&self) -> &SubSysPrivate {
1027eda31b2SLoGin         return &self.private;
1037eda31b2SLoGin     }
1047eda31b2SLoGin }
1057eda31b2SLoGin 
1067eda31b2SLoGin /// Acpi设备应当实现的trait
1077eda31b2SLoGin ///
1087eda31b2SLoGin /// 所有的实现了 AcpiDevice trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDevice)]
1097eda31b2SLoGin ///
1107eda31b2SLoGin /// todo: 仿照linux的acpi_device去设计这个trait
1117eda31b2SLoGin ///
1127eda31b2SLoGin ///
113e7071df6SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#364
114*bd70d2d1SLoGin #[allow(unused)]
1157eda31b2SLoGin pub trait AcpiDevice: Device {}
1167eda31b2SLoGin 
1177eda31b2SLoGin /// Acpi驱动应当实现的trait
1187eda31b2SLoGin ///
1197eda31b2SLoGin /// 所有的实现了 AcpiDriver trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDriver)]
1207eda31b2SLoGin ///
1217eda31b2SLoGin /// todo: 仿照linux的acpi_driver去设计这个trait
1227eda31b2SLoGin ///
123e7071df6SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#163
124*bd70d2d1SLoGin #[allow(unused)]
1257eda31b2SLoGin pub trait AcpiDriver: Driver {}
126